快速傅利葉變換 快速數論變換

2021-09-07 10:13:11 字數 3631 閱讀 5415

[update 3.29.2017]

2月10日初學,記得那時好像是正月十五放假那一天

當時寫了手寫版的筆記

過去近50天差不多忘光了,於是複習一下,具體請看手寫版筆記

參考文獻:picks

miskcoo

menci

阮一峰

\(i\),表示逆時針旋轉90度

\(a+bi\),對應復平面上的向量

複數加法同向量

複數乘法「模長相乘,幅角相加」,\((a+bi)*(c+di)=ac-bd+adi+bci\)

共軛複數實部相等,虛部互為相反數. 單位根的倒數等於共軛複數

尤拉公式\(e^=cos(u)+isin(u)\)

n次單位複數根:滿足\(\omega^n=1\)的複數\(\omega, \omega_n^k = e^k}\)

主n次單位根\(\omega_n = e^}\)

消去引理,折半引理,求和引理

\(n\)個\(n\)次單位複數根在乘法意義下形成乙個群,與\((z_n,+)\)有相同的結構,因為\(w(n,0)=w(n,n)=1\ \rightarrow\ w(n,j)*w(n,k)=w(n,(j+k) mod n)\)

對於多項式\(a(x)=\sum\limits_^a_jx^j\),代入n次單位複數根所得到的列向量就是a的離散傅利葉變換

\(o(nlogn)\)計算離散傅利葉變換

使用分治的思想,按下標奇偶分類,\(a_0(x)\)是偶數項,\(a_1(x)\)是奇數項,則\(a(x)=a_0(x^2)+xa_1(x^2)\),根據折半引理僅有\(\frac\)次單位複數根組成

\(k < \frac,\)

\[ a(\omega_n^k)=a_0(\omega_\frac^k)+\omega_n^ka_1(\omega_\frac^k)\\ a(\omega_n^})=a_0(\omega_\frac^k)-\omega_n^ka_1(\omega_\frac^k) \]

在單位複數根處插值

矩陣證明略

用\(\omega_n^\)代替\(\omega_n\),計算結果每個元素除以\(n\)即可

\(\omega\)可以預處理也可以遞推,預處理精度更高

遞迴結束時每個元素所在的位置就是「二進位制翻轉」的位置,可以非遞迴的實現fft

加倍次數界,兩個次數界為n的多項式相乘,次數界為2n-1,加倍到第乙個大於等於的2的冪

注意:我傳入的引數是次數界n,最高次數n-1,陣列中用0到n-1表示

取整用floor向下取整,型別轉換是向0取整

子群:\(群(s,\oplus),\ (s',\oplus),\ 滿足s' \subset s,則(s',\oplus)是(s,\oplus)的子群\)

拉格朗日定理:

\(|s'| \mid |s|\)

證明需要用到陪集,得到陪集大小等於子群大小,每個陪集要麼不想交要麼相等,所有陪集的並是集合s,那麼顯然成立。

生成子群

\(a \in s\)的生成子群\(=\:\ k\ge 1\}\),\(a\)是\(\)的生成元

階:群\(s\)中\(a\)的階是滿足\(a^r=e\)的最小的r,符號\(ord(a)\)

\(ord(a)=||\),顯然成立

考慮群\(z_n^*=\,\ |z_n^*| = \phi(n)\)

階就是滿足\(a^ \equiv 1 \pmod n\)的最小的\(r,\ ord(a)=r\)

\(g滿足ord_n(g)=|z_n^*|=\phi(n)\),對於質數\(p\),也就是說\(g^i \mod p, 0\le i 結果互不相同

模n有原根的充要條件\(n=2,4,p^e,2p^e\)

離散對數

\(g^t \equiv a \pmod n,\ ind_(a)=t\)

因為g是原根,所以\(g^t\)每\(\phi(n)\)是乙個週期,可以取到\(|z_n^*|\)的所有元素

對於n是質數時,就是得到\([1,n-1]\)的所有數,就是\([0,n-2]\)到\([1,n-1]\)的對映

離散對數滿足對數的相關性質,如\(ind(ab)\equiv ind(a)+ind(b) \pmod \)

求原根可以證明滿足\(g^ \equiv 1 \pmod p\)的最小的r一定是\(p-1\)的約數

對於質數\(p\),質因子分解\(p-1\),若\(g^} \neq 1 \pmod p\)恆成立,g為p的原根

對於質數\(p=qn+1,\ n=2^m\),原根\(g\),則\(g^ \equiv 1 \pmod p\)

將\(g_n=g^ \pmod p\)看做\(w_n\)的等價,滿足\(w_n\)類似的性質,如:

這裡的n(用n表示吧)可以比原來那個的n(乘法結果的長度擴充套件到2的冪次後的n)大,只要把\(\frac\)看做q就行了

常見的\(p=1004535809=479 \cdot 2^ + 1,\ g=3,\quad p=998244353= 2 * 17 * 2^ + 1,\ g=3 ​\)

\(g^\)就是\(e^\)的等價,迭代到長度\(l\)時,\(g_l=g^}\)

或者\(w_n=g_l=g_n^}=g^}\)

***這裡放乙個大整數相乘的模板

//fft

#include #include #include #include #include using namespace std;

typedef long long ll;

const int n=(1<<18)+5, inf=1e9;

const double pi=acos(-1);

inline int read()

while(c>='0'&&c<='9')

return x*f;

}struct meow

};meow operator +(meow a, meow b)

meow operator -(meow a, meow b)

meow operator *(meow a, meow b)

meow conj(meow a)

typedef meow cd;

struct fastfouriertransform

//ntt

#include #include #include #include #include using namespace std;

typedef long long ll;

const int n=(1<<18)+5, inf=1e9;

const double pi=acos(-1);

inline int read()

while(c>='0'&&c<='9')

return x*f;

}ll p=1004535809;

ll pow(ll a, ll b,ll p)

struct numbertheoretictransform

void dft(ll *a, int flag)

傅利葉變換與快速傅利葉變換

作為電子資訊專業的學生老說,這個不知道,或者理解不清楚,是十分不應該的,作為乙個學渣,有時候確實是理解不清楚的 1 首先離散傅利葉變換目的 簡單點說 就是將乙個訊號從時域變換到頻域 標準點說 將以時間為自變數的訊號 與 頻率為自變數的頻譜函式之間的某種關係變換 數學描述 對於 n點序列 其中自然對數...

快速傅利葉變換

學習快速傅利葉變化是量子計算中的基礎,查了很多資料,以下鏈結可以作為參考 本部落格部分知識學習於 最後這個裡面有解釋蝴蝶效應是怎麼來的!實用數字訊號處理 dft 離散傅利葉變換 o n2 計算多項式乘法 fft 快速傅利葉變換 o n log n 計算多項式乘法 fntt ntt 快速傅利葉變換的優...

快速傅利葉變換

傅利葉變換 fft fast fourier transformation 是離散傅氏變換 dft 的快速演算法。即為快速傅氏變換。它是根據離散傅氏變換的奇 偶 虛 實等特性,對離散傅利葉變換的演算法進行改進獲得的。採用這種演算法能使計算機計算離散傅利葉變換所需要的乘法次數大為減少,特別是被變換的抽...