メモ

yukicoderでゆるふわgolf

baby-step giant-step

この記事ではbaby-step giant-stepの「気持ち」を説明します。
アルゴリズムの説明のみであり、実装については一切説明していません。

○baby-step giant-step algorithmとは
有限アーベル群上の離散対数問題を高速に解くアルゴリズム
平方分割でやる

○正確に
有限アーベル群Gの台集合*1に全順序が定まる*2とする。
群の演算と順序の比較がO(1)でできるとする。
a,gGが与えられたとき、ax=gを満たす最小のxZ0O(|G|log|G|)で求めることができる。

アルゴリズム
N=|G|とおく。
最初に0i<Kなるiに対してペア(i,ai)を計算しておき、第二要素をキーにしてソートする。
ここで数yを決めたとき、★「ay+i=gとなる0i<Kがあるかどうか(あるなら最小のものを求める)」という問題を考える。
これは「ai=gayとなる0i<Kがあるかどうか」なので、最初に計算した配列上で二分探索することでO(logK)で解くことができる。
yとして0,K,2K,を順に考えることで、★の問題をO(N/K)回解くことにより元の問題に答えることができる。(もとの問題の答えはN未満なので)
全体でO(KlogK+(N/K)logK)であるから、K=O(N)とすることでO(NlogN)になる。

○例
Fp上の離散対数問題
5x=12mod17を満たすxを求めよ
F17の元を{1,,16}Zと同一視して順序を定める。
0i<4について(i,5i)を計算する
(0,1),(1,5),(2,8),(3,6)→ソート→(0,1),(1,5),(3,6),(2,8)
2i=1250となるものを探す→ない
2i=1254=14となるものを探す→ない
2i=1258=5となるものを探す→(1,5)が見つかる→答えは1+8=9

*1:Gの群構造を忘れて単なる集合だと思ったもの

*2:この条件は「Gは順序群である」とは異なる。ここでの順序は群構造と整合性がある必要はない