Tonelli–Shanks Algorithm
この文章では,有限素体で平方剰余になっている元の平方根を求める アルゴリズムであるTonelli–Shanksのアルゴリズムと, このアルゴリズムの乗根への一般化を解説する.
1 オイラーの規準
を素数とし, とする. このときが 法における乗剰余 であるとは あるが存在して
となるときにいう. のときはそれぞれ平方剰余 と立方剰余と呼ばれる.
このセクションでは法において が乗剰余になるための必要十分条件を 与えるオイラーの規準を紹介する.
まず重要なフェルマーの小定理を紹介する. 証明は省略する.
補題 1.
を素数とし,とする.このとき
が成り立つ.
以下の命題がオイラーの規準である. 通常はの場合の命題をそのように呼ぶ.
命題 2.
を素数とし, とする. このときが法における 乗剰余であることと,
が成り立つことは同値である.
証明.
まず最初にが法における乗剰余であると仮定する. このときとなる が存在する. するとフェルマーの小定理より
が成り立ち,定理の前半が証明された. 後半を示そう.
まず最初に の場合に証明をする. このとき なのでフェルマーの小定理から, 任意のが法における乗剰余であることを示せば良い. さて今の状況で と が互いに素なので, が存在して
となる. このときフェルマーの小定理よりが 法におけるの乗根になる.
次にの場合を証明する. を法における原始根とし, を用いて となっているとする. このとき
である. の法における位数は なので, は の倍数である. よって は整数であり,特にとかける. さて,今 はと互いに素なので, ある が存在して となる. 上で得られたとを使って, と定義する. するとフェルマーの小定理から
となるので,が求めている の法における乗根である. ∎
注意.
命題2の証明の後半は の乗根を求める手順になっている. しかし原始根を使っているのでが大きいときには (証明には使えるが) とても計算には使えない手順になっている. 法における冪乗根の計算では 如何に原始根を用いずに計算するかが重要になっていくる.
2 Tonelli–Shanksのアルゴリズム
このセクションでは 有限素体における平方根を求めるアルゴリズムの一つである Tonelli–Shanksのアルゴリズムの理論的背景と,アルゴリズムを紹介する.
以下の補題がTonelli-Shanksのアルゴリズムの理論的支柱である.
補題 3.
を奇素数とし,と奇数はを満たすとする. を法における平方非剰余とする. として, は法におけるの乗根であり, なおかつ法におけるの乗根ではないとする. このときとすると はの乗根である.
証明.
は法における の乗根であるということは, は法におけるの平方根である. 仮定からこの値は法でに合同である. 今,オイラーの規準から,
であることに注意すると,
なので, は法での乗根である. ∎
この補題3を用いて 法における平方剰余の平方根を求めるアルゴリズムが Tonelli–Shanksのアルゴリズムである.
考察 4.
を素数とし, を法における平方剰余とする. このときの法における平方根を求めたい.
最初にとなるようなと奇数を求める.
次に平方非剰余を適当に取ってくる. からまでの間にはこのような数は個あるので, 結構な確率で取ってこれる.
次にとおく.は奇数なので はちゃんと整数になっている. すると
となる. とおく. もしも ならば がの法における 平方根 になっている. しかし一般にはこういう風にはなっていない. 一般の場合もの値を修正して,となる理想的な ケースを目指すことを考える. まず,は平方剰余なので,オイラーの規準から
なので,は法におけるの乗根になっている. が法におけるの乗根,すなわち乗根 ならば,はに合同なので,がの法における 平方根である. がそうではないとすると, 次のようなを見つけることができる: であり,は法におけるの乗根であるが, 乗根ではない. よって,補題3を適応することによって, とすると, は法におけるの乗根である. よって,と値を修正すると,
となる.とすると, は法におけるの乗根になっている.
以上の操作は が法におけるの乗根,すなわち, となるまで続けることができ, そのときのがの法における平方根である.
以上の操作を疑似コードにして表したのが次である.
考察ではとなる最大の を取ってきたが,となる最小のを見つける方が 計算量が少なくて済むのでそのように修正している.このコードはwikipediaの Tonelli–Shanksのページを大いに参考にした.
以上で説明したアルゴリズムは ある種伝統的なアルゴリズムであったが, 次の補題を利用しても 平方根を求めることができる.
補題 5.
を奇素数とし, と奇数はを満たすとする. を法における平方非剰余とする. そしてを法における平方剰余とする. このとき,が存在して となる. このを用いると, は法におけるの平方根の一つである.
証明.
補題の後半は自乗すれば直ちにわかる. 前半を示す. もし ならば,オイラーの規準よりとすれば条件を満たすので, 以下ではとする. に値をとる点列 を任意のについて
を満たすように帰納的に以下のように定める. まず,を定義する. オイラーの規準から である.よってはかに合同である. がに合同ならば, そうでない時はとする.
一般にに対して以下の自然数に対してが定義されたとしよう. このとき,帰納法の仮定から,
である. よって,その平方根である はかに合同である. この値ががに合同ならば, そうでないときはと定義する.
以上によってが得られたが,帰納法の仮定と, の定義より,
このとき, とすると補題の条件を満たす. ∎
この補題を使ったアルゴリズムの 疑似コードを以下に書く.このコードは[2]を大いに参考にした. このアルゴリズムはプログラミングの初心者でも 書きやすいという利点がある.
3 一般の冪根を求めるアルゴリズム(Adleman-Manders-Miler)
このセクションでは 一般のに対して における乗根を求めることを考える. まずフェルマーの小定理から次の命題がわかる. オイラーの規準の証明の中でも用いていた手法である. 証明は省略する.
命題 6.
を素数とし,とする. そしてと仮定する. このとき法にけるの逆数をとすると, 任意のの法における乗根 はである.
よって以下の考察では,はの素因数と仮定する命題が多くなる.
補題 7.
を素数とし,をの素因数であるとする. とで割り切れない数はを満たすとする. を法における乗非剰余とする. として, は法におけるの乗根であり, なおかつ法におけるの乗根ではないとする. とする. このときあるが存在して がの乗根となる.
証明.
が法における の乗根であるということは, は法におけるの乗根である. 今オイラーの規準から, は とは異なるの乗根であり, は素数なので, はの乗根を全て含む. よって,あるが存在して
を満たす.よって
なので, は法での乗根である. ∎
考察 8.
を素数とし, を自然数とする. を法における乗剰余とする. このときの法における乗根を求めたい.
まず最初に, の法における逆数を としてとするとこれは の乗根になっているので, の乗根を求めれば の乗根になる. よって以下ではをの約数とする.
次にを素因数分解し, とする.ここで,たちには重複があっても良い. このときの乗根を求めそれをとする. そしての乗根をとすると, の乗根は である. よっての乗根を求めるにはを素数としても良い.
次にとなるようなとで割り切れないを求める. はの素因数なのでに注意せよ.
次に乗非剰余を適当に取ってくる. からまでの間にはこのような数は個あるので, 結構な確率で取ってこれる.
さて,次に平方根のときの同様に とおきたいところだが, がの倍数とは全く限らない. そこで平方根の場合の議論ではなく, の場合の議論を参考にして の値を定める. つまり今の場合には の法における逆数をとして とする.
となる. とおく. もしも ならがの法における 乗根 になっている. しかし一般にはこういう風にはなっていない. 一般の場合もの値を修正して,となる理想的な ケースを目指すことを考える.
の定義からはの倍数になっているので がの倍数になっていることに注意すると は乗剰余なので, オイラーの規準から がわかる. よっては法におけるの乗根になっている. が法におけるの乗根, すなわち乗根 ならばはに合同なので がの法における 平方根である. がそうではないとすると, 次のようなを見つけることができる: であり,は法におけるの乗根であるが, 乗根ではない. よって,補題7にあるような を見つけることができる. とすると, は法におけるの乗根である. よって,と値を修正すると,
となる.とすると, は法におけるの乗根になっている.
以上の操作は が法におけるの乗根,すなわち, となるまで続けることができ, そのときのがの法における乗根である.
以上の操作を疑似コードにして表したのが次である. ここでははの素因数では乗剰余であることがわかっているとする.
ここでもやはり, となる最大の ではなく となる最小のを見つけるように修正をしている. また,アルゴリズムの中の“Take …” の部分は離散対数問題を解く必要があるので が大きすぎると計算機でも時間がかかる計算になる. この一般の乗根を求めるアルゴリズムはAdleman-Manders-Milerのアルゴリズムとして知られているようである.
次の補題を利用しても 乗根を求めることができる.この補題は[1]を大いに参考にした.
補題 9.
を素数とし, をの素因数とする. とで割り切れない数は を満たすとする. を法における乗非剰余とする. そしてを法における乗剰余とする. を法におけるの逆数とする. このとき,が存在して となる. このを用いると, は法におけるの乗根の一つである.
証明.
補題の後半は乗すれば直ちにわかる. 前半を示す. もし ならば,オイラーの規準よりとすれば条件を満たすので, 以下ではとする. 仮定よりは乗非剰余なので とすると, は法におけるの 剰余でありなおかつとは異なることに注意せよ. また,が素数なので は法における乗根を全て含んでいることに注意しよう. に値をとる点列 を任意のについて
を満たすように帰納的に以下のように定める. まず,を定義する. オイラーの規準から である. よっては法における の乗根である. ここで を を満たすようにとる. 一般にに対して以下の自然数に対してが定義されたとしよう. このとき,帰納法の仮定から,
である. よって,その乗根である 法におけるの乗根である. を となるように定義する. 以上によってが得られたが,帰納法の仮定より が成り立つ. このとき, とすると補題の条件を満たす. ∎
この補題を用いたアルゴリズムの 疑似コードを書くと以下のようになる. ここでははの素因数では乗剰余であることがわかっているとする.
一般のに対して乗根を求めるプログラムは以下のようになる. 以下に現れる はがの素因数のときのの法における乗根を表すとする. このような値を求めるプログラムは既に上で記述している.
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 , (2020), arXiv:2008.11814