尽管评论中有这样的说法,但这不是离散对数问题。这更类似于RSA problem,其中{}是两个大素数的乘积,b是加密指数,a是未知明文。我总是喜欢把x作为你想要求解的未知变量,所以你有y=xbmod c,其中y,b,和{}都是已知的,你要求解x。求解它涉及与RSA相同的基本数论,即必须计算z=b-1modλ(c),然后通过x=yzmod c求解x。λ是Carmichael's lambda function,但也可以使用Euler的phi(toclient)函数。我们将原问题简化为求λ(c)的逆模。如果c易于分解,或者我们已经知道c的因式分解,那么这很容易实现,否则就很难实现。如果c很小,那么暴力是一种可以接受的技术,您可以忽略所有复杂的数学。在
下面是一些显示这些步骤的代码:import functools
import math
def egcd(a, b):
"""Extended gcd of a and b. Returns (d, x, y) such that
d = a*x + b*y where d is the greatest common divisor of a and b."""
x0, x1, y0, y1 = 1, 0, 0, 1
while b != 0:
q, a, b = a // b, b, a % b
x0, x1 = x1, x0 - q * x1
y0, y1 = y1, y0 - q * y1
return a, x0, y0
def inverse(a, n)