概要
- RNS
- NTTは DFT の有限体への一般化
- 畳込みは大きな数や長い多項式の乗算に便利
- NTTはKaratsuba法より漸近的に高速.
Complex DFT
- 入力は長さ n の非負ベクトル X
- 1の原始n乗根 ω=en2πi
- 出力 Y(k) は X(0)ω0k+X(1)ω1k⋯X(n−1)ω(n−1)k となる
- 逆変換は X(k)n=Y(0)ω−0k⋯Y(n−1)ω−(n−1)k で復元
Procedure for the NTT
- 入力は非負ベクトル (サイズ n)
- どの要素よりもおおきい M を最小モジュラスとする
- N:=kn+1 な 素数 N をモジュラス (N≥M) を選ぶ(ディリクレの定理により存在する)
- N 素数より乗法群 ZN は位数 N−1=kn, 最低でも一つの生成元 g があり N−1番目の原始根.
- ω≡gk(modN) を定義すると ωn=gkn=gN−1≡1(modN), ω は1の原始n乗根
::: info
別に N は素数じゃなくてもいい GF(28) とか
:::
例
-
X=(6,0,10,7,2)
-
M=11 とする
-
k=2 のとき N=kn+1=11, N は素数で N≥M=11
-
Z11 の根を探す.
N−1=2×5 より
a=6 のとき, a5≡10≡1mod11 かつ a2≡3≡1mod11 なので g=6
-
ω=gk=62≡3(mod11) 5番目の根
-
Y を計算

Y=(8,0,6,2,10)
逆元 n−1=5−1≡9 をかけると
(8,0,6,2,10)×9≡(6,0,10,7,2)
畳込みの例
X=(4,1,4,2,1,3,5,6)
Y=(6,1,8,0,3,3,9,8)
n=8
- M=92∗8+1=649
(一桁(<10)の掛け算が8個なのでmax:648)
- k=84, N=84×8+1=643, N 素数.
- 8乗根をもとめたい,
643−1=2∗3∗107 より??? a=326 とすると a8≡1 && a4≡1 なので ω=326.
- NTT変換
X′=NTT(X)=(26,338,228,115,2,457,437,448)
Y′=NTT(Y)=(38,594,224,157,14,201,433,406).
- 積はmod649 でpointer-wise multiplication
Z′=X′Y′=(315,218,597,557,28,329,108,178)
- 逆NTT変換をして多項式の積を得る
Z=INTT(Z′)=(123,120,106,92,139,144,140,124)
参考文献