UNPKG

1.35 kBtext/coffeescriptView Raw
1# Divide polynomials
2
3
4
5Eval_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
42divpoly = ->
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