AUTOMATIC HTML VERSION

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

Tonelli–Shanks Algorithm

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

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

1 オイラーの規準

pを素数とし, r0とする. このときapにおけるr乗剰余 であるとは あるbが存在して

bramodp

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

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

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

補題 1.

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

ap11modp

が成り立つ.

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

命題 2.

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

ap1gcd(p1,r)1modp

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

証明.

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

ap1gcd(p1,r)brgcd(p1,r)(p1)1modp

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

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

hr1modp1

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

次にgcd(p1,r)1の場合を証明する. gを法pにおける原始根とし, k{0,1,,p1}を用いて gkamodp となっているとする. このとき

ap1gcd(p1,r)gkp1gcd(p1,r)1modp

である. gの法pにおける位数は p1なので, kp1gcd(p1,r)p1の倍数である. よってm=kgcd(p1,r) は整数であり,特にk=mgcd(p1,r)とかける. さて,今r/(gcd(p1,r))p1と互いに素なので, あるh0 が存在してhr/(gcd(p1,r))1modp1 となる. 上で得られたmhを使って, b=gmhと定義する. するとフェルマーの小定理から

brgmhrgmgcd(p1,r)hrgcd(p1,r)gkhrgcd(p1,r)ahrgcd(p1,r)amodp

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

注意.

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

2 Tonelli–Shanksのアルゴリズム

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

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

補題 3.

pを奇素数とし,sと奇数dp1=2sdを満たすとする. zを法pにおける平方非剰余とする. 1i<sとして, tは法pにおける12si乗根であり, なおかつ法pにおける12si1乗根ではないとする. このときb=z2i1dとすると tb212si1乗根である.

証明.

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

zp12z2s1d1modp

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

(tb2)2si1t2si1z2s1d(1)(1)1modp

なので, tb2は法p12si1乗根である. ∎

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

考察 4.

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

最初にp1=2sdとなるようなsと奇数dを求める.

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

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

R2=a1+d=aadmodp

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

t2s1ap121modp

なので,tは法pにおける12s1乗根になっている. tが法pにおける12ss乗根,すなわち1乗根 ならば,t1に合同なので,Raの法pにおける 平方根である. tがそうではないとすると, 次のようなiを見つけることができる: 1i<sであり,tは法pにおける12si乗根であるが, 2si1乗根ではない. よって,補題3を適応することによって, b=z2i1dとすると, tb2は法pにおける12si1乗根である. よって,R=Rbと値を修正すると,

(R)2atb2modp

となる.t=tb2とすると, tは法pにおける12si1乗根になっている.

以上の操作は tが法pにおける12ss乗根,すなわち, t1modpとなるまで続けることができ, そのときのRaの法pにおける平方根である.

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

Algorithm 1 Solving x2amodp
0:  a:integer and p:prime
  if p=2 then
     return  a
  end if
  Take s1 and an odd number d with p1=2sd
  Take z s.t. zp121(modp)
  Ms
  Ra1+d2
  tad
  czd
  while M0 do
     Take the least i{1,,s1} such that t2i1modp
     bc2Mi1
     Mi
     cb2
     RRb
     ttb2
  end while
  return  R

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

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

補題 5.

pを奇素数とし, s2と奇数dp1=2sdを満たすとする. zを法pにおける平方非剰余とする. そしてaを法pにおける平方剰余とする. このとき,mが存在して adz2md1modp となる. このmを用いると, a1+d2zmd は法pにおけるaの平方根の一つである.

証明.

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

a2sn2dz(2sn1c0+2snc1++2s2cn1+2s1cn)d1modp

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

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

a2sn1dz(2snc0+2sn+1c1++2s1cn1)d1modp

である. よって,その平方根である a2sn2dz(2sn1c0+2snc1++2s2cn1)d11に合同である. この値がが1に合同ならばcn=1, そうでないときはcn=0と定義する.

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

adz(2c0+22c1++2s1cs2)d1mod1

このとき, m=c0+2c1++2s2cs2とすると補題の条件を満たす. ∎

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

Algorithm 2 Solving x2amodp
0:  a:integer and p:prime
  if p=2 then
     return  a
  end if
  if ap121(modp) then
     return  Error
  end if
  Take z{1,,p1} s.t. zp121modp
  apowp1
  zpow0
  while apow is even do
     apowapow/2
     zpowzpow/2
     if aapowzzpow1(modp) then
        zpowzpow+(p1)/2
     end if
  end while
  apow(apow+1)/2
  zpowzpow/2
  return  aapowzzpow

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

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

命題 6.

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

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

補題 7.

pを素数とし,rp1の素因数であるとする. srで割り切れない数dp1=rsdを満たすとする. zを法pにおけるr乗非剰余とする. 1i<sとして, tは法pにおける1rsi乗根であり, なおかつ法pにおける1rsi1乗根ではないとする. b=zri1dとする. このときあるm{0,1,,p1}が存在して tbmr1rsi1乗根となる.

証明.

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

trsi1γm=1

を満たす.よって

(tbmr)rsi1trsi1zrs1mdtrsi1γm1modp

なので, tbmrは法p1rsi1乗根である. ∎

考察 8.

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

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

次にrを素因数分解し, r=q1q2ql とする.ここで,qiたちには重複があっても良い. このときaq1乗根を求めそれをf1(a)とする. そしてf1(a)q2乗根をf2(f1)(a)とすると, ar乗根はflfl1f2f1(a) である. よってar乗根を求めるにはrを素数としても良い.

次にp1=rsdとなるようなsrで割り切れないdを求める. rp1の素因数なのでs1に注意せよ.

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

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

Rr=arh=aarh1modp

となる. t=arh1とおく. もしもt1modp ならRaの法pにおける r乗根 になっている. しかし一般にはこういう風にはなっていない. 一般の場合もRの値を修正して,t1となる理想的な ケースを目指すことを考える.

hの定義からrh1dの倍数になっているので rs1(rh1)p1rの倍数になっていることに注意すると ar乗剰余なので, オイラーの規準から trs1ars1(rh1)1modp がわかる. よってtは法pにおける1rs1乗根になっている. tが法pにおける1rss乗根, すなわち1乗根 ならばt1に合同なので Raの法pにおける 平方根である. tがそうではないとすると, 次のようなiを見つけることができる: 1i<sであり,tは法pにおける1rsi乗根であるが, rsi1乗根ではない. よって,補題7にあるようなm{0,1,,p1} を見つけることができる. b=zri1dとすると, tbmrは法pにおける1rsi1乗根である. よって,R=Rbmと値を修正すると,

(R)ratbmrmodp

となる.t=tbmrとすると, tは法pにおける1rsi1乗根になっている.

以上の操作は tが法pにおける1rss乗根,すなわち, t1modpとなるまで続けることができ, そのときのRaの法pにおけるr乗根である.

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

Algorithm 3 Solving xramodp
0:  a:integer and p:prime
  Take s1 and a number d s.t. p1=rsd and gcd(d,q)=1
  Take h s.t. rh1modd
  Take z s.t. zp1r1(modp)
  Ms
  Rah
  tarh1
  czd
  while M0 do
     Take the least i{1,,s1} such that tri1modp
     Take m{0,,p1} s.t. tri1(z(p1)/r)m1modp
     bcrMi1
     Mi
     cbr
     RRbm
     ttbmr
  end while
  return  R

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

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

補題 9.

pを素数とし, rp1の素因数とする. srで割り切れない数dp1=rsdを満たすとする. zを法pにおけるr乗非剰余とする. そしてaを法pにおけるr乗剰余とする. hを法dにおけるrの逆数とする. このとき,mが存在して arh1zrmd1modp となる. このmを用いると, ahzmd は法pにおけるar乗根の一つである.

証明.

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

(arh1)rsn2z(rsn1c0+rsnc1++rs2cn1+rs1cn)d1modp

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

(arh1)rsn1z(rsnc0+rsn+1c1++rs1cn1)d1modp

である. よって,そのr乗根である (arh1)rsn2dz(rsn1c0+rsnc1++rs2cn1)dpにおける1r乗根である. cn(arh1)rsn2dz(rsn1c0+rsnc1++rs2cn1)dγcn1modp となるように定義する. 以上によって{ci}i=1s2が得られたが,帰納法の仮定より arh1z(rc0+r2c1++rs1cs2)d1modp が成り立つ. このとき, m=c0+rc1++rs2cs2とすると補題の条件を満たす. ∎

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

Algorithm 4 Solving xramodp
0:  p:prime, r:prime s.t. r|p1, and a:integer s.t. ap1r1modp
  Take z{1,,p1} s.t. zp1r1modp
  Take s and d s.t. p1=rsd and gcd(r,d)=1
  Take h s.t. rh1modd
  apow(rh1)rs
  zpow0
  while apow0modr  do
     apowapow/r
     zpowzpow/r
     if aapowzzpow1(modp) then
        Take m{0,,p1} s.t. (aapowzzpow)(z(p1)/r)m1(modp)
        zpowzpow+m(p1)/r
     end if
  end while
  apow(apow+1)/r
  zpowzpow/r
  return  aapowzzpow

一般のr1に対してr乗根を求めるプログラムは以下のようになる. 以下に現れるSolve_Root_prime(x,r,p)rp1の素因数のときのxの法pにおけるr乗根を表すとする. このような値を求めるプログラムは既に上で記述している.

Algorithm 5 Solving xramodp
0:  a:integer, r:positive integer, p:prime
  if a(p1)/gcd(p1,r)1(modp) then
     return  ‘a is not an r-th residue.’
  end if
  xa
  if gcd(p1,r)=1 then
     Take v s.t. vr1modp1
     return  xv
  else
     Take v s.t. v(rgcd(p1,r))1modp1
     xxv
  end if
  Take primes q1,,ql s.t. gcd(p1,r)=q1q2ql
  for i{1,,l} do
     xSolve_Root_prime(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