(define (rref x) (if (or (null? x) (null? (car x))) x (let ((a (call-with-current-continuation (lambda (cc) (let df ((y x)) (if (null? y) (cc x) (if (zero? (caar y)) (let ((z (df (cdr y)))) (if (null? z) y (cons (car z) (cons (car y)(cdr z))))) y))))))) (if (zero? (caar a)) (map (lambda (x) (cons 0 x)) (rref (map cdr a))) (let* ( (b (let* ((r (/ (caar a))) (top (map (lambda (z) (* z r)) (car a)))) (cons top (map (lambda (row) (map (lambda (t re) (- re (* t (car row)))) top row)) (cdr a))))) (c (rref (map cdr (cdr b)))) ; now we must ensure a zero in row (cdar b) above each initial 1 a row of c. (d (let w ((sm (cdar b))(i c)) (if (null? i) sm (w (let sr ((x sm) (y (car i))) (if (null? x) '() (if (zero? (car y)) (cons (car x) (sr (cdr x)(cdr y))) (map (lambda (p q)(- p (* (car x) q))) x y)))) (cdr i)))))) (cons (cons 1 d) (map (lambda (x) (cons 0 x)) c))))))) (define (transpose x) (if (null? (car x)) '() (cons (map car x) (transpose (map cdr x))))) (define (clz a) (if (or (null? a) (not (zero? (car a)))) 0 (+ 1 (clz (cdr a))))) (define ((cull n) l) (let px ((l l)(n n)(k 0)) (if (null? n) l (if (null? l) '() (if (= (car n) k) (px (cdr l) (cdr n) (+ k 1)) (cons (car l) (px (cdr l) n (+ k 1)))))))) (define (flip x) (if (null? x) '() (cons (let ifl ((a (car x))) (if (null? a) '() (cons (- (car a)) (ifl (cdr a))))) (flip (cdr x))))) (define (iden k) (if (zero? k) '() (if (= k 1) '((1)) (let ((z (iden (- k 1)))) (cons (cons 1 (cons 0 (cdar z))) (map (lambda (v) (cons 0 v)) z)))))) (define (dss k) (transpose (let* ((a (map clz k)) (k (let ((l (length (car k)))) (let ly ((k k) (a a)) (if (null? k) '() (if (= l (car a)) '() (cons (car k) (ly (cdr k)(cdr a)))))))) (b (map (cull a) k))) (let puff ((a a)(k (flip b))(i (iden (length (car b))))(j 0)) (if (and (null? k) (null? i)) '() (if (and (not (null? a)) (= j (car a))) (cons (car k) (puff (cdr a) (cdr k) i (+ j 1))) (cons (car i) (puff a k (cdr i) (+ j 1))) )))))) (define (inter a b) (dss (rref (append (dss (rref a)) (dss (rref b)))))) ; Demo (define a '((2.534 4.22 -5.39 0.72003 3.42) (2.344 3.621 0.7 -4.335 5.344) (2.335 4.212 -4.3 -2.1 6.4))) (define b '((2.354 6.432 3.22 7.6 -2.1) (-3.22 5.4 3.8 3.2 3) (2.6 -4.3 2.2 6.2 3.22))) (inter a b) ; => ((-0.7283600205908938 -0.8280524922929828 -0.009575249421887921 -0.7131794687048522 1)) (inter a (cons '(3 4 2 6.4 3) b)) ; => ((3.785652327371516 5.09353175508096 -1.738365240680639 1 0) ; (1.9714894949452109 2.8045497786269493 -1.2493416481854884 0 1))