數論轉換是一種計算摺積的快速演演算法。計算摺積的快速演演算法中最常用的一種是使用快速傅裡葉變換，然而快速傅立葉變換具有一些實現上的缺點，舉例來說，資料向量必須乘上複數係數的矩陣加以處理，而且每個複數係數的實部和虛部是一個正弦及餘弦函式，因此大部分的係數都是浮點數，也就是說，必須做複數而且是浮點數的運算，因此計算量會比較大，而且浮點數運算產生的誤差會比較大。 而在數論轉換中，資料向量需要乘上的矩陣是一個整數的矩陣，因此不需要作浮點數的乘法運算，更進一步，在模數為 M 的情況下，只有 M2 種可能的加法與 M2 種可能的乘法，這可以使用記憶體把這些有限數目的加法和乘法存起來，利用查表法來計算，使得數論轉換完全不須任何乘法與加法運算，不過需要較大的記憶體與消耗較大的存取記憶體量。 雖然使用數論轉換可以降低計算摺積的複雜度，不過由於只進行整數的運算，所以只能用於對整數的訊號計算摺積，而利用快速傅立葉變換可以對任何複數的訊號計算摺積，這是降低運算複雜度所要付出的代價。 轉換公式 數論轉換的轉換式為 F ksum_n0N1 f nalphank pmod Mquad k012ldots N1 而數論轉換的反轉換式為 f nN1sum_k0N1 F kalphankpmod Mquad n012ldots N1 註解： 1 M 是一個質數。 2 pmod M 表示除以 M 的餘數 3 N 必須是 M1 的因數。當 Nne 1 時 N 和 M 互質 4 N1 是 N 對模數 M 之模反元素 5alpha 為模 M 的 N 階單位根，即 alphaN1pmod M 而且 alphak ne 1 pmod M k12ldotsN1。若此時 NM1，我們稱 alpha 為模 M 的原根 舉一個例子： 一個 M5 的 N4 點數論轉換與反轉換如下，取 alpha 2，注意此時 N14 正轉換 begin pmatrix F 0 F 1 F 2 F 3 end pmatrixbegin pmatrix 1 1 1 1 1 2 4 3 1 4 1 4 1 3 4 2 end pmatrixbegin pmatrix f 0 f 1 f 2 f 3 end pmatrixpmod M 反轉換 begin pmatrix f 0 f 1 f 2 f 3 end pmatrixbegin pmatrix 4 4 4 4 4 2 1 3 4 1 4 1 4 3 1 2 end pmatrixbegin pmatrix F 0 F 1 F 2 F 3 end pmatrixpmod M 數論轉換的性質 1 正交性質 數論轉換矩陣的每個列是互相正交的，即 sum_n0N1alphanlalphankbegin cases N quad if kl 0 quad if kne lend cases pmod M 2 對稱性 若 f nf Nn，則 f n 的數論轉換 F k 也會有 F kF Nk 的特性。 若 f nf Nn，則 f n 的數論轉換 F k 也會有 F kF Nk 的特性。 3 反數論轉換可由正數論轉換實現 f nN1sum_k0N1 F kalphankN1sum_k0N1 F kalphank，即 N1 F k 的數論轉換。 步驟一：把 F k 改寫成 F k，若 F kF_0F_1F_2ldotsF_N1 ，則 F kF_0F_N1ldotsF_2F_1 步驟二：求 F k 的數論轉換。 步驟三：乘上 N1。 4 線性性質 若 f nleftrightarrow F k，g nleftrightarrow G k，leftrightarrow 表互為數論轉換對 則有 af nbg nleftrightarrow aF kbg kpmod M。 5 平移性質 若 f nleftrightarrow F k，則 f nlleftrightarrow alphalk F kpmod M，而且 f nalphanlleftrightarrow F kl。 6 圓周摺積性質 若 f nleftrightarrow F k，g nleftrightarrow G k，則 f notimes g nleftrightarrow F k G kpmod M，而且 f n g nleftrightarrow frac 1N F kotimes G kpmod M。otimes 代表圓形摺積。 這個性質是數論轉換可以用來作為摺積的快速演演算法的主要原因。 7 帕塞瓦爾定理 Parsevals Theorem 若 f nleftrightarrow F k，則 Nsum_n0N1 f n f nsum_k0N1 F2 kpmod M，而且 Nsum_n0N1 f2 nsum_k0N1 F k F kpmod M 快速數論轉換 如果轉換點數 N 是一個 2 的次方，則可以使用類似基數 2 快速傅立葉變換的蝴蝶結構來有效率的實現數論轉換。同樣的互質因子演算法也可以應用在數論轉換上。 begin matrix F ksum_n0N1 f nalphank sum_r0N21 f 2ralpha2rksum_r0N21 f 2r1alpha2r1 k sum_r0N21 f 2ralpha2rkalphaksum_r0N21 f 2r1alpha2rk begin cases G kalphakH kquad 0le kle frac N21 G kfrac N2alphakH kfrac N2quad frac N2le kle N1 end casesend matrix 其中，G ksum_r0N21 f 2ralpha2rk，H ksum_r0N21 f 2r1alpha2rk。 因此一個 N 點數論轉換可以拆解成兩個 frac N2 點的數論轉換。 N M alpha 的選擇 由於數論轉換可以擁有類似快速傅立葉變換的快速演演算法，因此通常 N 會選擇適合使用快速演算的值，比如說取為 2 的冪次，或是可以分解成許多小質數相乘的數。 在數論轉換中，需要大量地和 alpha 的冪次做乘法，因此，如果可以取 alpha 為 2 或 2 的冪次，則每一次的乘法在二進制中只會是一個移位的操作，可以省下大量的乘法運算。 因為要做模 M 的運算，所以 M 的二進位表示法中，1 的個數越少越好，同時 M 的值不能取太小，這是因為數論轉換後的值都小於 M，因此當真實的摺積的結果會大於 M 時就會發生錯誤，所以必須謹慎選取 M 的大小。 特殊的數論轉換 梅森質數數論轉換 梅森質數是指形如 2p1 的質數記做 M_p，其中 p 是一個質數。 在梅森質數數論轉換中，取 MM_p，可以證明 alpha N 可以如下選取： 1 alpha 2 Np N1M_pfrac M_p1p 2 alpha 2 N2p N1M_pfrac M_p12p 在這兩種選取方式下，由於 alpha 是 2 的冪次，所以只需移位運算，但 N 不是 2 的冪次，所以基數 2 的蝴蝶結構不適用於此例中，同時 N 為質數或一個質數的兩倍，並不是一個可以拆解成很多質因數乘積的數，因此也無法由互質因子演演算法得到太大的好處。梅森質數數論轉換通常用於較短序列的摺積運算 費馬數數論轉換 費馬數是指形如 22t1 的數記做 F_t。 在費馬數數論轉換中，取 MF_t，可以證明在 0tle 4 之下 alpha N 可以如下選取： 1 alpha 2 N2t1 2 alpha 3 NF_t1 在這兩種選取方式下，N 是 2 的冪次，所以基數 2 的蝴蝶結構適用於此例中，而若 alpha 是 2 的冪次，只需移位運算。費馬數數論轉換通常用於較長序列的摺積運算。 實作議題 由於數論轉換需運用到餘數下的反元素，這邊提供一些不同的演演算法。 一 Euclidean algorithm iterative version 假設 M 為質數的 mod，N 為我們當前的元素且符合 M1 的因數，藉由 Euclidean Algorithm 知道必然存在 x y 的整數使得 xM yN 1 1 由上式左右 mod M 可以得到 yN mod M 1，顯然 y 就是我們這邊想求的反元素。 我們已知最大公因數 gcd 有如下性質。 gcd M N gcd N M mod N gcd M mod N N mod M mod N 1 這邊設定 q 為商數，r 為餘數，接上面的等式方程式化如下。 M q_0 N r_1 N q_1 r_1r_2 r_1 q_2 r_2 r_3 r_2 q_3 r_3 r_4 整理一下 M q_0 N r_1 N q_1 r_1 r_2 r_1 q_2 r_2 r_3 r_2 q_3 r_3 r_4 最後的 r 一定會變成 1，所以我們只要不斷的將 r 乘上 q 帶往下一個式子 像是 r1q1，跟代往下下個式子 像是 r3 的左邊式子要帶入 r1 即可求得最後我們想得到的 1，最後的 N 旁的係數就是反元素。 def modInv x M by Euclidean algorithm iterative version t new_t r new_r 0 1 M x while new_r 0 quotient int r new_r tmp_new_t new_t tmp_t t tmp_new_r new_r tmp_r r t new_t new_t t quotient new_t r new_r new_r r new_r if r 1 print Inverse doesnt exist if t 0 t t M return t 二 Euclidean algorithm recursion version 根據 gcd 的性質 gcd M N gcd N M mod N gcd M mod N N mod M mod N 1 可以看出遞迴的關係，藉此我們可以從這邊得到 N 的係數，也就是反元素。 gcd M N 1 來看，我們知道存在 xM yN 1 。 gcd N M mod N1，則存在 x_1 N y_1M mod N 1 x_1 N y_1M mod N x_1 N y_1M q_1 N y_1 M x_1q_1 y_1 N 1 這邊 q 就是相除的商數，比較 M 跟 N 的係數，這邊可以得到一個遞迴關係， x_1q_1 y_1 y y_1 x 可以藉由下一層的係數來推出上一層的係數。 def egcd a b y x1 quotient y1 x y1 if a 0 return b 0 1 else g y x egcd b a a return g x b a y y def modInv n m by Euclidean algorithm recursion version g y x egcd n m if g 1 print Inverse doesnt exist else return y m 三 Fermat little theorem 當 M 是質數時，我們知道任何一個數字 N， NM1 mod M 1 N NM2modMmodM1 顯然 NM2modM 就是 N 的反元素。 搭配快速 mod 可以容易的算出反元素，power 是偶數時則可以用 a2 modMpower2 power 是基數時則可以用 aN modMpower1，讓 power 變成偶數。反覆直到 power 變成 1。 def modInv a m fermat little thm return modExponent a m 2 m def modExponent base power M quick mod O log power result 1 power int power base base M while power 0 if power 1 result result base M base base base M power power 1 return result 演演算法 以下程式預設。 import numpy as np Root of Unity 是從 1 到 M1 中選出一個適當的 alpha，其滿足 轉換公式 段落的 5。 def RootOfUnity N M def mod_exp base exp mod result 1 base mod while exp 0 if exp 2 1 If exp is odd result result base mod base base base mod exp 2 return result for r in range 1 M Check integers from 1 to M1 if mod_exp r N M 1 return r Return the first root of unity return None def NTT xNM alpha RootOfUnity N M NInv modInv N M A npones NN for i in range 1N for j in range 1i1 A ij A ij1modExponent alphaiM M A ji A ij return npmatmul Ax M alpha def invNTT xalphaNM alphaInv modInv alpha M NInv modInv N M B npones NN for i in range 1N for j in range 1i1 B ij B ij1modExponent alphaInviM M B ji B ij B B NInv return npmatmul Bx M 參考資料 1 RC Agarval and CS BurrusNumber Theoretic Transforms to Implement Fast Digital Convolution Proc IEEE vol63 no4 pp 550560 Apr 1975 2 I Reed and TK TruongThe use of finite fileds to compute convolution IEEE Trans Info Theory vol21 pp208213 Mar 1975 Category 數字訊號處理 Category 傅立葉分析