AUTOMATIC HTML VERSION

The Tonelli-Shanks algorithmのLaTeXML自動変換版です。自動検査には合格していますが、元PDFとの目視比較は未実施です。正本はPDF・TeXです。

Tonelli–Shanks Algorithm

ナンブ キトラ
HTML変換日:2026年7月26日

この文章では,有限素体で平方剰余になっている元の平方根を求める アルゴリズムであるTonelli–Shanksのアルゴリズムと, このアルゴリズムのn乗根への一般化を解説する.

1 オイラーの規準

pを素数とし, r∈ℤ≥0とする. このときa∈ℤが 法pにおけるr乗剰余 であるとは あるb∈ℤが存在して

br≡amodp

となるときにいう. r=2,3のときはそれぞれ平方剰余 と立方剰余と呼ばれる.

このセクションでは法pにおいて a∈ℤがr乗剰余になるための必要十分条件を 与えるオイラーの規準を紹介する.

まず重要なフェルマーの小定理を紹介する. 証明は省略する.

補題 1.

pを素数とし,a∈ℤとする.このとき

ap−1≡1modp

が成り立つ.

以下の命題がオイラーの規準である. 通常はr=2の場合の命題をそのように呼ぶ.

命題 2.

pを素数とし, r∈ℤ≥0とする. このときa∈ℤが法pにおける r乗剰余であることと,

ap−1gcd⁡(p−1,r)≡1modp

が成り立つことは同値である.

証明.

まず最初にaが法pにおけるr乗剰余であると仮定する. このときbr≡amodpとなるb∈ℤ が存在する. するとフェルマーの小定理より

ap−1gcd⁡(p−1,r)≡brgcd⁡(p−1,r)⁢(p−1)≡1modp

が成り立ち,定理の前半が証明された. 後半を示そう.

まず最初にgcd⁡(p−1,r)=1 の場合に証明をする. このとき (p−1)/gcd⁡(p−1,r)=p−1 なのでフェルマーの小定理から, 任意のa∈ℤが法pにおけるr乗剰余であることを示せば良い. さて今の状況で rとp−1 が互いに素なので, h∈ℤ≥0が存在して

h⁢r≡1modp−1

となる. このときフェルマーの小定理よりahが 法pにおけるaのr乗根になる.

次にgcd⁡(p−1,r)≠1の場合を証明する. gを法pにおける原始根とし, k∈{0,1,…,p−1}を用いて gk≡amodp となっているとする. このとき

ap−1gcd⁡(p−1,r)≡gk⁢p−1gcd⁡(p−1,r)≡1modp

である. gの法pにおける位数は p−1なので, k⁢p−1gcd⁡(p−1,r)は p−1の倍数である. よってm=kgcd⁡(p−1,r) は整数であり,特にk=m⁢gcd⁡(p−1,r)とかける. さて,今r/(gcd⁡(p−1,r)) はp−1と互いに素なので, あるh∈ℤ≥0 が存在してh⁢r/(gcd⁡(p−1,r))≡1modp−1 となる. 上で得られたmとhを使って, b=gm⁢hと定義する. するとフェルマーの小定理から

br≡gm⁢h⁢r≡gm⁢gcd⁡(p−1,r)⋅h⁢rgcd⁡(p−1,r)≡gk⋅h⁢rgcd⁡(p−1,r)≡ah⁢rgcd⁡(p−1,r)≡amodp

となるので,bが求めている aの法pにおけるr乗根である. ∎

注意.

命題2の証明の後半は aのr乗根を求める手順になっている. しかし原始根を使っているのでpが大きいときには (証明には使えるが) とても計算には使えない手順になっている. 法pにおける冪乗根の計算では 如何に原始根を用いずに計算するかが重要になっていくる.

2 Tonelli–Shanksのアルゴリズム

このセクションでは 有限素体における平方根を求めるアルゴリズムの一つである Tonelli–Shanksのアルゴリズムの理論的背景と,アルゴリズムを紹介する.

以下の補題がTonelli-Shanksのアルゴリズムの理論的支柱である.

補題 3.

pを奇素数とし,s∈ℕと奇数dはp−1=2s⁢dを満たすとする. zを法pにおける平方非剰余とする. 1≤i<sとして, t∈ℤは法pにおける1の2s−i乗根であり, なおかつ法pにおける1の2s−i−1乗根ではないとする. このときb=z2i−1⁢dとすると t⁢b2は1の2s−i−1乗根である.

証明.

tは法pにおける 1の2s−i乗根であるということは, t2s−i−1は法pにおける1の平方根である. 仮定からこの値は法pで−1に合同である. 今,オイラーの規準から,

zp−12≡z2s−1⁢d≡−1modp

であることに注意すると,

(t⁢b2)2s−i−1≡t2s−i−1⁢z2s−1⁢d≡(−1)⁢(−1)≡1modp

なので, t⁢b2は法pで1の2s−i−1乗根である. ∎

この補題3を用いて 法pにおける平方剰余の平方根を求めるアルゴリズムが Tonelli–Shanksのアルゴリズムである.

考察 4.

pを素数とし, aを法pにおける平方剰余とする. このときaの法pにおける平方根を求めたい.

最初にp−1=2s⁢dとなるようなsと奇数dを求める.

次に平方非剰余zを適当に取ってくる. 1からp−1までの間にはこのような数は(p−1)/2個あるので, 結構な確率で取ってこれる.

次にR=a1+d2とおく.dは奇数なので 1+d/2はちゃんと整数になっている. すると

R2=a1+d=a⋅admodp

となる. t=adとおく. もしもt≡1modp ならば Rがaの法pにおける 平方根 になっている. しかし一般にはこういう風にはなっていない. 一般の場合もRの値を修正して,t≡1となる理想的な ケースを目指すことを考える. まず,aは平方剰余なので,オイラーの規準から

t2s−1≡ap−12≡1modp

なので,tは法pにおける1の2s−1乗根になっている. tが法pにおける1の2s−s乗根,すなわち1乗根 ならば,tは1に合同なので,Rがaの法pにおける 平方根である. tがそうではないとすると, 次のようなiを見つけることができる: 1≤i<sであり,tは法pにおける1の2s−i乗根であるが, 2s−i−1乗根ではない. よって,補題3を適応することによって, b=z2i−1⁢dとすると, t⁢b2は法pにおける1の2s−i−1乗根である. よって,R′=R⁢bと値を修正すると,

(R′)2≡a⋅t⁢b2modp

となる.t′=t⁢b2とすると, t′は法pにおける1の2s−i−1乗根になっている.

以上の操作は tが法pにおける1の2s−s乗根,すなわち, t≡1modpとなるまで続けることができ, そのときのRがaの法pにおける平方根である.

以上の操作を疑似コードにして表したのが次である.

Algorithm 1 Solving x2≡amodp
0:  a:integer and p:prime
  if p=2 then
     return  a
  end if
  Take s≥1 and an odd number d with p−1=2s⁢d
  Take z∈ℤ s.t. zp−12≢1(modp)
  M←s
  R←a1+d2
  t←ad
  c←zd
  while M≠0 do
     Take the least i∈{1,…,s−1} such that t2i≡1modp
     b←c2M−i−1
     M←i
     c←b2
     R←R⁢b
     t←t⁢b2
  end while
  return  R

考察ではt2s−i≡1となる最大のi を取ってきたが,t2i≡1となる最小のiを見つける方が 計算量が少なくて済むのでそのように修正している.このコードはwikipediaの Tonelli–Shanksのページを大いに参考にした.

以上で説明したアルゴリズムは ある種伝統的なアルゴリズムであったが, 次の補題を利用しても 平方根を求めることができる.

補題 5.

pを奇素数とし, s∈ℤ≥2と奇数dはp−1=2s⁢dを満たすとする. zを法pにおける平方非剰余とする. そしてaを法pにおける平方剰余とする. このとき,m∈ℤが存在して ad⁢z2⁢m⁢d≡1modp となる. このmを用いると, a1+d2⁢zm⁢d は法pにおけるaの平方根の一つである.

証明.

補題の後半は自乗すれば直ちにわかる. 前半を示す. もしs=1 ならば,オイラーの規準よりm=0とすれば条件を満たすので, 以下ではs≥2とする. {0,1}に値をとる点列{ci}i=0s−2 を任意のn∈{0,1,…,s−2}について

a2s−n−2⁢d⋅z(2s−n−1⁢c0+2s−n⁢c1+⋯+2s−2⁢cn−1+2s−1⁢cn)⁢d≡1modp

を満たすように帰納的に以下のように定める. まず,c0を定義する. オイラーの規準からa2s−1⁢d≡1modp である.よってa2s−2⁢dは1か−1に合同である. a2s−2⁢dが−1に合同ならばc0=1, そうでない時はc0=0とする.

一般にnに対してn以下の自然数に対してciが定義されたとしよう. このとき,帰納法の仮定から,

a2s−n−1⁢d⋅z(2s−n⁢c0+2s−n+1⁢c1+⋯+2s−1⁢cn−1)⁢d≡1modp

である. よって,その平方根である a2s−n−2⁢d⁢z(2s−n−1⁢c0+2s−n⁢c1+⋯+2s−2⁢cn−1)⁢d は1か−1に合同である. この値がが−1に合同ならばcn=1, そうでないときはcn=0と定義する.

以上によって{ci}i=1s−2が得られたが,帰納法の仮定と, cs−2の定義より,

ad⁢z(2⁢c0+22⁢c1+⋯+2s−1⁢cs−2)⁢d≡1mod1

このとき, m=c0+2⁢c1+⋯+2s−2⁢cs−2とすると補題の条件を満たす. ∎

この補題を使ったアルゴリズムの 疑似コードを以下に書く.このコードは[2]を大いに参考にした. このアルゴリズムはプログラミングの初心者でも 書きやすいという利点がある.

Algorithm 2 Solving x2≡amodp
0:  a:integer and p:prime
  if p=2 then
     return  a
  end if
  if ap−12≢1(modp) then
     return  Error
  end if
  Take z∈{1,…,p−1} s.t. zp−12≢1modp
  a⁢p⁢o⁢w←p−1
  z⁢p⁢o⁢w←0
  while a⁢p⁢o⁢w is even do
     a⁢p⁢o⁢w←a⁢p⁢o⁢w/2
     z⁢p⁢o⁢w←z⁢p⁢o⁢w/2
     if aa⁢p⁢o⁢w⁢zz⁢p⁢o⁢w≢1(modp) then
        z⁢p⁢o⁢w←z⁢p⁢o⁢w+(p−1)/2
     end if
  end while
  a⁢p⁢o⁢w←(a⁢p⁢o⁢w+1)/2
  z⁢p⁢o⁢w←z⁢p⁢o⁢w/2
  return  aa⁢p⁢o⁢w⁢zz⁢p⁢o⁢w

3 一般の冪根を求めるアルゴリズム(Adleman-Manders-Miler)

このセクションでは 一般のr∈ℤ≥1に対して 𝔽pにおけるr乗根を求めることを考える. まずフェルマーの小定理から次の命題がわかる. オイラーの規準の証明の中でも用いていた手法である. 証明は省略する.

命題 6.

pを素数とし,r∈ℤ≥1とする. そしてgcd⁡(p−1,r)=1と仮定する. このとき法p−1にけるrの逆数をhとすると, 任意のa∈ℤの法pにおけるr乗根 はahである.

よって以下の考察では,rはp−1の素因数と仮定する命題が多くなる.

補題 7.

pを素数とし,rをp−1の素因数であるとする. s∈ℕとrで割り切れない数dはp−1=rs⁢dを満たすとする. zを法pにおけるr乗非剰余とする. 1≤i<sとして, t∈ℤは法pにおける1のrs−i乗根であり, なおかつ法pにおける1のrs−i−1乗根ではないとする. b=zri−1⁢dとする. このときあるm∈{0,1,…,p−1}が存在して t⁢bm⁢rが1のrs−i−1乗根となる.

証明.

tが法pにおける 1のrs−i乗根であるということは, trs−i−1は法pにおける1のr乗根である. 今オイラーの規準から, γ=zrs−1dは 1とは異なる1のr乗根であり, rは素数なので,{γm}m=0r−1 は1のr乗根を全て含む. よって,あるmが存在して

trs−i−1⋅γm=1

を満たす.よって

(t⁢bm⁢r)rs−i−1≡trs−i−1⁢zrs−1⁢m⁢d≡trs−i−1⋅γm≡1modp

なので, t⁢bm⁢rは法pで1のrs−i−1乗根である. ∎

考察 8.

pを素数とし, rを自然数とする. aを法pにおけるr乗剰余とする. このときaの法pにおけるr乗根を求めたい.

まず最初に, r/gcd⁡(p−1,r)の法p−1における逆数をh としてahとするとこれは aのr/gcd⁡(p−1,r)乗根になっているので, ahのgcd⁡(p−1,r)乗根を求めれば aのr乗根になる. よって以下ではrをp−1の約数とする.

次にrを素因数分解し, r=q1⁢q2⁢…⁢ql とする.ここで,qiたちには重複があっても良い. このときaのq1乗根を求めそれをf1⁢(a)とする. そしてf1⁢(a)のq2乗根をf2⁢(f1)⁢(a)とすると, aのr乗根はfl∘fl−1∘…⁢f2∘f1⁢(a) である. よってaのr乗根を求めるにはrを素数としても良い.

次にp−1=rs⁢dとなるようなsとrで割り切れないdを求める. rはp−1の素因数なのでs≥1に注意せよ.

次にr乗非剰余zを適当に取ってくる. 1からp−1までの間にはこのような数は(r−1)⁢(p−1)/r個あるので, 結構な確率で取ってこれる.

さて,次に平方根のときの同様に R=a1+drとおきたいところだが, d+1がrの倍数とは全く限らない. そこで平方根の場合の議論ではなく, gcd⁡(r,p−1)=1の場合の議論を参考にして Rの値を定める. つまり今の場合には rの法dにおける逆数をhとして R=ahとする.

Rr=ar⁢h=a⋅ar⁢h−1modp

となる. t=ar⁢h−1とおく. もしもt≡1modp ならRがaの法pにおける r乗根 になっている. しかし一般にはこういう風にはなっていない. 一般の場合もRの値を修正して,t≡1となる理想的な ケースを目指すことを考える.

hの定義からr⁢h−1はdの倍数になっているので rs−1⁢(r⁢h−1)がp−1rの倍数になっていることに注意すると aはr乗剰余なので, オイラーの規準から trs−1≡ars−1⁢(r⁢h−1)≡1modp がわかる. よってtは法pにおける1のrs−1乗根になっている. tが法pにおける1のrs−s乗根, すなわち1乗根 ならばtは1に合同なので Rがaの法pにおける 平方根である. tがそうではないとすると, 次のようなiを見つけることができる: 1≤i<sであり,tは法pにおける1のrs−i乗根であるが, rs−i−1乗根ではない. よって,補題7にあるようなm∈{0,1,…,p−1} を見つけることができる. b=zri−1⁢dとすると, t⁢bm⁢rは法pにおける1のrs−i−1乗根である. よって,R′=R⁢bmと値を修正すると,

(R′)r≡a⋅t⁢bm⁢rmodp

となる.t′=t⁢bm⁢rとすると, t′は法pにおける1のrs−i−1乗根になっている.

以上の操作は tが法pにおける1のrs−s乗根,すなわち, t≡1modpとなるまで続けることができ, そのときのRがaの法pにおけるr乗根である.

以上の操作を疑似コードにして表したのが次である. ここではrはp−1の素因数でaはr乗剰余であることがわかっているとする.

Algorithm 3 Solving xr≡amodp
0:  a:integer and p:prime
  Take s≥1 and a number d s.t. p−1=rs⁢d and gcd⁡(d,q)=1
  Take h s.t. r⁢h≡1modd
  Take z∈ℤ s.t. zp−1r≢1(modp)
  M←s
  R←ah
  t←ar⁢h−1
  c←zd
  while M≠0 do
     Take the least i∈{1,…,s−1} such that tri≡1modp
     Take m∈{0,…,p−1} s.t. tri−1⁢(z(p−1)/r)m≡1modp
     b←crM−i−1
     M←i
     c←br
     R←R⁢bm
     t←t⁢bm⁢r
  end while
  return  R

ここでもやはり, trs−i≡1となる最大のi ではなくtri≡1 となる最小のiを見つけるように修正をしている. また,アルゴリズムの中の“Take m∈{0,…,p−1}…” の部分は離散対数問題を解く必要があるので rが大きすぎると計算機でも時間がかかる計算になる. この一般のr乗根を求めるアルゴリズムはAdleman-Manders-Milerのアルゴリズムとして知られているようである.

次の補題を利用しても r乗根を求めることができる.この補題は[1]を大いに参考にした.

補題 9.

pを素数とし, rをp−1の素因数とする. s∈ℕとrで割り切れない数dは p−1=rs⁢dを満たすとする. zを法pにおけるr乗非剰余とする. そしてaを法pにおけるr乗剰余とする. hを法dにおけるrの逆数とする. このとき,m∈ℤが存在して ar⁢h−1⁢zr⁢m⁢d≡1modp となる. このmを用いると, ah⁢zm⁢d は法pにおけるaのr乗根の一つである.

証明.

補題の後半はr乗すれば直ちにわかる. 前半を示す. もしs=1 ならば,オイラーの規準よりm=0とすれば条件を満たすので, 以下ではs≥2とする. 仮定よりzはr乗非剰余なので γ=zrs−1⁢dとすると, γは法pにおける1の r剰余でありなおかつ1とは異なることに注意せよ. また,rが素数なので{γk}k=0r−1 は法pにおけるr乗根を全て含んでいることに注意しよう. {0,1,…,r−1}に値をとる点列{ci}i=0s−2 を任意のn∈{0,1,…,s−2}について

(ar⁢h−1)rs−n−2⋅z(rs−n−1⁢c0+rs−n⁢c1+⋯+rs−2⁢cn−1+rs−1⁢cn)⁢d≡1modp

を満たすように帰納的に以下のように定める. まず,c0を定義する. オイラーの規準から (ar⁢h−1)rs−1≡1modp である. よって(ar⁢h−1)rs−2は法pにおける 1のr乗根である. ここで c0を(ar⁢h−1)rs−2⋅γc0≡1 を満たすようにとる. 一般にnに対してn以下の自然数に対してciが定義されたとしよう. このとき,帰納法の仮定から,

(ar⁢h−1)rs−n−1⋅z(rs−n⁢c0+rs−n+1⁢c1+⋯+rs−1⁢cn−1)⁢d≡1modp

である. よって,そのr乗根である (ar⁢h−1)rs−n−2⁢d⁢z(rs−n−1⁢c0+rs−n⁢c1+⋯+rs−2⁢cn−1)⁢d 法pにおける1のr乗根である. cnを (ar⁢h−1)rs−n−2⁢d⁢z(rs−n−1⁢c0+rs−n⁢c1+⋯+rs−2⁢cn−1)⁢d⋅γcn≡1modp となるように定義する. 以上によって{ci}i=1s−2が得られたが,帰納法の仮定より ar⁢h−1⁢z(r⁢c0+r2⁢c1+⋯+rs−1⁢cs−2)⁢d≡1modp が成り立つ. このとき, m=c0+r⁢c1+⋯+rs−2⁢cs−2とすると補題の条件を満たす. ∎

この補題を用いたアルゴリズムの 疑似コードを書くと以下のようになる. ここではrはp−1の素因数でaはr乗剰余であることがわかっているとする.

Algorithm 4 Solving xr≡amodp
0:  p:prime, r:prime s.t. r|p−1, and a:integer s.t. ap−1r≡1modp
  Take z∈{1,…,p−1} s.t. zp−1r≢1modp
  Take s and d s.t. p−1=rs⁢d and gcd⁡(r,d)=1
  Take h s.t. r⁢h≡1modd
  a⁢p⁢o⁢w←(r⁢h−1)⁢rs
  z⁢p⁢o⁢w←0
  while a⁢p⁢o⁢w≡0modr  do
     a⁢p⁢o⁢w←a⁢p⁢o⁢w/r
     z⁢p⁢o⁢w←z⁢p⁢o⁢w/r
     if aa⁢p⁢o⁢w⁢zz⁢p⁢o⁢w≢1(modp) then
        Take m∈{0,…,p−1} s.t. (aa⁢p⁢o⁢w⁢zz⁢p⁢o⁢w)⋅(z(p−1)/r)m≡1(modp)
        z⁢p⁢o⁢w←z⁢p⁢o⁢w+m⁢(p−1)/r
     end if
  end while
  a⁢p⁢o⁢w←(a⁢p⁢o⁢w+1)/r
  z⁢p⁢o⁢w←z⁢p⁢o⁢w/r
  return  aa⁢p⁢o⁢w⁢zz⁢p⁢o⁢w

一般のr∈ℤ≥1に対してr乗根を求めるプログラムは以下のようになる. 以下に現れるS⁢o⁢l⁢v⁢e⁢_⁢R⁢o⁢o⁢t⁢_⁢p⁢r⁢i⁢m⁢e⁢(x,r,p) はrがp−1の素因数のときのxの法pにおけるr乗根を表すとする. このような値を求めるプログラムは既に上で記述している.

Algorithm 5 Solving xr≡amodp
0:  a:integer, r:positive integer, p:prime
  if a(p−1)/gcd⁡(p−1,r)≢1(modp) then
     return  ‘a is not an r-th residue.’
  end if
  x←a
  if gcd⁡(p−1,r)=1 then
     Take v s.t. v⁢r≡1modp−1
     return  xv
  else
     Take v s.t. v⋅(rgcd⁡(p−1,r))≡1modp−1
     x←xv
  end if
  Take primes q1,…,ql s.t. gcd⁡(p−1,r)=q1⋅q2⁢⋯⁢ql
  for i∈{1,…,l} do
     x←S⁢o⁢l⁢v⁢e⁢_⁢R⁢o⁢o⁢t⁢_⁢p⁢r⁢i⁢m⁢e⁢(x,qi,p)
  end for
  return  x

References

  • [1] Z. Cao, Q. Sha and X. Fan, Adleman-Manders-Miler root extraction method revised, in Information Security and Cryptology (Chuan-Kun Wu, Moti Yung and Dongdai Lin, eds. ), 7th International Conference, Inscrypt 2011 Beijing, China, November/December 2011 Revised Selected Papers, (2012), pp77–85.
  • [2] R. Kumar, A simple algorithm for finding square rot modulo p, (2020), arXiv:2008.11814