-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathalg-polynomial-division.sls
67 lines (49 loc) · 1.62 KB
/
alg-polynomial-division.sls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!r6rs
(library (mpl alg-polynomial-division)
(export alg-mult-inverse
alg-divide
alg-coeff-simp
alg-polynomial-division
alg-quotient
alg-remainder)
(import (mpl rnrs-sans)
(mpl arithmetic)
(mpl util)
(mpl degree-gpe)
(mpl leading-coefficient-gpe)
(mpl collect-terms)
(mpl algebraic-expand)
(mpl polynomial-division)
(mpl extended-euclidean-algorithm))
(define (alg-mult-inverse v p a)
(list-ref (extended-euclidean-algorithm v p a) 1))
(define (alg-divide u v p a)
(remainder (algebraic-expand
(* u (alg-mult-inverse v p a)))
p a))
(define (alg-coeff-simp u x p a)
(collect-terms (remainder u p a) (list x)))
(define (alg-polynomial-division u v x p a)
(let ((q 0)
(r u)
(m (degree-gpe u '(x)))
(n (degree-gpe v '(x)))
(lcv (leading-coefficient-gpe v x))
(lcr #f)
(s #f))
(while (>= m n)
(set! lcr (leading-coefficient-gpe r x))
(set! s (alg-divide lcr lcv p a))
(set! q (+ q (* s (^ x (- m n)))))
(set! r (algebraic-expand
(- (- r (* lcr (^ x m)))
(* (- v (* lcv (^ x n)))
s
(^ x (- m n))))))
(set! r (alg-coeff-simp r x p a))
(set! m (degree-gpe r '(x))))
(list q r)))
(define (alg-quotient u v x p a)
(list-ref (alg-polynomial-division u v x p a) 0))
(define (alg-remainder u v x p a)
(list-ref (alg-polynomial-division u v x p a) 1)))