multiplicative inverse of modulo m in scheme

后端 未结 4 1097
自闭症患者
自闭症患者 2021-01-23 16:58

I\'ve written the code for multiplicative inverse of modulo m. It works for most of the initial cases but not for some. The code is below:

(define (inverse x m)
         


        
4条回答
  •  太阳男子
    2021-01-23 17:05

    These two functions below can help you as well.

    Theory

    Here’s how we find the multiplicative inverse d. We want e*d = 1(mod n), which means that ed + nk = 1 for some integer k. So we’ll write a procedure that solves the general equation ax + by = 1, where a and b are given, x and y are variables, and all of these values are integers. We’ll use this procedure to solve ed + nk = 1 for d and k. Then we can throw away k and simply return 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))))))
    

    This function is a general solution to an equation in form of ax+by=1 where a and b is given.The inverse-mod function simply uses this solution and returns the inverse.

     (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))))))
    

    Some test cases are :

    (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
    

提交回复
热议问题