1. 程式人生 > 其它 >LightningChart .NET v.10.2.1已經發布了!

LightningChart .NET v.10.2.1已經發布了!

原根!

以下涉及到的運算如無特殊說明均為模 \(p\) 意義下的運算

階與原根

我們把最小的滿足 \(a^x\equiv1\) 的正整數 \(x\) 稱為 \(a\) 在模 \(p\) 意義下的階。

如果 \(a\not\perp p\),則 \(a\) 的階不存在。這是因為 \(a,p\) 均有 \((a,p)\) 這個因子,所以 \(a^x-kp\) 也一定含有 \((a,p)\) 這個因子,不可能為 \(1\)

而如果 \(a\perp p\),由尤拉定理,\(a^{x}\equiv a^{x\%\varphi(p)}\),即 \(a^{\varphi(p)}\equiv 1\)。故 \(a\)

的階小於等於 \(\varphi(p)\)。如果 \(a\) 的階等於 \(\varphi(p)\),則稱 \(a\)\(p\) 的原根。有些數是不存在原根的,比如 15。存在原根的數一定形如 \(2,4,p^c,2p^c\)(不會證)。設 \(g\)\(p\) 的一個原根,則 \(g^i\) 等價於 \(p\) 的簡化剩餘系。即 \(g^i\) 能取到模 \(p\) 意義下所有與 \(p\) 互質的數,這點由階的定義易證。於是 \(g^i\) 構成了一個大小為 \(\varphi(p)\) 的環,同時,每個與 \(p\) 互質的數都能表示成 \(g\) 的冪的形式。

對於 \(g^x\)

,其階為 \(\frac{\varphi(p)}{\gcd(x,\varphi(p))}\),這點是因為 \(g^x\) 不斷乘自己相當於在環上挑一個出發點不斷跳 \(x\) 步,顯然首次回到出發點是在跳了 \(\frac{\varphi(p)}{\gcd(x,\varphi(p))}\) 次之後。於是當 \(\gcd(x,\varphi(p))=1\)\(g^x\) 的階為 \(\varphi(p)\),也是 \(p\) 的原根。 這表明 \(p\) 的原根有 \(\varphi(\varphi(p))\) 個,由於 \(\varphi(p)\)\(p\) 幾乎是同一量級,所以 \(p\)
的原根相當稠密,有個很鬆的上界是 \(O(p^{0.25})\),也就是說前 \(O(p^{0.25})\) 個自然數裡必然至少含有一個原根。同時這也表明所有與 \(p\) 互質的數的階都是 \(\varphi(p)\) 的約數(時刻不要忘記,與 \(p\) 不互質的數是沒有階的),這使得快速驗證一個數是否是 \(p\) 的原根成為可能。

具體地,如果要驗證 \(x\) 是不是 \(p\) 的原根,我們可以只列舉 \(\varphi(p)\) 的所有質因子 \(p_1,p_2……p_k\),然後依次判斷 \(x\)\(\frac{\varphi(p)}{p_i}\) 次方是否等於 \(1\)。這是正確的,因為它覆蓋到了 \(\varphi(p)\) 除本身以外的所有約數。這樣我們就可以不斷從小到大列舉找到最小的原根,然後根據 \(g^x(x\perp p)\) 也是原根的性質 \(O(p\log p)\) 地求出所有原根。

原根與單位根

FFT 涉及到大量浮點數運算,精度嚴重丟失,這是不好的。而且 OI 總喜歡把一些東西膜來膜去你複數豈不是太礙眼了。所以我們考慮用模意義下的某些東西代替複數域上的單位根。

還記得單位根的幾何意義嗎?它是把複平面上的單位圓均分成 \(n\) 份。而在模 \(p\) 意義下的原根 \(g\) 的所有冪組成了一個大小為 \(\varphi(p)\) 的環,我們可以考慮把這個環看做圓,把環均分成 \(n\) 份作為模意義下的“\(n\) 次單位根”,即 \(g^{\frac{\varphi(p)}{n}}\)。你會驚喜地發現 \(g^{\frac{\varphi(p)}{n}}\) 具有 \(n\) 次單位根的所有性質,那我們就可以愉快地用它來代替 FFT 中的 \(n\) 次單位根去跑 NTT 了!