本日アップロードしたばかりのこちらの記事
tsujimotter.hatenablog.com
では
を計算する効率的な方法がわからない、と書いていました。
先ほど nishimura さんという方に*1効率的な方法を教えていただきましたので、その方法を補足したいと思います。
「オイラーの基準」や「平方剰余の相互法則」といった初等整数論の知識は仮定します。
計算方法
まず、考えたいのはオイラーの基準です。一般に奇素数 に対して
が成り立ちます。
ここでもし、 として の平方非剰余なる数をとれば、左辺のルジャンドル記号が になりますから、
が得られます。
したがって
より、 とすれば、
を満たす が見つけられたことになります。
平方非剰余であるような は、 から のうち半分ですから、適当に探せばすぐに見つかります。
今回は平方剰余の相互法則を簡単化する都合上、 として特に奇素数を選んで探索することにします*2。
実際、 のときは という平方非剰余が見つかります。平方剰余の相互法則より
となり、たしかに平方非剰余ですね。
あとは、この を使って
を計算すればよいでしょう。
以上のような「べき剰余」の計算方法は、以下の記事
tsujimotter.hatenablog.com
でたくさん紹介したことがありましたが、今回は別の方法「繰り返し二乗法」を用います。
指数 を二進展開すると
と表せます。
こうしておくと
とかけますから「5の「2のべき乗」乗」だけ計算すればよいことがわかります。5の「2のべき乗」乗は、
という具合に、繰り返し自身を2乗していくことで、簡単に得られます。
とはいえ、やってみたところ手計算ではつらかったので( のあたりで断念しました)、ここはコンピュータの力をお借りします。
5^2 == 25 mod 2017 5^4 == 625 mod 2017 5^8 == 1344 mod 2017 5^16 == 1121 mod 2017 5^32 == 50 mod 2017 5^64 == 483 mod 2017 5^128 == 1334 mod 2017 5^256 == 562 mod 2017
よって
となり、 とすればよいことがわかりました!!
実際、 という式に代入して検算してみると
となり、正しいことが確認できますね。
そういえば、前回の記事の を計算するときの第1手目は
26 * 2017 = 229^2 + 1^2
でしたね!たしかに一致している!!
プログラム(改訂版)
今回の方針を使ったプログラムの改訂版もアップロードしましたので、よかったらお使いください。
20171201 の計算も一瞬で終わります。
(昨日のプログラムだと少し時間がかかった)