m, y, n, r
我有四个像这样的大数字(最多 100 位)m * y mod n = r
。我知道 and 的价值m,n
,r
我想找到 的价值y
。有这样做的功能python3
吗?(如 中的powmod
函数gmpy2
)
问问题
210 次
1 回答
0
如果r
您的问题中的值保证为1
,则有一些可用的 Python 函数,例如invert
gmpy 或gmpy2模块中的函数。我还没有找到您想要的更通用的除法功能。您可以使用标准的反转函数,但它们将不允许一些实际可以完成的除法。
这是我刚刚编写的一个函数,它基于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
于 2016-11-24T01:14:30.490 回答