單位根與其若干應用


單位根與其若干應用

單位根的幾個性質

對於一種運算條件下,若\((w_n^1)^n = 1\),那么\(w_n^1\)\(n\)次單位根。
我們令\(w_{n}^k = (w_{n}^1)^k\)
單位根在復數意義下有三角表示:\(w_n^k = e^{\frac{2\pi k}{n}i} = cos(\frac{2\pi k}{n}) + sin(\frac{2\pi k}{n})i\)
在模\(p\)意義下,由於原根\(g\)滿足\(g^{p-1} \equiv 1(mod\ p)\),所以可以令\(w_{p}^1 = g^{\frac{p-1}{n}}\)
復數運算的幾何意義:模長相乘,轉角相加。
根據復數乘法的幾何意義,顯然有:

  • \(w_{n}^k = w_{nr}^{kr}\)
  • \(w_{n}^k = w_{n}^{k\% n}\)
  • \(w_{n}^{k + \frac{n}{2}} = -w_{n}^k\)

這幾個性質后面都會用到。

單位根反演

我們有式子:\(\frac{1}{n}\sum_{i=0}^{n - 1} (w_{n}^k)^i = [n|k]\),證明其實不難。
\(n|k\),那么\(w_n^k = w_{n}^0 = 1\),所以\(\sum_{i=0}^{n-1} (w_n^k)^i = n\)
否則,\(\sum_{i=0}^{n-1} (w_n^k)^i = \frac{1-(w_{n}^{k})^n}{1 - w_{n}^k} = \frac{1 - w_n^0}{1 - w_n^k} = 0\)
證畢。
可以化簡大量包含形如\(\sum_i[d|i] F(i)\)的式子的計算。

離散傅里葉變換(DFT)

我們用\(n\)個點可以表示出\(n-1\)次多項式,稱這種表示為點值表示法。
點值表示法的多項式乘法顯然為\(O(n)\),即\((x,y_1)*(x,y_2) = (x,y_1y_2)\)
點值表示法轉系數表示法的傳統做法為拉格朗日差值,復雜度\(O(n^2)\)
傅里葉提出,通過帶入單位根,優化這個過程。
對於一個\(n-1\)次多項式\(A(x) = \sum_{i=0}^{n-1} a_i x^i\),考慮帶入\(x_k = w_{n}^k\)來做出點值表示,其中\(k\in[0,n)\)
我們設得到的點值表示為\(A(x):\{(w_n^k,y_k)|k\in [0,n)\}\) ,令\(B(x) = \sum_{i=0}^{n-1} y_i x^i\)
\(w_{n}^{k}\)的倒數分別帶入\(B(x)\)中:
\(B(w_n^{-k}) = \sum_{i=0}^{n-1} y_i w_n^{-ki} = \sum_{i=0}^{n-1} (\sum_{j=0}^{n-1} a_j w_n^{ij})w_n^{-ki}\)
\(B(w_n^{-k}) = \sum_{j=0}^{n-1} \sum_{i=0}^{n-1} a_j w_n^{(j-k)i}\),后面一坨就是單位根反演的變形。
\(B(w_n^{-k}) = \sum_{j=0}^{n-1} a_j (\sum_{i=0}^{n-1} w_n^{(j-k)i}) = k_j n\)
所以\(a_k = \frac{B(w_n^{-k})}{n}\),爽!
可以發現我們不需要拉格朗日差值了,帶入單位根倒數得點值表示,然后除\(n\)就是每一項的系數了。
總結一下,我們得到了這樣的東西:
\(f_i = \sum_{j=0}^{n-1} w_n^j g_j\) --------------------> \(g_i = \frac{1}{n}\sum_{j=0}^{n-1} w_{n}^{-j} f_j\)

快速傅里葉變換(FFT)

考慮利用離散傅里葉變換,實現快速多項式乘法。
我們假設求長度為\(n\)的多項式的離散傅里葉變換,設\(d|n\)
考慮求\(A(x) = \sum_{i=0}^{n-1} a_i x^i\)帶入\(w_n^{0,1...n-1}\)的點值表示結果,我們按照模\(d\)剩余類分類。
\(A_r(x) = \sum_{i=0}^{\frac{n}{d} - 1} a_{id+ r} x^i\),假設我們已經求得了它們帶入\(w_{\frac{n}{d}}^{0,1,...\frac{n}{d}-1}\)的點值表示結果。
那么\(A(w_{n}^k) = \sum_{r=0}^{d-1} (w_{n}^{kr}) A_r((w_{n}^k)^d) = \sum_{r=0}^{d-1} (w_n^{kr\% n}) A_r(w_{\frac{n}{d}}^k)\)
所以貌似分治就行了......
一般使用時,我們把\(n\)補全為\(2^t\),這樣\(d\)恆等於\(2\),每次折半分治即可。
關於非遞歸\(FFT\)
預處理每個點分治若干次后到達的實際位置,然后從底向上還原(每次合並都是一段區間)。
快速數論變換(NTT)的原理與快速傅里葉變換(FFT)沒有任何區別,所以就不寫了。

循環卷積

當多項式乘法在指數模\(n\)意義進行,我們乘其為指數模\(n\)意義下的循環卷積。
而單位根有很好的性質:\(w_{n}^k = w_{n}^{k\% n}\)
我們假設能夠求出帶入\(w_n^{0,1,2...,n-1}\)后多項式的值,那么\(Idft\)就能夠求出原多項式的每一項系數。
一類特殊循環卷積:
考慮對於長度為\(n\)的多項式\(A(x)\),\(B(x)\),求:
\(C(x):\ C_k = \sum_{i=0}^{n-1} \sum_{j=0}^{n-1}[(i+j)\%n=k] a_ib_j\)
一個非常有趣的結論:
求得\(A(x)\)\(B(x)\)的離散傅里葉變換的點值,那么\(C(x)\)的點值表示就為\(A(x)\)點值與\(B(x)\)點值的積。
即若你要求\(A(x)^m\),那么只需要求\(A(x)\)的傅里葉變換點值,把點值\(m\)次方后再還原回去即可。
所謂傅里葉變換點值就是指帶入\(w_{n}^{0,1...,n - 1}\)得到的點值 。
我們來證明一下,其實暴力帶入驗證即可。
\(C(w_n^k) = A(w_n^k) B(w_n^k) = (\sum_{i=0}^{n-1} a_i w_n^{ki})(\sum_{j=0}^{n-1} b_j w_{n}^{kj})\)
\(C(w_n^k) = \sum_{i=0}^{n-1} \sum_{j=0}^{n-1} a_ib_j w^{k(i+j)}_n = \sum_{r=0}^{n-1} \sum_{i=0}^{n-1} \sum_{j=0}^{n-1}[(i+j)\%n=r] a_ib_j w_n^{k}\)
剛好就是循環卷積要求的東西,證畢。

幾道有趣的題目

嘿嘿嘿......見下面。

[CTSC2010] 性能優化

問題就是求\(B(x)^C\)在指數模\(n\)意義下的循環卷積,同時模數為\(n+1\),多項式長度為\(n\)
我們在上面已經討論過這種循環卷積的處理方式了。
所以只需要求\(B(x)\)帶入\(w_{n}^{0,1...n-1}\)的點值表示,然后\(C\)次方后再\(Idft\)回去。
我們需要支持快速\(dft\),而我們已知\(n\)能夠分解為\(2^{k_1}3^{k_2}5^{k_3} 7^{k_4}\)
那么考慮分治\(dft\),類似\(fft\)每次把多項式分成若干份,然后自底向上合並即可。
由於每次分成的份數不超過\(7\),所以合並的復雜度顯然是正確的。
可以預先搜出每個點在分治\(dft\)的過程中最后到了哪個位置,這樣就可以非遞歸實現算法了。

[牛客挑戰賽23F] 計數(解法一)

對於一棵生成樹,設其邊權為\(\sum_{e\in E} val_e\),那么\(Ans = \sum_E [k|\sum_{e\in E} val_e]\)
單位根反演有:\(Ans = \frac{1}{k}\sum_E \sum_{j=0}^{k-1} (w_k^{\sum_{e\in E} val_e})^j = \frac{1}{k} \sum_{j=0}^{k-1} \sum_E \prod_{e\in E} (w_k^j)^{val_e}\)
后面一坨是我們熟悉的變元矩陣樹定理,所以\(\sum_E \prod_{e\in E} (w_k^j)^{val_e}\)直接用矩陣樹定理算即可。

[牛客挑戰賽23F] 計數(解法二)

依舊考慮變元矩陣樹定理,考慮把邊權相加變為邊權相乘。
定義每條邊\(e\)的生成函數\((1 + x^{val_e})\),那么一個合法邊集可以看做在指數模\(k\)意義下的循環卷積。
考慮令\(x = w_{k}^{0,1...k-1}\),那么帶入\(w_k^j\)做矩陣樹定理就能夠得到\(A(w_k^{j})\)
而我們的最終目標是求\(A(x)\)中的系數\(a_0\),所以再\(Idft\)即可。

[牛客挑戰賽11E] 白兔的刁難(解法一)

考慮組合意義,不難發現\(ans_t\)就是\((1+x)^n\)在指數模\(k\)意義下的循環卷積第\(t\)項的系數。
暴力帶入\(w_k^{0,1...,k-1}\),得點值表示后再\(Idft\)即可。

[牛客挑戰賽11E] 白兔的刁難(解法二)

考慮暴力單位根反演,\(Ans_t = \sum_{i=0}^{n} \binom{n}{i} [k|i-t] = \frac{1}{k}\sum_{i=0}^{n} \binom{n}{i} \sum_{j=0}^{k-1} (w_{k}^{i-t})^j\)
所以\(Ans_t = \frac{1}{k} \sum_{j=0}^{k-1} (w_k^{-t})^j \sum_{i=0}^n \binom{n}{i} (w_{k}^i)^j = \frac{1}{k} \sum_{j=0}^{k-1} (w_k^{-t})^j (1 + w_k^j)^n\)
不難發現這是一個\(Idft\)形式。
我們把\((1+w_k^j)^n\)看做\(A(w_k^j)\)(指數模\(k\)意義下的循環卷積),即\((1+w_k^j)^n = A(w_k^j) = y_j\)
那么\(Ans_t = B(w_k^{-t}) = \frac{1}{k} \sum_{j=0}^{k-1} y_j (w_k^{-t}) = \frac{1}{k} (a_t k) = a_t\)
所以\(Ans_t\)等於\(A(x) = (1 + x)^n\)這個循環卷積的第\(t\)項系數,與我們組合意義所得的內容一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM