code
對比先要把fft學習清楚才能進行.
因為基本原理都是一樣的.
fft是根據複數和n
nn次單位根構造演算法的.
但是,使用複數和單位根有以下兩個缺點:
複數運算計算量大,常數比較高
複數是基於dou
bledouble
double
運算的,可能會出現精度誤差
這兩個缺點都很致命.
但是,我們經常接觸係數為整數的多項式.
有沒有更簡單的優化演算法?
答案是:有!就是快速數論變換(number theoretic transform)(ntt).
快速數論變換,以取模代替了複數運算.
既然沒有了複數這一尚方寶劍,那麼用什麼代替複數指數?
用冪次方!
於是,ntt優秀脫穎而出.
其實很巧,ntt並沒有非常嚴格的數學論證.
只是在尋找這樣的數而已.
(1)舉個例子,3階:如果有a,p
a,pa,
p互質,那麼如果
a n≡
1(mo
dp)a^n\equiv1\pmod p
an≡1(m
odp)
稱滿足條件的最小正整數n
nn為a模p的階,又稱 δp(
a)\delta_p(a)
δp(a)
(讀作delta).
(2)原根:
如果p
pp是正整數,a
aa是整數,若:
δ p(
a)=φ
(p)\delta_p(a)=\varphi(p)
δp(a)
=φ(p
)那麼稱a
aa為模p
pp的原根,
性質:對於(1⩽
n(1\leqslant n\lt p)
(1⩽n
,a n(
modp
)a^n\pmod p
an(mod
p)的值互不相同.
33是7
77的乙個原根,2
22是37
3737
的乙個原根.
同乙個模數,原根並不只有乙個.
如果乙個模數有原根,那麼它一定有φ(φ
(n))
\varphi(\varphi(n))
φ(φ(n)
)個原根.
下文我們稱這些原根為ggg.
對了,998244353的原根有乙個3哦!驚不驚喜?意不意外?
對於原來的fft,我們如何將ω
n\omega_n
ωn轉化為g
gg的格式即可.
如何轉換?
既然ω
n\omega_n
ωn對冪次具有特殊性,那我們就用
ω n≡
gp−1
n(mo
dp)\omega_n\equiv g^}\pmod p
ωn≡gn
p−1
(mod
p)來表示!
所以,我們將所有的ω
n\omega_n
ωn替換成gp−
1ng^}gn
p−1
即可.題目傳送門
這只是乙個附頁,對比fft和ntt的複雜度.
這裡是fft的資料:
這裡是ntt的:
//重測一遍後的結果
可以看出ntt還是很優秀友好的.
感謝奆老關注 qwq ?
快速數論變換 NTT
今天的a題,裸的ntt,但我不會,於是白送了50分。於是跑來學一下ntt。題面很簡單,就懶得貼了,那不是我要說的重點。重點是ntt,也稱快速數論變換。在很多問題中,我們可能會遇到在模意義下的多項式乘法問題,這時傳統的快速傅利葉變換可能就無法滿足要求,這時候快速數論變換就派上了用場。考慮快速傅利葉變換...
高速數論變換 NTT
今天的a題。裸的ntt,但我不會,於是白送了50分。於是跑來學一下ntt。題面非常easy。就懶得貼了,那不是我要說的重點。重點是ntt,也稱高速數論變換。在非常多問題中,我們可能會遇到在模意義下的多項式乘法問題,這時傳統的高速傅利葉變換可能就無法滿足要求,這時候高速數論變換就派上了用場。考慮高速傅...
fjut3283 NTT快速數論變換
題解 我們將b序列反轉那麼最後就會變成 a0,a1,a2,an 1 b0,a1,b2.bn 1 那麼答案將變成a0 bi a1 bi 1 ai b0 ai 1 bn 1 ai 2 bn 2 an 1 bi 1然後你會發現答案就是多項式乘法,指數相加等於i的係數加上指數相加等於i n的係數就是答案,因...