1 | # Divide polynomials
|
2 |
|
3 |
|
4 |
|
5 | Eval_quotient = ->
|
6 | push(cadr(p1)); # 1st arg, p(x)
|
7 | Eval()
|
8 |
|
9 | push(caddr(p1)); # 2nd arg, q(x)
|
10 | Eval()
|
11 |
|
12 | push(cadddr(p1)); # 3rd arg, x
|
13 | Eval()
|
14 |
|
15 | p1 = pop(); # default x
|
16 | if (p1 == symbol(NIL))
|
17 | p1 = symbol(SYMBOL_X)
|
18 | push(p1)
|
19 |
|
20 | divpoly()
|
21 |
|
22 | #-----------------------------------------------------------------------------
|
23 | #
|
24 | # Divide polynomials
|
25 | #
|
26 | # Input: tos-3 Dividend
|
27 | #
|
28 | # tos-2 Divisor
|
29 | #
|
30 | # tos-1 x
|
31 | #
|
32 | # Output: tos-1 Quotient
|
33 | #
|
34 | #-----------------------------------------------------------------------------
|
35 |
|
36 | #define DIVIDEND p1
|
37 | #define DIVISOR p2
|
38 | #define X p3
|
39 | #define Q p4
|
40 | #define QUOTIENT p5
|
41 |
|
42 | divpoly = ->
|
43 | h = 0
|
44 | i = 0
|
45 | m = 0
|
46 | n = 0
|
47 | x = 0
|
48 | #U **dividend, **divisor
|
49 |
|
50 | save()
|
51 |
|
52 | p3 = pop()
|
53 | p2 = pop()
|
54 | p1 = pop()
|
55 |
|
56 | h = tos
|
57 |
|
58 | dividend = tos
|
59 |
|
60 | push(p1)
|
61 | push(p3)
|
62 | m = coeff() - 1; # m is dividend's power
|
63 |
|
64 | divisor = tos
|
65 |
|
66 | push(p2)
|
67 | push(p3)
|
68 | n = coeff() - 1; # n is divisor's power
|
69 |
|
70 | x = m - n
|
71 |
|
72 | push_integer(0)
|
73 | p5 = pop()
|
74 |
|
75 | while (x >= 0)
|
76 |
|
77 | push(stack[dividend+m])
|
78 | push(stack[divisor+n])
|
79 | divide()
|
80 | p4 = pop()
|
81 |
|
82 | for i in [0..n]
|
83 | push(stack[dividend+x + i])
|
84 | push(stack[divisor+i])
|
85 | push(p4)
|
86 | multiply()
|
87 | subtract()
|
88 | stack[dividend+x + i] = pop()
|
89 |
|
90 | push(p5)
|
91 | push(p4)
|
92 | push(p3)
|
93 | push_integer(x)
|
94 | power()
|
95 | multiply()
|
96 | add()
|
97 | p5 = pop()
|
98 |
|
99 | m--
|
100 | x--
|
101 |
|
102 | moveTos h
|
103 |
|
104 | push(p5)
|
105 |
|
106 | restore()
|
107 |
|
108 |
|
109 |
|