《死亡迴圈》獲Gamespot年度最佳 遊戲將影響幾代從業者
以下涉及到的運算如無特殊說明均為模 \(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\)
對於 \(g^x\)
具體地,如果要驗證 \(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 了!