ポラード・ロー離散対数アルゴリズム
ポラード・ロー離散対数アルゴリズム (ポラード・ローりさんたいすうアルゴリズム、テンプレート:Lang-en)はテンプレート:日本語版にない記事リンクが1978年に導入した離散対数問題のアルゴリズムであり、ポラード・ロー素因数分解法と似た構造を持つ。
このアルゴリズムの目的は、テンプレート:Mvarが生成する巡回群テンプレート:Mvarとその元テンプレート:Mvarに対し、となるテンプレート:Mvarを求めることにある。そのためにまず、このアルゴリズムは となるテンプレート:Mvar, テンプレート:Mvar, テンプレート:Mvar, テンプレート:Mvarを求める。巡回群の位数テンプレート:Mvarが既知の場合、テンプレート:Mvarは方程式の解として求まる。
テンプレート:Mvar, テンプレート:Mvar, テンプレート:Mvar, テンプレート:Mvarを求めるにはフロイドの循環検出法を用いて、数列のサイクルを検出する。この数列は、関数を用いて計算できるように選ぶ。テンプレート:Mvarが十分にランダムなら、この数列は平均ステップでループに入る。このような関数は、例えば以下のようにすれば定義できる:まず、テンプレート:Mvarを大きさがほぼ等しい3つの集合, , の非交和に分割する。のときはテンプレート:Mvarとテンプレート:Mvarをそれぞれ2倍する。のときはテンプレート:Mvarをインクリメントする。のときはテンプレート:Mvarをインクリメントする。
アルゴリズム
テンプレート:Mvarを位数テンプレート:Mvarの巡回群、でテンプレート:Mvarはテンプレート:Mvarの生成元とし、をテンプレート:Mvarの分割とする。写像を以下のように定める: テンプレート:Indent また、とを テンプレート:Indent と定める。
入力 a: Gの生成元, b: Gの元
出力 ax = bを満たす整数xを返すか、失敗する
Initialise a0 ← 0, b0 ← 0, x0 ← 1 ∈ G,
i ← 1
loop
xi ← f(xi-1),
ai ← g(xi-1, ai-1),
bi ← h(xi-1, bi-1)
x2i ← f(f(x2i-2)),
a2i ← g(f(x2i-2), g(x2i-2, a2i-2)),
b2i ← h(f(x2i-2), h(x2i-2, b2i-2))
if xi = x2i then
r ← bi - b2i
if r = 0 return failure
x ← r−1(a2i - ai) mod p
return x
else # xi ≠ x2i
i ← i+1,
break loop
end if
end loop
計算量
実行時間はおよそである。テンプレート:日本語版にない記事リンクと組み合わせた場合の実行時間は、テンプレート:Mvarをテンプレート:Mvarの最大の素因数としたときである。