这是我的代码:
import math
# I define a function that will calculate the log
def shank(a,p,z):
x=math.log(p,a)%z
return (x)
print("First log")
print(shank(106, 12375, 24691))
print("Second log")
print(shank(6, 248388, 458009))
我得到了正确的答案,但它并没有给我整数。例如,如果我输入
print(shank(3, 525, 809))
我得到5.701190790597276,而309也可以,我会更喜欢这个答案。 谢谢你的帮助。
答案 0 :(得分:2)
math.log(p, a) % z
不是离散对数。这个表达式告诉Python计算一个常规对数,除以z
,并给你余数。如果你能以某种方式限制Python仅使用整数,你仍然不会得到离散对数;当Python发现math.log(p, a)
没有整数解决方案时,你会得到一个异常。
Python没有内置的离散对数例程。有效地计算离散对数是计算机科学中一个着名的未解决的问题,并且许多加密系统依赖于它很难。也就是说,如果您使用一个非常慢的解决方案,那么您可以计算越来越高的模块化功能,直到找到一个有效的功能:
def discrete_log(base, target, modulus):
i = 0
power = 1
while power != target:
power = (power * base) % modulus
i += 1
return i