;; gcd(x,y) = x if y = 0 ;; gcd(x,y) = gcd(y,x mod y) (define gcd (lambda (x y) (if (zero? y) x (gcd y (remainder x y))))) ;; make rational in simplest form (define make-ratl (lambda (x y) (list (/ x (gcd x y)) (/ y (gcd x y))))) (define numr (lambda (x) (car x))) (define denr (lambda (x) (cadr x))) (define rprint (lambda (x) (if (= (denr x) 1) (begin (display (numr x)) (newline)) (begin (display (numr x)) (display '/) (display (denr x)) (newline))))) ;; a/b * c/d = a*c / b*d (define r* (lambda (x y) (make-ratl (* (numr x) (numr y)) (* (denr x) (denr y))))) ;; a/b + c/d = (a/b * d/d) + (c/d * b/b) = (a*d + c*b) / (b*d) (define r+ (lambda (x y) (make-ratl (+ (* (numr x) (denr y)) (* (numr y) (denr x))) (* (denr x) (denr y))))) ;; a/b - c/d = (a/b * d/d) - (c/d * b/b) = (a*d - c*b) / (b*d) (define r- (lambda (x y) (make-ratl (- (* (numr x) (denr y)) (* (numr y) (denr x))) (* (denr x) (denr y))))) ;; 1/(a/b) = b/a (define rinvert (lambda (x) (make-ratl (denr x) (numr x)))) ;; a/b / c/d = a/b * d/c (define r/ (lambda (x y) (r* x (rinvert y)))) ;; a/b = c/d iff a*d = b*c (define r= (lambda (x y) (= (* (numr x) (denr y)) (* (numr y) (denr x)))))