这个问题的规范答案是"使用扩展的欧几里德算法"然而,它利用了分频和乘法运算,这对FPGA上的大数字很难实现。我想在RSA密钥生成中使用它。
答案 0 :(得分:2)
给定n
,让Φ(n)
为小于n
的整数,并且相对于它是素数。
从https://en.wikipedia.org/wiki/Euler%27s_theorem开始,如果m
是n
的相对素数,则m^(Φ(n)-1)
是m
的乘法逆。这可以使用O(log(n))
次乘法计算。
答案 1 :(得分:2)
它用算术移位,比较和减法代替除法
扩展的二进制GCD,类似于扩展的欧几里得算法,由Knuth提供,并提供指向其他版本的指针。
我找到了二进制扩展欧几里德算法here的Python实现:
def strip_powers_of_two(c, p, q, gamma, delta):
c = c / 2
if (p % 2 == 0) and (q % 2 == 0):
p, q = p//2, q//2
else:
p, q = (p + delta)//2, (q - gamma)//2
return c, p, q
def ext_bin_gcd(a,b):
u, v, s, t, r = 1, 0, 0, 1, 0
while (a % 2 == 0) and (b % 2 == 0):
a, b, r = a//2, b//2, r+1
alpha, beta = a, b
while (a % 2 == 0):
a, u, v = strip_powers_of_two(a, u, v, alpha, beta)
while a != b:
if (b % 2 == 0):
b, s, t = strip_powers_of_two(b, s, t, alpha, beta)
elif b < a:
a, b, u, v, s, t = b, a, s, t, u, v
else:
b, s, t = b - a, s - u, t - v
return (2 ** r) * a, s, t