1. 程式人生 > >比FFT還容易明白的NTT(快速數論變換)

比FFT還容易明白的NTT(快速數論變換)

NTT相關

一種快速數論變換演算法,這種演算法是以數論為基礎,對樣本點為的數論變換,按時間抽取的方法,得到一組等價的迭代方程,有效高速簡化了方程中的計算公式·與直接計算相比,大大減少了運算次數。(見快速傅立葉變換)。
在計算機實現多項式乘法中,我們所熟知的快速傅立葉變換(FFT)是基於n次單位根 (omega) 的優秀性質實現的,而由於其計算時會使用正弦函式和餘弦函式,在不斷運算時無法避免地會產生精度誤差。而多項式乘法有些時候會建立在模域中,在對一些特殊的大質數取模時,便可以考慮用原根g來代替 ,而這些特殊的大質數的原根恰好滿足 的某些性質,這使得多項式乘法在模域中也可以快速的分治合併。
——百度百科

NTT(Number Theoretic Transform),中文名快速數論變換
FFT一樣,NTT也用來加速多項式乘法,不過NTT最大的優點是可以取模
或者可以理解為NTTFFT取模升級版

  • 好像NTT比起FFT來難的知識點更少了emm

NTT的優缺點

優點

  • 能取模FFT複數你給我取個模……?

  • 沒有精度差FFT浮點數精度怎麼也會出點問題

  • 由於均為整數操作(雖然取模多),

    NTT常數小,通常比一大堆浮點運算的FFT(其實這是放屁)

NTT小資料下表現良好……

缺點

  • 多項式的係數都必須是整數

  • 模數有限制而且NTT題目的模數通常都是相同998244353

NTT前置知識&技能

原根

對於g,pZ,如果gimodp(1ip1)的值互不相同,則稱gp原根
或者說i,j(

1i,jp1,i<j),gimodpgjmodp,那麼gp的原根
原根沒什麼快速求法,只能暴力列舉判斷
通常模數常見的有998244353,1004535809,469762049,這幾個的原根都是3
就這麼少東西?好像真的只有這麼少

NTT(快速數論變換)

FFT可以優化是因為ω有著神奇且優秀的性質
NTT呢?其實原根也有這類性質!

NTT裡,我們可以拿原根來代替FFT的單位根
具體就是,當合並區間的長度為len=2mid時,單位根為cos2πlen+isin2πlen=cosπmid+isinπmid
而原根即為