algebrite
Version:
Computer Algebra System in Coffeescript
108 lines (72 loc) • 1.55 kB
text/coffeescript
#-----------------------------------------------------------------------------
#
# Factor small numerical powers
#
# Input: tos-2 Base (positive integer < 2^31 - 1)
#
# tos-1 Exponent
#
# Output: Expr on stack
#
#-----------------------------------------------------------------------------
#define BASE p1
#define EXPO p2
quickfactor = ->
i = 0
save()
p2 = pop(); # p2 is EXPO
p1 = pop(); # p1 is BASE
h = tos
push(p1); # p1 is BASE
factor_small_number()
n = tos - h
stackIndex = h
for i in [0...n] by 2
push(stack[stackIndex+i]); # factored base
push(stack[stackIndex + i + 1]); # factored exponent
push(p2); # p2 is EXPO
multiply()
quickpower()
# stack has n results from factor_number_raw()
# on top of that are all the expressions from quickpower()
# multiply the quickpower() results
multiply_all(tos - h - n)
p1 = pop()
moveTos h
push(p1)
restore()
# p1 (BASE) is a prime number so power is simpler
quickpower = ->
expo = 0
save()
p2 = pop(); # p2 is EXPO
p1 = pop(); # p1 is BASE
push(p2); # p2 is EXPO
bignum_truncate()
p3 = pop()
push(p2); # p2 is EXPO
push(p3)
subtract()
p4 = pop()
# fractional part of p2 (EXPO)
if (!iszero(p4))
push_symbol(POWER)
push(p1); # p1 is BASE
push(p4)
list(3)
push(p3)
expo = pop_integer()
if (isNaN(expo))
push_symbol(POWER)
push(p1); # p1 is BASE
push(p3)
list(3)
restore()
return
if (expo == 0)
restore()
return
push(p1); # p1 is BASE
bignum_power_number(expo)
restore()
#if SELFTEST