扩展的欧几里德算法和乘法逆的概念

时间:2012-09-20 19:25:01

标签: python

我有python:

e*d == 1%etf

我们知道(e)和(etf)并且必须发现(d)使用 扩展的欧几里得算法和概念 模运算的乘法逆。

d = (1/e)%etf

d = (e**-1)%etf

生成一个全球错误的号码,请帮我找 (d)使用上述规则。

解决方案( Modular multiplicative inverse function in Python) 下面说明给出了错误的计算结果

e*d == 1 (mod etf)
d = (e**(etf-2)) % etf 
d = pow(e,etf-2,etf)

我在其他地方犯了一些错误吗?这个计算好吗?

2 个答案:

答案 0 :(得分:3)

使用d = (e**(etf-2)) % etf列出的技巧仅在etf为素数时才有效。如果不是,则必须使用EEA本身来找到模乘法逆。

答案 1 :(得分:1)

这是扩展欧几里得算法的实现。我从this answer获取了代码,对其进行了推广,使其适用于2 62 以外的模数,并将其从Java转换为Python:

def multiplicativeInverse(x, modulus):
    if modulus <= 0:
       raise ValueError("modulus must be positive")

    a = abs(x)
    b = modulus
    sign = -1 if x < 0 else 1

    c1 = 1
    d1 = 0
    c2 = 0
    d2 = 1

    # Loop invariants:
    # c1 * abs(x) + d1 * modulus = a
    # c2 * abs(x) + d2 * modulus = b 

    while b > 0:
        q = a / b
        r = a % b
        # r = a - qb.

        c3 = c1 - q*c2
        d3 = d1 - q*d2

        # Now c3 * abs(x) + d3 * modulus = r, with 0 <= r < b.

        c1 = c2
        d1 = d2
        c2 = c3
        d2 = d3
        a = b
        b = r

    if a != 1:
        raise ValueError("gcd of %d and %d is %d, so %d has no "
                         "multiplicative inverse modulo %d"
                         % (x, modulus, a, x, modulus))

    return c1 * sign;