所以我试图实现Baby Step Giant Step算法来计算离散日志。以下是我的代码:
# 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.有人可以告诉我我做错了什么吗?
答案 0 :(得分:4)
模数反转不是通过采用实数逆并计算结果的模数来计算的。要查找a
mod p
的乘法逆,您需要找到带有b
的整数 ab = 1 (mod p)
。这可以通过使用扩展欧几里得算法或使用费马的小定理(作为捷径)来完成:
a**(p-1) = 1 (mod p)
这意味着a**(p-2) (mod p)
是a
的倒数。
答案 1 :(得分:0)
# trying to solve 8576 = 3^x (mod 53047)
p = 53047
a = 3
B = 8576
P应该总是> B怎么可能(a ^ x mod P = B和B> P)再看一遍
祝你好运