generated at
expmod


アルゴリズムと具体例
a^x\pmod nを求めたい
アルゴリズム
入力: a,x,n
出力: a^x
xを2進数表示(x_{k-1},x_{k-2},\cdots,x_0)_2にする
添字が降順なことに注意
y=1とおき、i=(k-1)\rightarrow0まで以下を繰り返す
step1: y:=y^2\pmod n
step2: x_i=1ならy:=y\times a\pmod n
最後にyを出力
x=19を考える
2進数表示は(10011)_2
なのでk=4
アルゴリズムの経過
iyx_iyを更新する
41^21y := 1×a = a
3a^20なにもしない
2(a^2)^20なにもしない
1((a^2)^2)^21y := ((a^2)^2)^2 * a
0(((a^2)^2)^2 * a)^21y := (((a^2)^2)^2 * a)^2 * a


上のアルゴリズムと全く同じものをMathematicaで書いた
nb
FPower[a_, n_, m_] := Module[{y = 1, arr = Bin[n], i}, For[i = Length[arr] - 1, i >= 0, i--, y = Mod[y^2, m]; If[Part[arr, Length[arr] - i] == 1, y = Mod[y*a, m]]; ]; Return[y]; ]
尚、Mathematicaにはもともと PowerMod という同様の関数がある