快速计算x ^(1 / y)mod m(模块化根)

时间:2018-04-08 07:53:00

标签: algorithm number-theory

如何快速求解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称为模幂运算,这称为模块根?

1 个答案:

答案 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

中的模块化反码
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)

RSA基于m是两个不同质数p,q的乘积的情况。与上述相同的想法适用,但是需要找到y'使得yy'= 1(mod lcm((p-1)(q-1)))。与上述不同,只有y和m才能轻易做到这一点,因为没有已知的有效方法可以找到p和q。