私は離散的なログを計算するために赤ちゃんステップ巨大ステップアルゴリズムを実装しようとしています。以下は私のコードです:離散的なログの赤ちゃんステップ巨大ステップアルゴリズム:不正な巨大ステップ
# trying to solve 8576 = 3^x (mod 53047)
p = 53047
a = 3
B = 8576
m = int(math.ceil(math.sqrt(p-1)))
baby = []
giant = []
for j in range(0,m-1):
baby.append((a**j)%p)
for k in range(0,m-1):
val = a**(-1)%p
val2 = val**(k*m)%p
giant.append((B*val2)%p)
for i in xrange(len(baby)):
if giant[k] == baby[k]:
x = j + m*k
私は出力なし試合のような非常に小さな値を取得していますので、私の大きな一歩と間違って何かがあると思います。正解はx = 1234です。誰かが私が間違っていることを教えてもらえますか?
を取ることができるべきです'(a ** j)%p'ではなく' pow(a、j、p) 'でオーバーフローする危険性があり、それ以外の点では非常に非効率的です –
"巨大な "ステップは実際には小さなステップです。私はこの方法に慣れていませんが、奇妙に思えます... 'a **( - 1)%p'は常に' 1/a'になります。そして '1/a'を大きな再びmod pを実行しますが、無限小数点のmod pを取っています。これは無意味です。あなたはa、mod pの* inverse *を計算しようとしていますか? – gariepy