Loading [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js

mod Pにおける平方根 その3

8N+1の素数について、もう一つ別の考え方を解説します。多分Tonelli–Shanksのアルゴリズムと同じ考えに基づくものと思われます。

p1=2st(ただしtは奇数)とおきます。すると任意のxに対して
(xt)2s=1
ですからxtは1の2t乗根です。

例えば97を考えると
96=253
ですから x3は1の32乗根です。一般的に1の32乗根は32個あり、そのうち16個が32乗してはじめて1になる数です。ある数ωが32乗して初めて1になる数とすれば
ω3,ω5,,ω31もまた32乗根してはじめて1になる数です。よって1つそのような数を見つければ他の数は自然と見つかることになります。

(余談ながらその逆数ω1,ω3,,ω31も然りです) 

ωを32乗して初めて1になる数(例えば42)としてその数を2乗、4乗としてこれを木の形にしてみます。(下図参照)

51024png

空白になっているところにも2の冪乗根があるはずですがそれは何かわからないので空欄にしておきます。また平方根についてはaが平方根の1つなら-aもまた平方根ですので剰余を0から95ではなく-48から47までの間になるように書いています。木の葉のほうから辿れば

42 → 18 → 33 → 22 → -1

です。この中にa3があれば答えは簡単です。例えばa47とすれば、a3=33ですから、1つ下の18を使って
a3=33=182
これより両辺にaをかけて
a4=182a
を得て
(a2181)2=a

が答えになります。18の逆数 (18x=1なる数)が出てきますがこれは普通に求めてもいいし、そもそも18161=27が逆数なのでそれを利用しても簡単に求まります。
答えとしては12が得られます。実際122=47です。

そうではない場合(例えば11)を探す場合は次のようにします。113=27です。27を冪冪で累乗していくと

(27)2=47(47)2=22
となり、ここで22が出ます。22はツリーのルートのすぐ右側にあるので、この数はツリーの右側にあることがわかります。ところでωですが次のような性質を持っています。

  • ω2を乗ずると2段目のノードに対して左右に移動する
  • ω4を乗ずると3段目のノードに対して左右に移動する

この性質を利用してω2(=18)を42に乗じて(-20になる)そのノードを右側のツリーの同じ場所におきます。そしてそこからまた冪冪でルートに戻っていきます。
このルートの中に求めるノードがあればそれが答えです。残念ながら今回もみつからないのでω4を乗じます。そうすると-27が無事見つかりました。これから答えが求まります。


71024png


最後に32乗してはじめて1になる数の見つけかたですが、これは平方非剰余な数を3乗すれば求めるものになります。平方非剰余な数は全体の半数ですからランダムに選んで(p1)/2乗して判定することができます。

この方法は運が悪いと沢山計算をする必要がありますが木の高さは sですから最悪でもs2くらいのオーダーの計算量になります。
一方葉は2sのオーダでこれを全部計算するのはsが大きくなるととんでもない数になります。sが小さいときは非効率ですが大きくなるにつれて優位性が増すと思われます。
Posted by issei

カテゴリ : 数学