fork download
  1. ; gcd by factoring
  2.  
  3. (define (factors n)
  4. (let ((wheel '#(1 2 2 4 2 4 2 4 6 2 6)))
  5. (let loop ((n n) (f 2) (fs (list)) (w 0))
  6. (if (< n (* f f)) (reverse (cons n fs))
  7. (if (zero? (modulo n f))
  8. (loop (/ n f) f (cons f fs) w)
  9. (loop n (+ f (vector-ref wheel w)) fs
  10. (if (= w 10) 3 (+ w 1))))))))
  11.  
  12. (define (common lt? xs ys)
  13. (let loop ((xs xs) (ys ys) (zs (list)))
  14. (cond ((or (null? xs) (null? ys)) (reverse zs))
  15. ((lt? (car xs) (car ys)) (loop (cdr xs) ys zs))
  16. ((lt? (car ys) (car xs)) (loop xs (cdr ys) zs))
  17. (else (loop (cdr xs) (cdr ys) (cons (car xs) zs))))))
  18.  
  19. (define (gcd-by-factoring m n)
  20. (apply * (common < (factors m) (factors n))))
  21.  
  22. (display (gcd-by-factoring 24 60)) (newline)
  23. (display (gcd-by-factoring 11111111 13290059)) (newline)
Success #stdin #stdout 0.02s 42848KB
stdin
Standard input is empty
stdout
12
1