トネリ・シャンクスのアルゴリズム (英:Tonelli-Shanks algorithm 、シャンクス自身は RESSOL アルゴリズムと呼んでいる) は、奇素数
p
{\displaystyle p}
を法とする合同算術 (剰余算、モジュラー算法、mod算) において、与えられた整数
n
{\displaystyle n}
(平方剰余 ) について合同式
r
2
=
n
(
mod
p
)
{\displaystyle r^{2}=n{\pmod {p}}}
の解(つまり
n
{\displaystyle n}
の平方根
r
{\displaystyle r}
)を多項式時間 (
O
(
(
log
2
p
)
4
)
{\displaystyle O({(\log _{2}p)}^{4})}
のオーダー)で求めるためのアルゴリズム である。
このアルゴリズムは合成数 を法とする場合には使えない:合成数を法とする平方根を求めることは、素因数分解 と同等の計算問題である [ 2] 。
このアルゴリズムと同等だがやや冗長なバージョンが、1891年にアルベルト・トネリ(イタリア語版 ) によって開発された [ 3] [ 4] 。
本稿で説明するバージョンは、1973年にダニエル・シャンクス(英語版 ) によって独立して開発されたものであり、シャンクスは次のように釈明している。
私がこれらの歴史的文献を知るのが遅れたのは、ディクソン の 数論の歴史 の第1巻を友人に貸してしまい、返ってこなかったためである[ 5] 。
ディクソン によれば、 トネリの(オリジナルの)アルゴリズムは、素数を法とした場合以外に、素数の累乗
p
λ
{\displaystyle p^{\lambda }}
を法とした場合でも
x
{\displaystyle x}
の平方根を求めることができる[ 4] 。
予備知識
整数 全体
Z
{\displaystyle \mathbb {Z} }
は代数 的には環 (有理整数環 )を成しており、素数
p
{\displaystyle p}
の倍数の集合
p
Z
{\displaystyle p\mathbb {Z} }
は
Z
{\displaystyle \mathbb {Z} }
の極大イデアル を成している。
Z
/
p
Z
{\displaystyle \mathbb {Z} /p\mathbb {Z} }
は 0 から
p
−
1
{\displaystyle p-1}
の整数で構成される集合であるが、これは有限体 を成しており、
F
p
{\displaystyle \mathbf {F} _{p}}
と表記される。ただし、
F
p
{\displaystyle \mathbf {F} _{p}}
における加法と乗法は、
Z
{\displaystyle \mathbb {Z} }
における
p
{\displaystyle p}
を法とする剰余算(モジュラー算法、mod算)と同じものになる。以降、
F
p
{\displaystyle \mathbf {F} _{p}}
における演算は mod算の形式で表記することにする(
r
2
=
n
(
mod
p
)
{\displaystyle r^{2}=n{\pmod {p}}}
など)。
F
p
{\displaystyle \mathbf {F} _{p}}
においては
−
1
=
p
−
1
(
mod
p
)
{\displaystyle -1=p-1{\pmod {p}}}
である。
F
p
{\displaystyle \mathbf {F} _{p}}
から 0 を除いた集合を
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
と表記することにすれば、
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
は
F
p
{\displaystyle \mathbf {F} _{p}}
の乗法について位数が
p
−
1
{\displaystyle p-1}
の巡回群 (pを法とする整数の乗法群 )を成す。従って、
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の任意の元
n
{\displaystyle n}
について、
n
p
−
1
=
1
(
mod
p
)
{\displaystyle n^{p-1}=1{\pmod {p}}}
が成り立つ。これをフェルマーの小定理 と呼ぶ。
以降、
p
{\displaystyle p}
は奇素数(2ではない素数)とする。
p
−
1
{\displaystyle p-1}
は0でない偶数であるから
p
−
1
2
{\displaystyle {\frac {p-1}{2}}}
は 0 でない整数となる。
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の任意の元
n
{\displaystyle n}
について、
(
n
p
−
1
2
)
2
=
n
p
−
1
=
1
(
mod
p
)
{\displaystyle (n^{\frac {p-1}{2}})^{2}=n^{p-1}=1{\pmod {p}}}
である。
F
p
{\displaystyle \mathbf {F} _{p}}
は体であるから、
x
2
=
1
(
mod
p
)
{\displaystyle x^{2}=1{\pmod {p}}}
の解は
x
=
±
1
(
mod
p
)
{\displaystyle x=\pm 1{\pmod {p}}}
のみである。従って、
n
p
−
1
2
=
±
1
(
mod
p
)
{\displaystyle n^{\frac {p-1}{2}}=\pm 1{\pmod {p}}}
である。
オイラーの規準 によれば、
n
{\displaystyle n}
が
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
で平方根を持つ(つまり、
n
{\displaystyle n}
が平方剰余 である)のは、次の場合のみである。
n
p
−
1
2
=
1
(
mod
p
)
{\displaystyle n^{\frac {p-1}{2}}=1{\pmod {p}}}
一方、
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の元
z
{\displaystyle z}
が
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
で平方根を持たない場合(つまり、
z
{\displaystyle z}
が平方非剰余 である)、オイラーの規準によれば、次のようになる。
z
p
−
1
2
=
−
1
(
mod
p
)
{\displaystyle z^{\frac {p-1}{2}}=-1{\pmod {p}}}
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
は位数
p
−
1
{\displaystyle p-1}
の巡回群であり、その正確に半数が平方非剰余であるので、このような
z
{\displaystyle z}
を見つけるのは難しくない。したがって、以降、このような平方非剰余に常にアクセスできると仮定する。群論的には、全ての平方非剰余は巡回群
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の生成元である。
以降、
n
p
−
1
2
=
1
(
mod
p
)
{\displaystyle n^{\frac {p-1}{2}}=1{\pmod {p}}}
を満たす(つまり平方剰余である)
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の元
n
{\displaystyle n}
の
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
における平方根を求めるものとする。
p
=
3
(
mod
4
)
{\displaystyle p=3{\pmod {4}}}
となる素数に対しては、トネリ・シャンクスのアルゴリズムを用いなくても、
r
=
±
n
p
+
1
4
(
mod
p
)
{\displaystyle r=\pm n^{\frac {p+1}{4}}{\pmod {p}}}
と置けば、
r
2
=
(
n
p
+
1
4
)
2
=
n
p
−
1
2
+
1
=
n
p
−
1
2
⋅
n
=
n
(
mod
p
)
{\displaystyle r^{2}=(n^{\frac {p+1}{4}})^{2}=n^{{\frac {p-1}{2}}+1}=n^{\frac {p-1}{2}}\cdot n=n{\pmod {p}}}
であるから、
r
{\displaystyle r}
が求める
n
{\displaystyle n}
の平方根である。
以降は、
p
=
1
(
mod
4
)
{\displaystyle p=1{\pmod {4}}}
となる素数
p
{\displaystyle p}
について考える。
p
−
1
{\displaystyle p-1}
は、2 で繰り返し割ることで、
Q
2
S
{\displaystyle Q2^{S}}
と表すことができる。ここで
Q
{\displaystyle Q}
は奇数、
S
{\displaystyle S}
は非負整数とする。
p
=
1
(
mod
4
)
{\displaystyle p=1{\pmod {4}}}
であるから
p
−
1
{\displaystyle p-1}
は 4 の倍数である。従って、
S
{\displaystyle S}
の最小値は 2 となる。
R
=
n
Q
+
1
2
(
mod
p
)
{\displaystyle R=n^{\frac {Q+1}{2}}{\pmod {p}}}
とすると、
R
2
=
n
Q
+
1
=
(
n
)
(
n
Q
)
(
mod
p
)
{\displaystyle R^{2}=n^{Q+1}=(n)(n^{Q}){\pmod {p}}}
となる。
t
=
n
Q
(
mod
p
)
{\displaystyle t=n^{Q}{\pmod {p}}}
と置く。
t
=
1
(
mod
p
)
{\displaystyle t=1{\pmod {p}}}
であれば、
R
{\displaystyle R}
は
n
{\displaystyle n}
の平方根となる。それ以外の場合、
R
{\displaystyle R}
と
t
{\displaystyle t}
は次式を満たす。
R
2
=
n
t
(
mod
p
)
{\displaystyle R^{2}=nt{\pmod {p}}}
;かつ
t
2
S
−
1
=
n
Q
2
S
−
1
=
n
p
−
1
2
=
1
(
mod
p
)
{\displaystyle t^{2^{S-1}}=n^{Q2^{S-1}}=n^{\frac {p-1}{2}}=1{\pmod {p}}}
これを群論的に考えると、
t
{\displaystyle t}
は巡回群
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の元であり、その位数は
2
S
−
1
{\displaystyle 2^{S-1}}
の約数ということである。この位数を
2
M
{\displaystyle 2^{M}}
(
M
{\displaystyle M}
は整数)と置けば、
1
≤
M
≤
S
−
1
{\displaystyle 1\leq M\leq S-1}
である(
M
{\displaystyle M}
が 0 の場合、
t
{\displaystyle t}
の位数は 1 となるが
t
≠
1
{\displaystyle t\neq 1}
を仮定しているので、これはあり得ないことになる)。
M
{\displaystyle M}
の値は
t
{\displaystyle t}
を順次2乗することで得られる(最初に1になるまでに2乗した回数が
M
{\displaystyle M}
となる)。
(
t
2
(
M
−
1
)
)
2
=
t
2
M
=
1
(
mod
p
)
{\displaystyle (t^{2^{(M-1)}})^{2}=t^{2^{M}}=1{\pmod {p}}}
であるから、前節で説明したように、
t
2
(
M
−
1
)
=
±
1
(
mod
p
)
{\displaystyle t^{2^{(M-1)}}=\pm 1{\pmod {p}}}
である。
t
2
(
M
−
1
)
=
1
(
mod
p
)
{\displaystyle t^{2^{(M-1)}}=1{\pmod {p}}}
であれば、
t
{\displaystyle t}
の位数は
2
(
M
−
1
)
{\displaystyle 2^{(M-1)}}
となるので仮定に反する。従って
t
2
(
M
−
1
)
=
−
1
(
mod
p
)
{\displaystyle t^{2^{(M-1)}}=-1{\pmod {p}}}
でなければならない。
ここでもし、-1 の
2
M
{\displaystyle 2^{M}}
乗根となるような
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の元
b
{\displaystyle b}
が存在するとしよう。
b
2
M
=
(
b
2
)
2
(
M
−
1
)
=
−
1
(
mod
p
)
{\displaystyle b^{2^{M}}=(b^{2})^{2^{(M-1)}}=-1{\pmod {p}}}
であるから
t
2
(
M
−
1
)
(
b
2
)
2
(
M
−
1
)
=
1
(
mod
p
)
{\displaystyle t^{2^{(M-1)}}(b^{2})^{2^{(M-1)}}=1{\pmod {p}}}
である。
R
{\displaystyle R}
、
t
{\displaystyle t}
と
b
{\displaystyle b}
の関係は次のようになる。
(
R
b
)
2
=
n
t
⋅
b
2
=
n
(
t
⋅
b
2
)
(
mod
p
)
{\displaystyle (Rb)^{2}=nt\cdot b^{2}=n(t\cdot b^{2}){\pmod {p}}}
;かつ
(
t
⋅
b
2
)
2
(
M
−
1
)
=
1
(
mod
p
)
{\displaystyle (t\cdot b^{2})^{2^{(M-1)}}=1{\pmod {p}}}
。従って、
t
⋅
b
2
{\displaystyle t\cdot b^{2}}
の位数は
2
(
M
−
1
)
{\displaystyle 2^{(M-1)}}
の約数である。
t
⋅
b
2
{\displaystyle t\cdot b^{2}}
の位数を
2
M
′
{\displaystyle 2^{M'}}
と置く。
M
′
{\displaystyle M'}
は明らかに
M
{\displaystyle M}
より小さい整数である。
M
′
{\displaystyle M'}
の値は
t
b
2
{\displaystyle tb^{2}}
を順次2乗することで得られる(最初に1になるまでに2乗した回数が
M
′
{\displaystyle M'}
となる)。
R
b
{\displaystyle Rb}
、
t
⋅
b
2
{\displaystyle t\cdot b^{2}}
、
M
′
{\displaystyle M'}
を新たに
R
{\displaystyle R}
、
t
{\displaystyle t}
、
M
{\displaystyle M}
と書き換えて、以降同じ手順を
M
{\displaystyle M}
が 0 となるまで繰り返せば、
t
=
1
(
mod
p
)
{\displaystyle t=1{\pmod {p}}}
となり、
R
2
=
n
t
=
n
(
mod
p
)
{\displaystyle R^{2}=nt=n{\pmod {p}}}
となるので、このときの
R
{\displaystyle R}
が求めていた
n
{\displaystyle n}
の平方根となる。
以上のアルゴリズムを群論的に要約すれば、各ステップでは、
t
{\displaystyle t}
の正確な位数を測定し、同じ位数の要素を乗算することで、
t
{\displaystyle t}
をより小さな位数の部分群の生成元に書き換えるということである。
では、-1 の
2
M
{\displaystyle 2^{M}}
乗根となるような都合の良い
b
{\displaystyle b}
をどのように見つけるかが次の問題になるが、これを解決するためのトリックは、既知の平方非剰余である
z
{\displaystyle z}
を利用することである。上に示した
z
{\displaystyle z}
にオイラーの規準を適用すると、
z
Q
{\displaystyle z^{Q}}
は -1 の
2
S
−
1
{\displaystyle 2^{S-1}}
乗根であることが示される。したがって、
(
z
Q
)
2
S
−
1
=
z
Q
⋅
2
S
−
1
=
−
1
=
b
2
M
(
mod
p
)
{\displaystyle (z^{Q})^{2^{S-1}}=z^{Q\cdot 2^{S-1}}=-1=b^{2^{M}}{\pmod {p}}}
であるから
b
=
(
z
Q
)
2
S
−
1
−
M
(
mod
p
)
{\displaystyle b=(z^{Q})^{2^{S-1-M}}{\pmod {p}}}
と置けば良いことが分かる。
以上がこのアルゴリズムのアウトラインである。
アルゴリズム
入力
p
{\displaystyle p}
:
p
=
1
(
mod
4
)
{\displaystyle p=1{\pmod {4}}}
を満たす素数
n
{\displaystyle n}
:
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の平方剰余
出力
r
{\displaystyle r}
:
r
2
=
n
(
mod
p
)
{\displaystyle r^{2}=n{\pmod {p}}}
を満たす
F
p
{\displaystyle \mathbf {F} _{p}}
の元
入力チェック
n
=
0
(
mod
p
)
{\displaystyle n=0{\pmod {p}}}
の場合、
r
=
0
{\displaystyle r=0}
を返して終了。
n
{\displaystyle n}
が平方剰余でない場合(オイラー規準でチェック)、エラーを返して終了。
p
{\displaystyle p}
が奇素数でない場合、エラーを返して終了。
p
=
3
(
mod
4
)
{\displaystyle p=3{\pmod {4}}}
の場合、
r
=
n
p
+
1
4
(
mod
p
)
{\displaystyle r=n^{\frac {p+1}{4}}{\pmod {p}}}
を返して終了。
初期設定
p
−
1
{\displaystyle p-1}
を 2 で繰り返し割って、
p
−
1
=
Q
2
S
{\displaystyle p-1=Q2^{S}}
となる 奇数
Q
{\displaystyle Q}
と 整数
S
{\displaystyle S}
を求める。
F
p
×
{\displaystyle {\mathbf {F} _{p}}^{\times }}
の平方非剰余を1つ探し
z
{\displaystyle z}
と置く。(
z
p
−
1
2
=
−
1
(
mod
p
)
{\displaystyle z^{\frac {p-1}{2}}=-1{\pmod {p}}}
)
ループ変数
t
,
M
,
R
,
c
{\displaystyle t,\,M,\,R,\,c\,}
初期値設定
M
=
S
(
mod
p
)
{\displaystyle M=S{\pmod {p}}}
t
=
n
Q
(
mod
p
)
{\displaystyle t=n^{Q}{\pmod {p}}}
n
{\displaystyle n}
は平方剰余であるので、
t
2
(
M
−
1
)
=
(
n
Q
)
2
(
S
−
1
)
=
n
Q
2
(
S
−
1
)
=
n
p
−
1
2
=
1
(
mod
p
)
{\displaystyle t^{2^{(M-1)}}=(n^{Q})^{2^{(S-1)}}=n^{Q2^{(S-1)}}=n^{\frac {p-1}{2}}=1{\pmod {p}}}
である。
R
=
n
Q
+
1
2
(
mod
p
)
{\displaystyle R=n^{\frac {Q+1}{2}}{\pmod {p}}}
(
R
2
=
t
n
(
mod
p
)
{\displaystyle R^{2}=tn{\pmod {p}}}
)
c
=
(
z
Q
)
2
S
−
1
(
mod
p
)
{\displaystyle c=(z^{Q})^{2^{S-1}}{\pmod {p}}}
z
{\displaystyle z}
は平方非剰余であるので、
c
2
(
M
−
1
)
=
(
z
Q
)
2
(
S
−
1
)
=
z
Q
2
(
S
−
1
)
=
z
p
−
1
2
=
−
1
(
mod
p
)
{\displaystyle c^{2^{(M-1)}}=(z^{Q})^{2^{(S-1)}}=z^{Q2^{(S-1)}}=z^{\frac {p-1}{2}}=-1{\pmod {p}}}
である。
ループ不変条件 ループの各反復処理の開始時には、ループ変数間で以下の関係式(ループ不変条件 )が成立する。
t
2
(
M
−
1
)
=
1
(
mod
p
)
{\displaystyle t^{2^{(M-1)}}=1{\pmod {p}}}
R
2
=
t
n
(
mod
p
)
{\displaystyle R^{2}=tn{\pmod {p}}}
c
2
(
M
−
1
)
=
−
1
(
mod
p
)
{\displaystyle c^{2^{(M-1)}}=-1{\pmod {p}}}
ループ
t
=
1
{\displaystyle t=1}
の場合、
r
=
R
{\displaystyle r=R}
を返して終了(ループ終了条件)。
ループ不変条件の
R
2
=
t
n
(
mod
p
)
{\displaystyle R^{2}=tn{\pmod {p}}}
から
R
2
=
n
(
mod
p
)
{\displaystyle R^{2}=n{\pmod {p}}}
t
{\displaystyle t}
を繰り返して2乗し、
t
2
M
′
=
1
(
mod
p
)
{\displaystyle t^{2^{M'}}=1{\pmod {p}}}
となる最小の非負整数
M
′
{\displaystyle M'}
を求める。
t
2
(
M
′
−
1
)
=
−
1
(
mod
p
)
{\displaystyle t^{2^{(M'-1)}}=-1{\pmod {p}}}
b
=
c
2
(
M
−
1
−
M
′
)
(
mod
p
)
{\displaystyle b=c^{2^{(M-1-M')}}{\pmod {p}}}
とする。
ループ不変条件の
c
2
(
M
−
1
)
=
−
1
(
mod
p
)
{\displaystyle c^{2^{(M-1)}}=-1{\pmod {p}}}
から
(
b
2
)
=
c
2
(
M
−
M
′
)
(
mod
p
)
{\displaystyle (b^{2})=c^{2^{(M-M')}}{\pmod {p}}}
、 従って
(
b
2
)
2
M
′
−
1
=
c
2
(
M
−
1
)
=
−
1
(
mod
p
)
{\displaystyle (b^{2})^{2^{M'-1}}=c^{2^{(M-1)}}=-1{\pmod {p}}}
t
2
(
M
′
−
1
)
(
b
2
)
2
(
M
′
−
1
)
=
(
−
1
)
(
−
1
)
=
1
(
mod
p
)
{\displaystyle t^{2^{(M'-1)}}(b^{2})^{2^{(M'-1)}}=(-1)(-1)=1{\pmod {p}}}
、従って
(
t
b
2
)
2
(
M
′
−
1
)
=
1
(
mod
p
)
{\displaystyle (tb^{2})^{2^{(M'-1)}}=1{\pmod {p}}}
。 ループ不変条件の
R
2
=
t
n
(
mod
p
)
{\displaystyle R^{2}=tn{\pmod {p}}}
から
(
R
b
)
2
=
t
b
2
n
(
mod
p
)
{\displaystyle (Rb)^{2}=tb^{2}n{\pmod {p}}}
。
ループ変数を更新。
M
←
M
′
{\displaystyle M\leftarrow M'}
t
←
t
b
2
{\displaystyle t\leftarrow tb^{2}}
R
←
R
b
{\displaystyle R\leftarrow Rb}
c
←
b
2
{\displaystyle c\leftarrow b^{2}}
更新されたループ変数はループ不変条件を満たしている。ループ不変条件の
t
2
(
M
−
1
)
=
1
(
mod
p
)
{\displaystyle t^{2^{(M-1)}}=1{\pmod {p}}}
から
M
′
{\displaystyle M'}
は更新前の
M
−
1
{\displaystyle M-1}
以下であり、
M
{\displaystyle M}
は各反復で厳密に小さくなるため、アルゴリズムは停止することが保証される。
例
合同式 r 2 ≡ 5 (mod 41) を解く。41 は要求どおり素数であり、41 ≡ 1 (mod 4) を満たす。5 はオイラーの基準により平方剰余である:
5
41
−
1
2
=
5
20
=
1
{\displaystyle 5^{\frac {41-1}{2}}=5^{20}=1}
(前述と同様に、
(
Z
/
41
Z
)
×
{\displaystyle (\mathbb {Z} /41\mathbb {Z} )^{\times }}
内の演算は暗黙的に mod 41 である)。
p
−
1
=
40
=
5
⋅
2
3
{\displaystyle p-1=40=5\cdot 2^{3}}
なので、
Q
←
5
{\displaystyle Q\leftarrow 5}
、
S
←
3
{\displaystyle S\leftarrow 3}
z の値を求める。
2
41
−
1
2
=
1
{\displaystyle 2^{\frac {41-1}{2}}=1}
なので、2 はオイラーの定理により平方剰余である。
3
41
−
1
2
=
40
=
−
1
{\displaystyle 3^{\frac {41-1}{2}}=40=-1}
なので、3 は平方剰余ではない。set
z
←
3
{\displaystyle z\leftarrow 3}
Set
M
←
S
=
3
{\displaystyle M\leftarrow S=3}
c
←
z
Q
=
3
5
=
38
{\displaystyle c\leftarrow z^{Q}=3^{5}=38}
t
←
n
Q
=
5
5
=
9
{\displaystyle t\leftarrow n^{Q}=5^{5}=9}
R
←
n
Q
+
1
2
=
5
5
+
1
2
=
2
{\displaystyle R\leftarrow n^{\frac {Q+1}{2}}=5^{\frac {5+1}{2}}=2}
Loop:
最初の反復:
t
≠
1
{\displaystyle t\neq 1}
なので、まだ終了していない
t
2
1
=
40
{\displaystyle t^{2^{1}}=40}
、
t
2
2
=
1
{\displaystyle t^{2^{2}}=1}
なので、
i
←
2
{\displaystyle i\leftarrow 2}
b
←
c
2
M
−
i
−
1
=
38
2
3
−
2
−
1
=
38
{\displaystyle b\leftarrow c^{2^{M-i-1}}=38^{2^{3-2-1}}=38}
M
←
i
=
2
{\displaystyle M\leftarrow i=2}
c
←
b
2
=
38
2
=
9
{\displaystyle c\leftarrow b^{2}=38^{2}=9}
t
←
t
b
2
=
9
⋅
9
=
40
{\displaystyle t\leftarrow tb^{2}=9\cdot 9=40}
R
←
R
b
=
2
⋅
38
=
35
{\displaystyle R\leftarrow Rb=2\cdot 38=35}
2回目の反復:
t
≠
1
{\displaystyle t\neq 1}
なので、まだ完了していない
t
2
1
=
1
{\displaystyle t^{2^{1}}=1}
なので
i
←
1
{\displaystyle i\leftarrow 1}
b
←
c
2
M
−
i
−
1
=
9
2
2
−
1
−
1
=
9
{\displaystyle b\leftarrow c^{2^{M-i-1}}=9^{2^{2-1-1}}=9}
M
←
i
=
1
{\displaystyle M\leftarrow i=1}
c
←
b
2
=
9
2
=
40
{\displaystyle c\leftarrow b^{2}=9^{2}=40}
t
←
t
b
2
=
40
⋅
40
=
1
{\displaystyle t\leftarrow tb^{2}=40\cdot 40=1}
R
←
R
b
=
35
⋅
9
=
28
{\displaystyle R\leftarrow Rb=35\cdot 9=28}
3回目の反復:
t
=
1
{\displaystyle t=1}
となり、終了。
r
=
R
=
28
{\displaystyle r=R=28}
を返す。
確かに、282 ≡ 5 (mod 41) であり、(-28)2 ≡ 132 ≡ 5 (mod 41) である。したがって、このアルゴリズムは、合同式の2つの解を正しく導出している。
アルゴリズムの速度
トネリ・シャンクスのアルゴリズムは、(すべての可能な入力(平方剰余と平方非剰余)にわたって平均すると)
2
m
+
2
k
+
S
(
S
−
1
)
4
+
1
2
S
−
1
−
9
{\displaystyle 2m+2k+{\frac {S(S-1)}{4}}+{\frac {1}{2^{S-1}}}-9}
回の剰余乗算を必要とする。ここで、
m
{\displaystyle m}
は
p
{\displaystyle p}
の2進表現の桁数、
k
{\displaystyle k}
は
p
{\displaystyle p}
の2進表現における1の数である。必要な平方非剰余
z
{\displaystyle z}
を、ランダムに取った数
y
{\displaystyle y}
が平方非剰余かどうかを調べることによって求める場合、(平均して) 2回のルジャンドル記号 の計算が必要である [ 6] 。 ルジャンドル記号 の2 回の計算の平均は次のように説明される。
y
{\displaystyle y}
は、確率
p
+
1
2
p
=
1
+
1
p
2
{\displaystyle {\tfrac {\tfrac {p+1}{2}}{p}}={\tfrac {1+{\tfrac {1}{p}}}{2}}}
で平方剰余になる。これは
1
{\displaystyle 1}
より小さいが、
≥
1
2
{\displaystyle \geq {\tfrac {1}{2}}}
である。したがって、平均すると
y
{\displaystyle y}
が平方剰余であるかどうかを 2 回確認する必要がある。
これは本質的に、法
p
{\displaystyle p}
がランダムである場合、つまり
S
{\displaystyle S}
が
p
{\displaystyle p}
の2進表現の桁数に対してそれほど大きくない場合、トネリ・シャンクスのアルゴリズムが非常にうまく機能することを示している。前述のように、Cipollaのアルゴリズム は、
S
(
S
−
1
)
>
8
m
+
20
{\displaystyle S(S-1)>8m+20}
の場合(そしてその場合のみ)、トネリ・シャンクスのアルゴリズムよりもうまく機能しする。 しかし、代わりにサザーランドのアルゴリズムを使用して
F
p
∗
{\displaystyle \mathbb {F} _{p}^{\ast }}
の 2-シロー部分群 における離散対数 計算を実行する場合、
S
(
S
−
1
)
{\displaystyle S(S-1)}
を
O
(
S
log
S
/
log
log
S
)
{\displaystyle O(S\log S/\log \log S)}
によって漸近的に制限される式に置き換えることができる [ 7] 。 明示的には、
c
e
≡
n
Q
{\displaystyle c^{e}\equiv n^{Q}}
となるような
e
{\displaystyle e}
を計算し、
R
≡
c
−
e
/
2
n
(
Q
+
1
)
/
2
{\displaystyle R\equiv c^{-e/2}n^{(Q+1)/2}}
が
R
2
≡
n
{\displaystyle R^{2}\equiv n}
を満たすようにする(
n
{\displaystyle n}
は平方剰余なので、
e
{\displaystyle e}
は2の倍数であることに注意)。
このアルゴリズムでは、平方剰余でない数
z
{\displaystyle z}
を求める必要がある。このような
z
{\displaystyle z}
を多項式時間で求める決定論的アルゴリズムは知られていない。しかし、一般化されたリーマン予想 が正しい場合、平方非剰余
z
<
2
ln
2
p
{\displaystyle z<2\ln ^{2}{p}}
、 [ 8] が存在し、上記の限度まですべての
z
{\displaystyle z}
をチェックし、多項式時間 内で適切な
z
{\displaystyle z}
を見つけることができる。ただし、これは最悪のシナリオであることに留意してしてもらいたい。一般に、
z
{\displaystyle z}
は上記のように平均 2 回の試行(つまり確率1/2)で見つかる。
利用
トネリ・シャンクスのアルゴリズムは(当然のことながら)素数を法とする平方根が必要となるあらゆる処理に使用できる。例えば、楕円曲線 上の点を求めるのに使用できる。また、デジタル署名 におけるラビン署名アルゴリズム や、素因数分解 における二次ふるい法 のふるい分けステップの計算においても有用である。
一般化
トネリ・シャンクスのアルゴリズムは、任意の巡回群(
(
Z
/
p
Z
)
×
{\displaystyle (\mathbb {Z} /p\mathbb {Z} )^{\times }}
の代わりに)と任意の整数 k に対する k乗根、特に有限体 の元のk乗根を求めることに一般化できる [ 9] 。
同一の巡回群において多数の平方根を求める必要があり、Sがそれほど大きくない場合、2乗位数の元の平方根の表を事前に用意しておくことで、アルゴリズムを以下のように簡略化・高速化でる。
p − 1 から 2 のべき乗を因数分解する。Q と S を次のように定義する。
p
−
1
=
Q
2
S
{\displaystyle p-1=Q2^{S}}
(Q は奇数)
R
←
n
Q
+
1
2
,
t
←
n
Q
≡
R
2
/
n
{\displaystyle R\leftarrow n^{\frac {Q+1}{2}},t\leftarrow n^{Q}\equiv R^{2}/n}
とする
表から
b
{\displaystyle b}
を求め、
b
2
≡
t
{\displaystyle b^{2}\equiv t}
とし、
R
≡
R
/
b
{\displaystyle R\equiv R/b}
とする
R を返す。
トネリのアルゴリズムは法 pλ でも適用可能
ディクソンの「数論」[ 4] によれば、
A. トネリ[ 10] は、
x
2
=
c
(
mod
p
λ
)
{\displaystyle x^{2}=c{\pmod {p^{\lambda }}}}
の平方根について明確な公式を与えた[ 4] 。
ディクソンの文献には、
x
2
mod
p
λ
{\displaystyle x^{2}{\bmod {p^{\lambda }}}}
の平方根について次の公式が示されている。
p
=
4
⋅
7
+
1
{\displaystyle p=4\cdot 7+1}
、または
s
=
2
{\displaystyle s=2}
(この式ではsは2でなければならない)かつ
a
=
7
{\displaystyle a=7}
であって
29
=
2
2
⋅
7
+
1
{\displaystyle 29=2^{2}\cdot 7+1}
となる場合
x
2
mod
p
λ
≡
c
{\displaystyle x^{2}{\bmod {p^{\lambda }}}\equiv c}
の場合
x
mod
p
λ
≡
±
(
c
a
+
3
)
β
⋅
c
(
β
+
1
)
/
2
{\displaystyle x{\bmod {p^{\lambda }}}\equiv \pm (c^{a}+3)^{\beta }\cdot c^{(\beta +1)/2}}
、ただし
β
≡
a
⋅
p
λ
−
1
{\displaystyle \beta \equiv a\cdot p^{\lambda -1}}
となる場合
23
2
mod
29
3
≡
529
{\displaystyle 23^{2}{\bmod {29^{3}}}\equiv 529}
であること、また
β
=
7
⋅
29
2
{\displaystyle \beta =7\cdot 29^{2}}
のとき
(
529
7
+
3
)
7
⋅
29
2
⋅
529
(
7
⋅
29
2
+
1
)
/
2
mod
29
3
≡
24366
≡
−
23
{\displaystyle (529^{7}+3)^{7\cdot 29^{2}}\cdot 529^{(7\cdot 29^{2}+1)/2}{\bmod {29^{3}}}\equiv 24366\equiv -23}
別の例を挙げると:
2333
2
mod
29
3
≡
4142
{\displaystyle 2333^{2}{\bmod {29^{3}}}\equiv 4142}
そして
(
4142
7
+
3
)
7
⋅
29
2
⋅
4142
(
7
⋅
29
2
+
1
)
/
2
mod
29
3
≡
2333
{\displaystyle (4142^{7}+3)^{7\cdot 29^{2}}\cdot 4142^{(7\cdot 29^{2}+1)/2}{\bmod {29^{3}}}\equiv 2333}
ディクソンはまた、次の式もトネリによるものであるとしている。
X
mod
p
λ
≡
x
p
λ
−
1
⋅
c
(
p
λ
−
2
p
λ
−
1
+
1
)
/
2
{\displaystyle X{\bmod {p^{\lambda }}}\equiv x^{p^{\lambda -1}}\cdot c^{(p^{\lambda }-2p^{\lambda -1}+1)/2}}
ただし、
X
2
mod
p
λ
≡
c
{\displaystyle X^{2}{\bmod {p^{\lambda }}}\equiv c}
かつ
x
2
mod
p
≡
c
{\displaystyle x^{2}{\bmod {p}}\equiv c}
。
p
=
23
{\displaystyle p=23}
と
p
3
{\displaystyle p^{3}}
を法として用いると、計算は次のようになる。
1115
2
mod
23
3
=
2191
{\displaystyle 1115^{2}{\bmod {23^{3}}}=2191}
まず、
p
{\displaystyle p}
を法とするモジュラー平方根を求める。これは、どちらか一方の根に対して、通常のトネリのアルゴリズムで求めることができる。
1115
2
mod
23
≡
6
{\displaystyle 1115^{2}{\bmod {23}}\equiv 6}
となり、
6
mod
23
≡
11
{\displaystyle {\sqrt {6}}{\bmod {23}}\equiv 11}
となる。
これに、トネリの式(上記参照)を適用する。
11
23
2
⋅
2191
(
23
3
−
2
⋅
23
2
+
1
)
/
2
mod
23
3
≡
1115
{\displaystyle 11^{23^{2}}\cdot 2191^{(23^{3}-2\cdot 23^{2}+1)/2}{\bmod {23^{3}}}\equiv 1115}
ディクソンの文献 [ 4] は、トネリのアルゴリズムが
p
λ
{\displaystyle p^{\lambda }}
を法として動作することを明確に示している。
脚注
^ Oded Goldreich, Computational complexity: a conceptual perspective , Cambridge University Press, 2008, p. 588.
^ Volker Diekert; Manfred Kufleitner; Gerhard Rosenberger; Ulrich Hertrampf (24 May 2016). Discrete Algebraic Methods: Arithmetic, Cryptography, Automata and Groups . De Gruyter. pp. 163–165. ISBN 978-3-11-041632-9 . https://books.google.com/books?id=OB9BDAAAQBAJ&pg=PT163
^ a b c d e Leonard Eugene Dickson (1919). History of the Theory of Numbers . 1 . Washington, Carnegie Institution of Washington. pp. 215 –216. https://archive.org/details/historyoftheoryo01dick
^ Daniel Shanks. Five Number-theoretic Algorithms. Proceedings of the Second Manitoba Conference on Numerical Mathematics. Pp. 51–70. 1973.
^ Tornaría, Gonzalo (2002). “Square Roots Modulo P”. LATIN 2002: Theoretical Informatics . Lecture Notes in Computer Science. 2286 . pp. 430–434. doi :10.1007/3-540-45995-2_38 .
ISBN 978-3-540-43400-9
^ Sutherland, Andrew V. (2011), “Structure computation and discrete logarithms in finite abelian p-groups”, Mathematics of Computation 80 (273): 477–500, arXiv :0809.3413 , doi :10.1090/s0025-5718-10-02356-2
^ Bach, Eric (1990), “Explicit bounds for primality testing and related problems” , Mathematics of Computation 55 (191): 355–380, doi :10.2307/2008811 , JSTOR 2008811 , https://www.jstor.org/stable/2008811
^ Adleman, L. M., K. Manders, and G. Miller: 1977, `On taking roots in finite fields'. In: 18th IEEE Symposium on Foundations of Computer Science. pp. 175-177
^ "Accademia nazionale dei Lincei, Rome. Rendiconti, (5), 1, 1892, 116-120."
参考文献