下面这两个功能也可以为您提供帮助。
理论
下面是我们如何找到乘法逆 d。我们想要 e*d = 1(mod n),这意味着对于某个整数 k,ed + nk = 1。因此,我们将编写一个求解一般方程 ax + by = 1 的过程,其中 a 和 b 给定,x 和 y 是变量,所有这些值都是整数。我们将使用这个过程来求解 d 和 k 的 ed + nk = 1。然后我们可以丢弃 k 并简单地返回 d。>
(define (ax+by=1 a b)
(if (= b 0)
(cons 1 0)
(let* ((q (quotient a b))
(r (remainder a b))
(e (ax+by=1 b r))
(s (car e))
(t (cdr e)))
(cons t (- s (* q t))))))
此函数是方程的一般解,形式为 ax+by=1,其中 a 和 b 已给定。inverse-mod 函数仅使用此解并返回逆。
(define inverse-mod (lambda (a m)
(if (not (= 1 (gcd a m)))
(display "**Error** No inverse exists.")
(if (> 0(car (ax+by=1 a m)))
(+ (car (ax+by=1 a m)) m)
(car (ax+by=1 a m))))))
一些测试用例是:
(inverse-mod 5 11) ; -> 9 5*9 = 45 = 1 (mod 11)
(inverse-mod 9 11) ; -> 5
(inverse-mod 7 11) ; -> 8 7*8 = 56 = 1 (mod 11)
(inverse-mod 5 12) ; -> 5 5*5 = 25 = 1 (mod 12)
(inverse-mod 8 12) ; -> error no inverse exists