模板 快速數論變換 NTT

2021-09-26 01:25:12 字數 2815 閱讀 3840

code

對比先要把fft學習清楚才能進行.

因為基本原理都是一樣的.

fft是根據複數和n

nn次單位根構造演算法的.

但是,使用複數和單位根有以下兩個缺點:

複數運算計算量大,常數比較高

複數是基於dou

bledouble

double

運算的,可能會出現精度誤差

這兩個缺點都很致命.

但是,我們經常接觸係數為整數的多項式.

有沒有更簡單的優化演算法?

答案是:有!就是快速數論變換(number theoretic transform)(ntt).

快速數論變換,以取模代替了複數運算.

既然沒有了複數這一尚方寶劍,那麼用什麼代替複數指數?

用冪次方!

於是,ntt優秀脫穎而出.

其實很巧,ntt並沒有非常嚴格的數學論證.

只是在尋找這樣的數而已.

(1)

階:如果有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)的值互不相同.

舉個例子,3

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的係數就是答案,因...