以下の2つの関数も役立ちます。
仮説
乗法逆数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