Polynomial long division: Difference between revisions

Content added Content deleted
Line 1,406: Line 1,406:
(if (zero? pi) d i)))
(if (zero? pi) d i)))
(define (lead p) (vector-ref p (deg p)))
(define (lead p) (vector-ref p (deg p)))
(define (mono d c) (build-vector (+ d 1) (λ(i) (if (= i d) c 0))))
(define (mono c d) (build-vector (+ d 1) (λ(i) (if (= i d) c 0))))
(define (poly*cx^n c n p) (vector-append (make-vector n 0) (for/vector ([pi p]) (* c pi))))
(define (poly*cx^n c n p) (vector-append (make-vector n 0) (for/vector ([pi p]) (* c pi))))
(define (poly+ p q) (poly/lin 1 p 1 q))
(define (poly+ p q) (poly/lin 1 p 1 q))
Line 1,427: Line 1,427:
[(< N D) (values 0 n)]
[(< N D) (values 0 n)]
[else (define c (/ (lead n) (lead d)))
[else (define c (/ (lead n) (lead d)))
(define e (- N D))
(define q (mono c (- N D)))
(define q (mono e c))
(define r (poly- n (poly*cx^n c (- N D) d)))
(define r (poly- n (poly*cx^n c e d)))
(define-values (q1 r1) (poly/ r d))
(define-values (q1 r1) (poly/ r d))
(values (poly+ q q1) r1)]))
(values (poly+ q q1) r1)]))