説明 このセクションでは、積を計算する方法を示すアルゴリズムの簡略版を示します。1 b {\displaystyle ab} 2つの自然数の1 、 b {\displaystyle a,b} 、形式の数を法とする2 n + 1 2^n+1 、 どこn = 2 k M {\displaystyle n=2^{k}M} は固定された数値です。整数1 、 b {\displaystyle a,b} 分割されるD = 2 k {\displaystyle D=2^{k}} ブロックM {\displaystyle M} ビットなので、実際の実装では、パラメータ間の適切なバランスを取ることが重要です。M 、 k {\displaystyle M,k} いずれにせよ、このアルゴリズムは、2 つの正の整数を乗算する方法を提供します。n {\displaystyle n} 選ばれるのは1 b < 2 n + 1 {\displaystyle ab<2^{n}+1} 。
させてn = D M {\displaystyle n=DM} 信号のビット数とする1 {\displaystyle a} そしてb {\displaystyle b} 、 どこD = 2 k {\displaystyle D=2^{k}} は2のべき乗です。信号を分割します。1 {\displaystyle a} そしてb {\displaystyle b} の中へD {\displaystyle D} ブロックM {\displaystyle M} それぞれビット単位で、結果として得られるブロックを配列として格納します。A 、 B {\displaystyle A,B} (ここでは簡略化のため、これらのエントリを任意精度整数として扱うことにする。)
ここで、フーリエ変換のモジュラスを次のように選択します。M ′ {\displaystyle M'} 次のようなD M ′ ≥ 2 M + k {\displaystyle DM'\geq 2M+k} また、n ′ = D M ′ {\displaystyle n'=DM'} 配列の要素を考慮するA 、 B {\displaystyle A,B} (任意精度)整数モジュロとして2 n ′ + 1 {\displaystyle 2^{n'}+1} 。次の点に注意してください。2 n ′ + 1 ≥ 2 2 M + k + 1 = D 2 2 M + 1 {\displaystyle 2^{n'}+1\geq 2^{2M+k}+1=D2^{2M}+1} 、モジュラスは乗算によって発生する可能性のあるキャリーを収容するのに十分な大きさです。1 {\displaystyle a} そしてb {\displaystyle b} したがって、製品は1 b {\displaystyle ab} (モジュロ)2 n + 1 2^n+1 ) は、 の畳み込みを評価することによって計算できます。A 、 B {\displaystyle A,B} また、g = 2 2 M ′ {\displaystyle g=2^{2M'}} 、 我々は持っていますg D / 2 ≡ − 1 ( モジュール 2 n ′ + 1 ) {\displaystyle g^{D/2}\equiv -1{\pmod {2^{n'}+1}}} 、 などg {\displaystyle g} プリミティブですD {\displaystyle D} 1の平方根を法として2 n ′ + 1 {\displaystyle 2^{n'}+1} 。
次に、配列の離散フーリエ変換を行います。A 、 B {\displaystyle A,B} リングの中でZ / ( 2 n ′ + 1 ) Z {\displaystyle \mathbb {Z} /(2^{n'}+1)\mathbb {Z} } 1の根を用いてg {\displaystyle g} フーリエ基底の場合、変換された配列が得られます。A ^ 、 B ^ {\displaystyle {\widehat {A}},{\widehat {B}}} 。 なぜならD = 2 k {\displaystyle D=2^{k}} これは2のべき乗であり、高速フーリエ変換を 使用することで対数時間で実現できます。
させてC ^ 私 = A ^ 私 B ^ 私 \displaystyle {\widehat {C}}_{i}={\widehat {A}}_{i}{\widehat {B}}_{i}} (点ごとの積)を計算し、逆変換を計算します。C {\displaystyle C} 配列のC ^ {\displaystyle {\widehat {C}}} 再び、一の根号を用いるg {\displaystyle g} 配列C {\displaystyle C} 配列の畳み込みA 、 B {\displaystyle A,B} 最後に、製品は1 b ( モジュール 2 n + 1 ) {\displaystyle ab{\pmod {2^{n}+1}}} 評価によって与えられる 1 b ≡ ∑ j C j 2 M j モジュール 2 n + 1. {\displaystyle ab\equiv \sum _{j}C_{j}2^{Mj}\mod {2^{n}+1}.}
この基本的なアルゴリズムはいくつかの方法で改善できます。まず、数字を保存する必要はなく、1 、 b {\displaystyle a,b} 任意の精度まで、しかし、最大でもn ′ + 1 {\displaystyle n'+1} ビット数を増やすことで、配列のより効率的な機械表現が可能になります。A 、 B {\displaystyle A,B} 第二に、順変換における乗算は単純なビットシフトであることは明らかです。注意すれば、シフトのみを使用して逆変換を計算することも可能になります。したがって、注意すれば、点ごとの積が成り立つ場合を除き、アルゴリズムから真の乗算をすべて排除することが可能です。C ^ 私 = A ^ 私 B ^ 私 \displaystyle {\widehat {C}}_{i}={\widehat {A}}_{i}{\widehat {B}}_{i}} 評価される。したがって、パラメータを選択することが有利である。D 、 M {\displaystyle D,M} これにより、このポイントごとの積は、単一のマシンワードであるか、または(理想的には少数の)ワードの整数を乗算するための最適化されたアルゴリズムを使用することで、効率的に実行できます。パラメータの選択D 、 M {\displaystyle D,M} したがって、これは本手法のさらなる最適化にとって重要な領域である。
詳細 B基数のすべての数は、多項式として表すことができます。
X = ∑ 私 = 0 N x 私 B 私 {\displaystyle X=\sum _{i=0}^{N}{x_{i}B^{i}}} さらに、2つの数の乗算は、2つの多項式の積として考えることができる。
X Y = ( ∑ 私 = 0 N x 私 B 私 ) ( ∑ j = 0 N y 私 B j ) {\displaystyle XY=\left(\sum _{i=0}^{N}{x_{i}B^{i}}\right)\left(\sum _{j=0}^{N}{y_{i}B^{j}}\right)} なぜなら、B k {\displaystyle B^{k}} :c k = ∑ ( 私 、 j ) : 私 + j = k 1 私 b j = ∑ 私 = 0 k 1 私 b k − 私 {\displaystyle c_{k}=\sum _{(i,j):i+j=k}{a_{i}b_{j}}=\sum _{i=0}^{k}{a_{i}b_{ki}}} 畳み込みがあります。
元のバージョンで使用されている NTT (数論的変換 )の代わりにFFT (高速フーリエ変換 ) を使用し、畳み込み規則を用いると、次のようになり ます 。
f ^ ( 1 * b ) = f ^ ( ∑ 私 = 0 k 1 私 b k − 私 ) = f ^ ( 1 ) ・ f ^ ( b ) 。 {\displaystyle {\hat {f}}(a*b)={\hat {f}}\left(\sum _{i=0}^{k}a_{i}b_{ki}\right)={\hat {f}}(a)\bullet {\hat {f}}(b).} つまり、C k = 1 k ・ b k {\displaystyle C_{k}=a_{k}\bullet b_{k}} 、 どこC k {\displaystyle C_{k}} はフーリエ空間における対応する係数です。これは次のようにも表すことができます。fft ( 1 * b ) = fft ( 1 ) ・ fft ( b ) {\displaystyle {\text{fft}}(a*b)={\text{fft}}(a)\bullet {\text{fft}}(b)} 。
フーリエ変換における線形性により係数は同じであり、これらの多項式は係数ごとに一意の項を1つだけ含んでいるため、次のようになります。
f ^ ( x n ) = ( 私 2 π ) n δ ( n ) \displaystyle {\hat {f}}(x^{n})=\left({\frac {i}{2\pi }}\right)^{n}\delta ^{(n)}} そしてf ^ ( 1 X ( ξ ) + b Y ( ξ ) ) = 1 X ^ ( ξ ) + b Y ^ ( ξ ) {\displaystyle {\hat {f}}(a\,X(\xi )+b\,Y(\xi ))=a\,{\hat {X}}(\xi )+b\,{\hat {Y}}(\xi )} 畳み込みルール:f ^ ( X * Y ) = f ^ ( X ) ・ f ^ ( Y ) {\displaystyle {\hat {f}}(X*Y)=\ {\hat {f}}(X)\bullet {\hat {f}}(Y)}
FFTを用いることで、畳み込みの問題を積の問題に還元することができました。
それぞれの多項式補間 のFFTを求めることでC k {\displaystyle C_{k}} これにより、必要な係数を決定できます。
このアルゴリズムは、分割統治法 を用いて問題を複数の部分問題に分割します。
mod N による畳み込みc k = ∑ ( 私 、 j ) : 私 + j ≡ k ( モジュール N ( n ) ) 1 私 b j {\displaystyle c_{k}=\sum _{(i,j):i+j\equiv k{\pmod {N(n)}}}a_{i}b_{j}} 、 どこN ( n ) = 2 n + 1 {\displaystyle N(n)=2^{n}+1} 。許可することで:
1 私 ′ = θ 私 1 私 {\displaystyle a_{i}'=\theta ^{i}a_{i}} そしてb j ′ = θ j b j 、 {\displaystyle b_{j}'=\theta ^{j}b_{j},} どこθ N = − 1 \displaystyle \theta ^{N}=-1} n 乗根であることから、次の ことがわかる。[ 8 ]
C k = ∑ ( 私 、 j ) : 私 + j ≡ k ( モジュール N ( n ) ) 1 私 b j = θ − k ∑ ( 私 、 j ) : 私 + j ≡ k ( モジュール N ( n ) ) 1 私 ′ b j ′ = θ − k ( ∑ ( 私 、 j ) : 私 + j = k 1 私 ′ b j ′ + ∑ ( 私 、 j ) : 私 + j = k + n 1 私 ′ b j ′ ) = θ − k ( ∑ ( 私 、 j ) : 私 + j = k 1 私 b j θ k + ∑ ( 私 、 j ) : 私 + j = k + n 1 私 b j θ n + k ) = ∑ ( 私 、 j ) : 私 + j = k 1 私 b j + θ n ∑ ( 私 、 j ) : 私 + j = k + n 1 私 b j 。 {\displaystyle {\begin{aligned}C_{k}&=\sum _{(i,j):i+j\equiv k{\pmod {N(n)}}}a_{i}b_{j}=\theta ^{-k}\sum _{(i,j):i+j\equiv k{\pmod {N(n)}}}a_{i}'b_{j}'\\[6pt]&=\theta ^{-k}\left(\sum _{(i,j):i+j=k}a_{i}'b_{j}'+\sum _{(i,j):i+j=k+n}a_{i}'b_{j}'\right)\\[6pt]&=\theta ^{-k}\left(\sum _{(i,j):i+j=k}a_{i}b_{j}\theta ^{k}+\sum _{(i,j):i+j=k+n}a_{i}b_{j}\theta ^{n+k}\right)\\[6pt]&=\sum _{(i,j):i+j=k}a_{i}b_{j}+\theta ^{n}\sum _{(i,j):i+j=k+n}a_{i}b_{j}.\end{aligned}}} つまり、重さを使うことができるθ 私 \displaystyle \theta ^{i}} 、そして、θ − k \displaystyle \theta ^{-k}} 後。
重量の代わりに、θ N = − 1 \displaystyle \theta ^{N}=-1} 再帰の最初のステップで(n = N {\displaystyle n=N} ) 計算すると次のようになります。
C k = ∑ ( 私 、 j ) : 私 + j ≡ k ( モジュール N ( N ) ) = ∑ ( 私 、 j ) : 私 + j = k 1 私 b j − ∑ ( 私 、 j ) : 私 + j = k + n 1 私 b j {\displaystyle C_{k}=\sum _{(i,j):i+j\equiv k{\pmod {N(N)}}}=\sum _{(i,j):i+j=k}a_{i}b_{j}-\sum _{(i,j):i+j=k+n}a_{i}b_{j}} 複素数を扱う通常のFFTでは、以下を使用します。
exp ( 2 k π 私 n ) = コス 2 k π n + 私 罪 2 k π n 、 k = 0 、 1 、 … 、 n − 1. {\displaystyle \exp \left({\frac {2k\pi i}{n}}\right)=\cos {\frac {2k\pi }{n}}+i\sin {\frac {2k\pi }{n}},\qquad k=0,1,\dots ,n-1.} C k = θ − k ( ∑ ( 私 、 j ) : 私 + j = k 1 私 b j θ k + ∑ ( 私 、 j ) : 私 + j = k + n 1 私 b j θ n + k ) = e − 私 2 π k / n ( ∑ ( 私 、 j ) : 私 + j = k 1 私 b j e 私 2 π k / n + ∑ ( 私 、 j ) : 私 + j = k + n 1 私 b j e 私 2 π ( n + k ) / n ) {\displaystyle {\begin{aligned}C_{k}&=\theta ^{-k}\left(\sum _{(i,j):i+j=k}a_{i}b_{j}\theta ^{k}+\sum _{(i,j):i+j=k+n}a_{i}b_{j}\theta ^{n+k}\right)\\[6pt]&=e^{-i2\pi k/n}\left(\sum _{(i,j):i+j=k}a_{i}b_{j}e^{i2\pi k/n}+\sum _{(i,j):i+j=k+n}a_{i}b_{j}e^{i2\pi (n+k)/n}\right)\end{aligned}}} しかし、FFTはシェーンハーゲ・シュトラッセンにおけるNTT(数論的変換 )としても使用できます。これは、有限体 (例えば)で数を生成するためにθを 使用する必要があることを意味します。G F ( 2 n + 1 ) {\displaystyle \mathrm {GF} (2^{n}+1)} )
有限体GF( r ) における1の根とは、次の条件を満たす要素 a のことである。θ r − 1 ≡ 1 {\displaystyle \theta ^{r-1}\equiv 1} またはθ r ≡ θ {\displaystyle \theta ^{r}\equiv \theta } 例えば、pが 素数 である場合、 GF( p ) は 次のようになります。{ 1 、 2 、 … 、 p − 1 } {\displaystyle \{1,2,\ldots ,p-1\}} 。
注目してください2 n ≡ − 1 {\displaystyle 2^{n}\equiv -1} でGF ( 2 n + 1 ) {\displaystyle \operatorname {GF} (2^{n}+1)} そして2 ≡ − 1 {\displaystyle {\sqrt {2}}\equiv -1} でGF ( 2 n + 2 + 1 ) {\displaystyle \operatorname {GF} (2^{n+2}+1)} これらの候補者については、θ N ≡ − 1 {\displaystyle \theta ^{N}\equiv -1} 有限の場の下で、したがって我々の望むように行動する。
ただし、 θが 有限体の1の根で ある限り、同じFFTアルゴリズムを引き続き使用できます。
FFT/NTT変換を求めるには、以下の手順を実行します。
C k ′ = f ^ ( k ) = f ^ ( θ − k ( ∑ ( 私 、 j ) : 私 + j = k 1 私 b j θ k + ∑ ( 私 、 j ) : 私 + j = k + n 1 私 b j θ n + k ) ) C k + k ′ = f ^ ( k + k ) = f ^ ( ∑ ( 私 、 j ) : 私 + j = 2 k 1 私 b j θ k + ∑ ( 私 、 j ) : 私 + j = n + 2 k 1 私 b j θ n + k ) = f ^ ( ∑ ( 私 、 j ) : 私 + j = 2 k 1 私 b j θ k + ∑ ( 私 、 j ) : 私 + j = 2 k + n 1 私 b j θ n + k ) = f ^ ( A k ← k ) ・ f ^ ( B k ← k ) + f ^ ( A k ← k + n ) ・ f ^ ( B k ← k + n ) {\displaystyle {\begin{aligned}C_{k}'&={\hat {f}}(k)={\hat {f}}\left(\theta ^{-k}\left(\sum _{(i,j):i+j=k}a_{i}b_{j}\theta ^{k}+\sum _{(i,j):i+j=k+n}a_{i}b_{j}\theta ^{n+k}\right)\right)\\[6pt]C_{k+k}'&={\hat {f}}(k+k)={\hat {f}}\left(\sum _{(i,j):i+j=2k}a_{i}b_{j}\theta ^{k}+\sum _{(i,j):i+j=n+2k}a_{i}b_{j}\theta ^{n+k}\right)\\[6pt]&={\hat {f}}\left(\sum _{(i,j):i+j=2k}a_{i}b_{j}\theta ^{k}+\sum _{(i,j):i+j=2k+n}a_{i}b_{j}\theta ^{n+k}\right)\\[6pt]&={\hat {f}}\left(A_{k\leftarrow k}\right)\bullet {\hat {f}}(B_{k\leftarrow k})+{\hat {f}}(A_{k\leftarrow k+n})\bullet {\hat {f}}(B_{k\leftarrow k+n})\end{aligned}}} 最初の製品はc k {\displaystyle c_{k}} 各k について。2 は、c k {\displaystyle c_{k}} 、 により( 私 + j ) {\displaystyle (i+j)} モジュールN ( n ) {\displaystyle N(n)} 。
逆の操作を行うには:
C k = 2 − m f − 1 ^ ( θ − k C k + k ′ ) {\displaystyle C_{k}=2^{-m}{\hat {f^{-1}}}(\theta ^{-k}C_{k+k}')} またはC k = f − 1 ^ ( θ − k C k + k ′ ) {\displaystyle C_{k}={\hat {f^{-1}}}(\theta ^{-k}C_{k+k}')} データの正規化が必要かどうかによります。
1つは2 − m {\displaystyle 2^{-m}} FFTデータを特定の範囲に正規化するために、1 n ≡ 2 − m モジュール N ( n ) {\displaystyle {\frac {1}{n}}\equiv 2^{-m}{\bmod {N}}(n)} ここで、mは モジュラー乗法逆数 を用いて求められます。
実装の詳細
N = 2 M + 1 mod N となる理由シェーンハーゲ・シュトラッセンアルゴリズムでは、N = 2 M + 1 {\displaystyle N=2^{M}+1} これは、値が にある二分木 と考えるべきです。0 ≤ 索引 ≤ 2 M = 2 私 + j {\displaystyle 0\leq {\text{index}}\leq 2^{M}=2^{i+j}} .K ∈ [ 0 、 M ] {\displaystyle K\in [0,M]} 各K に対して、すべてを見つけることができる私 + j = K {\displaystyle i+j=K} 、そしてすべてをグループ化します( 私 、 j ) {\displaystyle (i,j)} ペアをM個の異なるグループに分けます。私 + j = k {\displaystyle i+j=k} グループ化( 私 、 j ) {\displaystyle (i,j)} 畳み込みによるペア生成は、アルゴリズムにおける古典的な問題である。[ 9 ]
これを踏まえて、N = 2 M + 1 {\displaystyle N=2^{M}+1} グループ化を手伝ってください( 私 、 j ) {\displaystyle (i,j)} の中へM 2 k {\displaystyle {\frac {M}{2^{k}}}} 深さk のサブタスクの各グループをツリーでグループ化し、N = 2 M 2 k + 1 {\displaystyle N=2^{\frac {M}{2^{k}}}+1}
注目してくださいN = 2 M + 1 = 2 2 L + 1 {\displaystyle N=2^{M}+1=2^{2^{L}}+1} あるLに対して。これによりNはフェルマー数 となる。modを実行するとN = 2 M + 1 = 2 2 L + 1 {\displaystyle N=2^{M}+1=2^{2^{L}}+1} フェルマー環が存在する。
フェルマー数の中にはフェルマー素数であるものもあるため、場合によっては計算を省略できる。
もちろん、同じ素数の利点を持つ他のNも使用できます。 N = 2 k − 1 {\displaystyle N=2^{k}-1} バイナリ数 で最大の数を持つk + 1 {\displaystyle k+1} ビット。 N = 2 k − 1 {\displaystyle N=2^{k}-1} はメルセンヌ数であり、場合によってはメルセンヌ素数となる。フェルマー数に対する自然な候補である。N = 2 2 L + 1 {\displaystyle N=2^{2^{L}}+1}
別のN を探して異なるN に対して複数の剰余計算を行うことは、整数積を解く際に役立つことがあります。中国剰余定理を 用いることで、M を より小さな異なるタイプのNに分割した後、乗算 xy [ 10 ] の答えを見つけることができます。
フェルマー数とメルセンヌ数は、一般化フェルマーメルセンヌ数(GSM)と呼ばれるものの2種類の数にすぎません。式は次のとおりです。[ 11 ]
G q 、 p 、 n = ∑ 私 = 1 p q ( p − 私 ) n = q p n − 1 q n − 1 {\displaystyle G_{q,p,n}=\sum _{i=1}^{p}q^{(p-i)n}={\frac {q^{pn}-1}{q^{n}-1}}} M p 、 n = G 2 、 p 、 n {\displaystyle M_{p,n}=G_{2,p,n}} この式では、M 2 、 2 k {\displaystyle M_{2,2^{k}}} はフェルマー数であり、M p 、 1 {\displaystyle M_{p,1}} これはメルセンヌ数です。
この公式は、CRT(中国剰余定理)で使用できる方程式のセットを生成するために使用できます。[ 12 ]
g ( M p 、 n − 1 ) 2 ≡ − 1 ( モジュール M p 、 n ) {\displaystyle g^{\frac {(M_{p,n}-1)}{2}}\equiv -1{\pmod {M_{p,n}}}} ここで、g は、あるx が存在して、 x 2 ≡ g ( モジュール M p 、 n ) {\displaystyle x^{2}\equiv g{\pmod {M_{p,n}}}} 仮定するとN = 2 n {\displaystyle N=2^{n}} さらに;g 2 ( p − 1 ) n − 1 ≡ 1 2 n − 1 ( モジュール M p 、 n ) {\displaystyle g^{2^{(p-1)n}-1}\equiv a^{2^{n}-1}{\pmod {M_{p,n}}}} ここで、a は 要素を生成する要素である。{ 1 、 2 、 4 、 。 。 .2 n − 1 、 2 n } {\displaystyle \{1,2,4,...2^{n-1},2^{n}\}} 周期的に。
もしN = 2 t {\displaystyle N=2^{t}} 、 どこ1 ≤ t ≤ n {\displaystyle 1\leq t\leq n} 、 それからg t = 1 ( 2 n − 1 ) 2 n − t {\displaystyle g_{t}=a^{(2^{n}-1)2^{n-t}}} 。
最適化 このセクションでは、シェーンハーゲ・シュトラッセン法を実装する際に重要な、いくつかの実用的な最適化について説明します。
グランルンドのトリック許可することでm = N + h {\displaystyle m=N+h} 計算できる u v モジュール 2 N + 1 {\displaystyle uv{\bmod {2^{N}+1}}} そして( u モジュール 2 h ) ( v モジュール 2 h ) {\displaystyle (u{\bmod {2^{h}}})(v{\bmod {2}}^{h})} 中国剰余定理(CRT)と組み合わせて、乗算uv の正確な値を求める。[ 19 ]
参考文献 ↑ アーノルド、シェーンハーゲ ;ストラッセン、フォルカー (1971)。 "Schnelle Multiplikation großer Zahlen" [ 大きな数の高速乗算] 。コンピューティング (ドイツ語)。7 ( 3–4 ): 281–292 .土井 : 10.1007/BF02242355。S2CID 9738629。 ↑ カラツバ乗算の漸近的な複雑さは約O ( n 1.58 ) {\displaystyle O(n^{1.58})} トゥーム・クック乗算の漸近的な複雑さは約O ( n 1.46 ) 。 {\displaystyle O(n^{1.46}).}
Van Meter, Rodney; Itoh, Kohei M. (2005). "Fast Quantum Modular Exponentiation". Physical Review . 71 (5) 052320. arXiv : quant-ph/0408006 . Bibcode : 2005PhRvA..71e2320V . doi : 10.1103/PhysRevA.71.052320 . S2CID 14983569 .
さまざまなアルゴリズム間の実用的なクロスオーバーポイントについての議論は、 Magma V2.9 機能の概要、算術セクション にあります。このアーカイブは、2006 年 8 月 20 日にWayback Machine に 保存されました。
ルイス・カルロス・コロナド・ガルシア、「シェーンハーゲ乗算はRSA暗号化または復号化を高速化できるか?アーカイブ済み」、ダルムシュタット工科大学 (2005年)
GNU多倍長整数ライブラリは 、アーキテクチャに応じて、少なくとも 1728 ~ 7808 64 ビットワード (33,000 ~ 150,000 桁の 10 進数) の値にこれを使用します。参照:
「FFT乗算(GNU MP 6.2.1)」 . gmplib.org . 2021年7月20日 取得 。
「MUL_FFT_THRESHOLD」。GMP開発者コーナー 。2010年11月24日のオリジナルからアーカイブ済み。2011年11月3日に 取得。
"MUL_FFT_THRESHOLD" . gmplib.org . 2021-07-20 に取得. ↑ フューラーのアルゴリズムは漸近的に複雑であるO ( n ⋅ ログ n ⋅ 2 Θ ( ログ * n ) ) 。 {\textstyle O{\bigl (}n\cdot \log n\cdot 2^{\Theta (\log ^{*}n)}{\bigr )}.}
Fürer, Martin (2007). "Faster Integer Multiplication" (PDF) . Proc. STOC '07 . Symposium on Theory of Computing, San Diego, Jun 2007. pp. 57–66 . 2007年3月5日のオリジナルからアーカイブ(PDF) . 2007年10月2日 取得 .
Fürer, Martin (2009). "より高速な整数乗算". SIAM Journal on Computing . 39 (3): 979–1005 . doi : 10.1137/070711761 . ISSN 0097-5397 .
フューラーのアルゴリズムは、オープンソースライブラリであるBasic Polynomial Algebra Subprograms (BPAS) で使用されています。参照:Covanov, Svyatoslav; Mohajerani, Davood; Moreno Maza, Marc; Wang, Linxiao (2019-07-08). "Big Prime Field FFT on Multi-core Processors" . Proceedings of the 2019 on International Symposium on Symbolic and Algebraic Computation (PDF) . Beijing China: ACM. pp. 106– 113. doi : 10.1145/3326229.3326273 . ISBN 978-1-4503-6084-5 . S2CID 195848601 . ↑ ハーヴェイ、デヴィッド; ファン・デル・ホーフェン、ジョリス (2021)。 「時間内の整数乗算」 O ( n ログ n ) {\displaystyle O(n\log n)} " (PDF) . Annals of Mathematics . Second Series. 193 (2): 563– 617. doi : 10.4007/annals.2021.193.2.4 . MR 4224716 . S2CID 109934776 . ↑ この方法はINRIAのECMライブラリで使用されています。 ↑ "ECMNET" . members.loria.fr . 2023年4月9日 取得 . ↑ Becker, Hanno; Hwang, Vincent; J. Kannwischer, Matthias; Panny, Lorenz (2022). "数論的変換を用いたやや小さな整数の効率的な乗算" (PDF) 。 ↑ Lüders, Christoph (2014). "Fast Multiplication of Large Integers: Implementation and Analysis of the DKSS Algorithm" .p. 26. ↑ ジョン・クラインバーグ;タルドス、エヴァ (2005)。 アルゴリズム設計 (第 1 版)。ピアソン。 p. 237.ISBN 0-321-29535-8 。↑ ゴードリー、ピリック。アレクサンダー、クルッパ。ポール、ジマーマン (2007)。 「シェーンハーゲ・シュトラッセンの大整数乗算アルゴリズムの GMP ベースの実装」 (PDF) 。 p. 6. ↑ S. Dimitrov, Vassil; V. Cooklev, Todor; D. Donevsky, Borislav (1994). "Generalized Fermat-Mersenne Number Theoretic Transform" . p. 2. ↑ S. Dimitrov, Vassil; V. Cooklev, Todor; D. Donevsky, Borislav (1994). "Generalized Fermat-Mersenne Number Theoretic Transform" . p. 3. ↑ ゴードリー、ピリック。クルッパ、アレクサンダー。ポール・ジマーマン (2007)。 「シェーンハーゲ・シュトラッセンの大整数乗算アルゴリズムの GMP ベースの実装」 (PDF) 。 p. 2. ↑ Lüders, Christoph (2014). "Fast Multiplication of Large Integers: Implementation and Analysis of the DKSS Algorithm" .p. 28. ↑ R. クランドール & C. ポメランス。『素数 ― 計算論的視点 』第2版、シュプリンガー、2005年。第9.5.6節:シェーンハーゲ法、502ページ。ISBN 0-387-94777-9 ↑ クヌース、ドナルド・E. (1997). "§ 4.3.3.C: 離散フーリエ変換" . コンピュータプログラミングの技法 . 第 2巻: 半数値アルゴリズム (第3 版). Addison-Wesley. pp. 305–311 . ISBN 0-201-89684-2 。↑ ゴードリー、ピリック。クルッパ、アレクサンダー。ポール・ジマーマン (2007)。 「シェーンハーゲ・シュトラッセンの大整数乗算アルゴリズムの GMP ベースの実装」 (PDF) 。 p. 7. ↑ ゴードリー、ピリック。クルッパ、アレクサンダー。ポール・ジマーマン (2007)。 「シェーンハーゲ・シュトラッセンの大整数乗算アルゴリズムの GMP ベースの実装」 (PDF) 。 p. 6. ↑ ゴードリー、ピリック。クルッパ、アレクサンダー。ポール・ジマーマン (2007)。 「シェーンハーゲ・シュトラッセンの大整数乗算アルゴリズムの GMP ベースの実装」 (PDF) 。 p. 6.