fft和ntt真是噩夢呢
既然被fft和ntt坑夠了,坑一下其他的人也未嘗不可呢
設有乙個數a,使得an=1,其中n為滿足an=1的最小正整數
滿足條件的a有哪些呢?
更寬泛地說,只要在乙個集合中定義了加法和乘法,而且二者滿足:
(這些基本上是小學學的吧,除了最後一點之外,其他都是廢話)
那麼裡面滿足an=1的數都是我們可以討論的數
這樣說,這些數也是可以滿足要求的:
這裡的a就是我們要找的單位根
好,這下我們來**一下fft&ntt
首先,我們要知道這兩個是幹什麼的
fft和ntt都是dft的分治法下的優化
而dft則是將多項式的係數表達(就是「滿足f(x)=a+bx+cx2+dx3……的多項式」)變為點值表達(就是「經過(a,a'),(b,b'),(c,c')……的多項式」)的暴力演算法
用矩陣表達就是:
很明顯,dft的時間複雜度為θ(n2)的,這時單位元素的作用就體現出來了
我們把單位元素b及b的冪代替xi,其中b所對應的n和矩陣的邊長相等,那麼可以得到:
看上去就是換了個表示方法,但是變一下形就能分治了:
沒看出來?再變一下形試試:
是不是猛然發現我們有兩個相同的矩陣了?把相同的矩陣拿出來,去掉0看看:
這不就是把b2代進去的dft式子嗎,通過前面的敘述我們可以知道b2也是單位元素,那麼只要一開始的n是2的冪,我們就可以分治了是不是?
事情沒有這麼簡單,細心的可能會發現,我這裡挖了乙個大坑:前面那個矩陣不是乙個方陣,也就是說,前面那個矩陣等於:
但是通過單位元素的定義可以知道,(b2)n/2=1,也就是說有:
下面的半邊竟然和上面的一樣!忽略掉下面重複的半邊矩陣,轉移矩陣又變成了乙個方陣,我們又可以開始分治了
知道了怎麼分治計算其中乙個矩陣,我們再看一下另外乙個矩陣
另外乙個矩陣是對角矩陣,可以在更快的θ(n)內計算完成,但是我們想要做得更好(卡一卡常),那又怎麼辦呢?
這時我們可以發現,既然bn=1,n又是2的冪,那麼就有bn/2=-1,也就是說:
我們只要後面半邊轉移時用減號代替加號,而不需要再計算後面半邊的冪了,常數減半
到了這一步,基本的fft&ntt框架就到這裡了
說了這麼多,把係數表達變成點值表達又有什麼用呢?對廣大oier來說當然是加快多項式乘法了
對係數表示式暴力相乘當然是要θ(n2)的,但是點值表示式就只要θ(n)了:
但是又怎麼把點值表達變回平常的係數表達呢?這就要用到乙個公式了(只要記,不用證)
這就給我們了乙個ifft&intt的方法:把這個新的矩陣和係數再乘回去,我們熟悉的係數表達就回來了
不僅如此,既然b是單位元素,那麼b-1就也是單位元素,恩……ifft&intt乾脆就可以用fft&ntt的**嘛
dft&idft的優化介紹完畢了,但是還是很慢,那有什麼辦法卡常呢?
我們可以發現,每次分治的時候,原多項式的係數都會移動到不同的矩陣,而且係數移動和計算可以分離,可不可以先移動,再計算呢?
當然!分析之後可以發現,如果把序號為偶數的向量放在序號為奇數的向量前面,那麼原來位置為p的係數會移動到rev(p)處,用圖來說就是:
(用的是n=16時的例子,因為實在不好表示)
那麼我們可以先移動係數,再從下向上倍增地計算,那麼就能優化常數了
**(摘自洛谷**):
for(int i=0;i)當用fft計算實係數多項式乘法時,我們可以用這樣乙個公式快速計算結果:r[i]=(r[i>>1]>>1)|((i&1)?n>>1:0);
這樣我們就可以把兩個多項式相乘變成單個多項式的平方,因此可以偷懶少算一次fft
洛谷**:
ps:這裡只寫了其數學解釋,加強理解,並不會對**實現進行深究
忽然發現,這個證明改一改可以變為任意長度的快速離散傅利葉變換的證明,只要把2n換成an就可以了,這樣就不用做把531441=312擴充為1048576=220這種極其不划算的事了,時間複雜度和原來的應該差不多(似乎並沒有什麼用的樣子)
——會某人
演算法筆記 FFT NTT
本文不做證明,詳細證明請看如上資料。fft在演算法競賽中主要用來加速多項式的乘法 普通是多項式乘法時間複雜度的是o n2 而用fft求多項式的乘法可以使時間複雜度達到o nlogn fft求多項式的乘法步驟主要如下圖 其中求值是將係數表達轉換成點值表達,帶入的自變數是wn 1的複數解,稱為dft 插...
FFT NTT 學習筆記
顯然因為我不會數學,所以這篇文章會非常 感性 將兩個多項式乘起來,即求 f g h 多項式的項數 n le10 5 複數複數是指形如 x yi 的數,高中會教。它的四則運算法則是這樣的 令 p,q 為兩個複數 p pm q x p pm x q y p pm y q i p times q x px...
FFT NTT中檔題總結
被deepinc 怕了,把一些題放到這裡來 其實這道題放到中檔題也不太合適,個人感覺真的很難,機房裡好像都是頹的題解 因為期望的可加性,把每個點的貢獻單獨處理,即求期望深度 考慮 y 對 x 的貢獻 當且僅當 x y 的路徑上第乙個點就選 y y 才能成為 x 的祖先 所以 y 對 x 的貢獻就是 ...