如何快速求解x ^(1 / y)mod m,其中x,y,m都是正整数?
这是为了反转x ^ y mod m的计算。例如
派对A双方乙方提前同意正整数y和m A方生成一个数字x1(0 B方计算x2 ^(1 / y)mod m,以便它返回x1 我知道如何快速计算x1 ^ y mod m,但我不知道如何快速计算x2 ^(1 / y)mod m。有什么建议吗? 我不知道怎么称呼这个问题。给定x ^ y mod m称为模幂运算,这称为模块根?
答案 0 :(得分:4)
我想你问的是这个问题:给定y,m,x ^ y(mod m)的结果找到x(假设0 <= x 一般情况下,这没有解决方案 - 例如,对于y = 2,m = 4,0 ^ 2,1 1,2 ^ 2,2 ^ 2,3 = 0,1,0,1 (mod 4),所以如果给你一个数字mod 4的平方,你就无法取回原来的数字。 但是,在某些情况下,您可以这样做。例如,当m为素数且y与m-1相互作用时。然后可以找到y',使得对于所有0&lt; = x&lt; m,(x ^ y)^ y'= x(mod m)。 注意(x ^ y)^ y'= x ^(yy')。忽略x = 0时的平凡情况,如果m是素数费马的小定理告诉我们x ^(m-1)= 1(mod m)。因此我们可以解决yy'= 1(mod m-1)。这有一个解决方案(可以使用扩展的欧几里德算法找到),假设y和m-1是互质的。 这是工作代码,示例y = 5,m = 17。它使用https://en.wikibooks.org/wiki/Algorithm_Implementation/Mathematics/Extended_Euclidean_algorithm RSA基于m是两个不同质数p,q的乘积的情况。与上述相同的想法适用,但是需要找到y'使得yy'= 1(mod lcm((p-1)(q-1)))。与上述不同,只有y和m才能轻易做到这一点,因为没有已知的有效方法可以找到p和q。def egcd(a, b):
if a == 0: return b, 0, 1
g, x, y = egcd(b%a, a)
return g, y - (b//a) * x, x
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise AssertionError('no inverse')
return x % m
def encrypt(xs, y, m):
return [pow(x, y, m) for x in xs]
def decrypt(xs, y, m):
y2 = modinv(y, m-1)
return encrypt(xs, y2, m)
y = 5
m = 17
e = encrypt(range(m), y, m)
print decrypt(e, y, m)