如何实现Extended Euclidean算法?

时间:2014-05-19 00:35:06

标签: algorithm function scheme

如何实施Extended Euclidean algorithm?这是我的第一次尝试:

(define ex-gcd a b 
 ; gcd(a,b) = a * x+ b * y 
 ; gcd(a,b)-> always will be 1
 output: (x.y) 
)

1 个答案:

答案 0 :(得分:1)

该算法在维基百科中是正确的here,您只需将其调整为仅返回Bézout系数,返回的car - 单元格的cons部分将为{{1} } x将是cdr

y

使用Bézout's identity对其进行测试很容易,对(define (extended-gcd a b) (let loop ([s 0] [t 1] [r b] [old-s 1] [old-t 0] [old-r a]) (if (zero? r) (cons old-s old-t) (let ((q (quotient old-r r))) (loop (- old-s (* q s)) (- old-t (* q t)) (- old-r (* q r)) s t r))))) a使用不同的值,并验证其是否与宣传的一样:

b

请注意,算法计算了其他值,通过更改返回的内容,您还可以获得以下内容:

(define (test a b)
  (let* ((ans (extended-gcd a b))
         (x (car ans))
         (y (cdr ans)))
    (= (gcd a b) (+ (* a x) (* b y)))))

(test 384 256)
=> #t