模块化电源的负功率()

时间:2015-12-06 15:28:51

标签: python math modulo pow

我们如何在模块化上下文中使用带有负指数的pow

  

pow(x,y,[z])   如果存在z,则x和y必须是整数类型,y必须是非负的。

>>> pow(11444, -357)
0.0
>>> pow(11444, -357) % 48731
0.0
>>> pow(11444, -357, 48731)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pow() 2nd argument cannot be negative when 3rd argument specified

在我的用例中,我想使用Schnorr方案加密消息:

y = (g ** -w) mod p

pow不接受负数作为第二个参数。例如,来自

g = 11444
p = 48731
w = 357

y应为7355

2 个答案:

答案 0 :(得分:5)

pow无法自动为您计算modular multiplicative inverse。相反,我们可以自己计算它(比如通过扩展的Eulidean算法),然后将pow(a,-b,c)重写为pow((a^-1) mod c, b, c)。从this question窃取MMI代码:

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
        return (g, x - (b // a) * y, y)

def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('modular inverse does not exist')
    else:
        return x % m

我们得到了

>>> g = 11444
>>> p = 48731
>>> w = 357
>>> modinv(g, p)
29420
>>> pow(modinv(g, p), w, p)
7355

答案 1 :(得分:1)

从python 3.8开始,您可以执行此操作。 3.9添加了关键字参数。检出代码here。有用法

>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True