少し厄介なのが、65536*65536も0になってしまうこと。 正しく計算するなら low0%=A%>>16&65535 up0%=A%&65535 low1%=B%>>16&65535 up1%=B%&65535 c0%=low0%*low1% MOD P% c2%=up0%*up1% MOD P% C%=(c2%+c0%)mod P%-(up0%-low0%+P%)*(up1%-low1%+P%) MOD P%+P% IF C%>=P% THEN C%=C%-P% C%=c2%*32768mod P%*32768mod P%*4mod P%+C%*32768mod P%*2MOD P% IF C%>=P% THEN C%=C%-P% C%=C%+c0% IF C%>=P% THEN C%=C%-P%
…面倒の極みじゃん。(脳死でカラツバ法使ってしまったけど、多分普通にやった方がシンプルで速い)
こういち2021/12/3 12:59◆.Id/aHiU36hu
low0%=A%>>16&65535 up0%=A%&65535 low1%=B%>>16&65535 up1%=B%&65535 t%=up0%*up1%mod P%*32768mod P%*32768mod P%*4mod P% t%=t%+low0%*low1%mod P% if t%>=P% then t%=t%-P% C%=low0%*up1%mod P%+low1%*up0%mod P%+t% if C%>=P% then C%=C%-P%
…だいぶシンプルになった…のか?
こういち2021/12/3 21:09◆.Id/aHiU36hu
Garnerのアルゴリズムを知っていますか?僕は少ししか知りません。
こういち2021/12/4 12:22◆.Id/aHiU36hu
ちなみに、今日誕生日です。前に投稿した12月生まれの一人です。
こういち2021/12/4 12:28◆.Id/aHiU36hu
話は戻って、Garnerのアルゴリズム。 1000000007<PQ<2147483647 となるような素数PQを取ってきて、 AB MOD P AB MOD Q からAB MOD PQを復元しようと思ったけど、復元するには逆数を求める必要があって、逆数を求めるのに30回前後の計算が必要なので、普通にやった方が速いかな。