我有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)
我在其他地方犯了一些错误吗?这个计算好吗?
答案 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;