106 lines
1.4 KiB
CoffeeScript
106 lines
1.4 KiB
CoffeeScript
# Divide polynomials
|
|
|
|
|
|
|
|
Eval_quotient = ->
|
|
push(cadr(p1)); # 1st arg, p(x)
|
|
Eval()
|
|
|
|
push(caddr(p1)); # 2nd arg, q(x)
|
|
Eval()
|
|
|
|
push(cadddr(p1)); # 3rd arg, x
|
|
Eval()
|
|
|
|
p1 = pop(); # default x
|
|
if (p1 == symbol(NIL))
|
|
p1 = symbol(SYMBOL_X)
|
|
push(p1)
|
|
|
|
divpoly()
|
|
|
|
#-----------------------------------------------------------------------------
|
|
#
|
|
# Divide polynomials
|
|
#
|
|
# Input: tos-3 Dividend
|
|
#
|
|
# tos-2 Divisor
|
|
#
|
|
# tos-1 x
|
|
#
|
|
# Output: tos-1 Quotient
|
|
#
|
|
#-----------------------------------------------------------------------------
|
|
|
|
#define DIVIDEND p1
|
|
#define DIVISOR p2
|
|
#define X p3
|
|
#define Q p4
|
|
#define QUOTIENT p5
|
|
|
|
divpoly = ->
|
|
h = 0
|
|
i = 0
|
|
m = 0
|
|
n = 0
|
|
x = 0
|
|
#U **dividend, **divisor
|
|
|
|
save()
|
|
|
|
p3 = pop()
|
|
p2 = pop()
|
|
p1 = pop()
|
|
|
|
h = tos
|
|
|
|
dividend = tos
|
|
|
|
m = coeff(p3, p1) - 1; # m is dividend's power
|
|
|
|
divisor = tos
|
|
|
|
n = coeff(p3, p2) - 1; # n is divisor's power
|
|
|
|
x = m - n
|
|
|
|
push_integer(0)
|
|
p5 = pop()
|
|
|
|
while (x >= 0)
|
|
|
|
push(stack[dividend+m])
|
|
push(stack[divisor+n])
|
|
divide()
|
|
p4 = pop()
|
|
|
|
for i in [0..n]
|
|
push(stack[dividend+x + i])
|
|
push(stack[divisor+i])
|
|
push(p4)
|
|
multiply()
|
|
subtract()
|
|
stack[dividend+x + i] = pop()
|
|
|
|
push(p5)
|
|
push(p4)
|
|
push(p3)
|
|
push_integer(x)
|
|
power()
|
|
multiply()
|
|
add()
|
|
p5 = pop()
|
|
|
|
m--
|
|
x--
|
|
|
|
moveTos h
|
|
|
|
push(p5)
|
|
|
|
restore()
|
|
|
|
|
|
|