用于计算python3中特定mod的函数

时间:2016-11-22 20:02:48

标签: python python-3.x biginteger mod

我有四个大号(最多100位),如m, y, n, r m * y mod n = r。我知道m,nr的价值,我想找到y的价值。 python3中有一个函数可以执行此操作吗? (例如powmod)中的gmpy2函数

1 个答案:

答案 0 :(得分:0)

如果问题中r的值保证为1,则有一些可用的Python函数,例如gmpy中的invert函数或gmpy2模块。我还没有找到你想要的更通用的除法功能。您可以使用标准反转函数,但它们将禁止实际可以执行的某些分区。

这是我刚刚编写的一个基于sample code in Wikipedia的函数,尽可能高效。使用您的术语,请致电divideresidues(r, m, n)

def divideresidues(dividend, divisor, modulus):
    """Return the dividend / divisor modulo modulus"""
    r, newr = modulus, divisor
    t, newt = 0, 1
    while newr != 0:
        quotient, remainder = divmod(r, newr)
        r, newr = newr, remainder
        t, newt = newt, t - quotient * newt
    if t < 0:
        t = t + modulus
    quotient, remainder = divmod(dividend, r)
    if remainder:
        raise ValueError('Bad division in divideresidues()')
    return t * quotient % modulus

这与欧几里德算法具有相同的效率,即divisormodulus中较小的数字的五倍。 dividend的大小基本上无关紧要。在您的情况下,这意味着最多500步。这听起来像一个很大的数字,但我用更大的数字测试它,它似乎足够快,这500个步骤很少发生 - 基本上当divisormodulus是Fibonacci序列中的连续数字时。 / p>