我有四个大号(最多100位),如m, y, n, r
m * y mod n = r
。我知道m,n
和r
的价值,我想找到y
的价值。 python3
中有一个函数可以执行此操作吗? (例如powmod
)中的gmpy2
函数
答案 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
这与欧几里德算法具有相同的效率,即divisor
和modulus
中较小的数字的五倍。 dividend
的大小基本上无关紧要。在您的情况下,这意味着最多500步。这听起来像一个很大的数字,但我用更大的数字测试它,它似乎足够快,这500个步骤很少发生 - 基本上当divisor
和modulus
是Fibonacci序列中的连续数字时。 / p>