如何实施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)
)
答案 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