factor/contrib/algebra/algebra.factor

55 lines
1.5 KiB
Factor

IN: algebra USING: lists math kernel words namespaces ;
GENERIC: (fold-consts) ( infix -- infix ? )
M: number (fold-consts)
f ;
M: var (fold-consts)
t ;
M: list2 (fold-consts)
2unlist (fold-consts) [
2list t
] [
swap arith-1 word-property unit call f
] ifte ;
M: list3 (fold-consts)
3unlist >r (fold-consts) r> swapd (fold-consts) >r rot r> or [
3list t
] [
rot arith-2 word-property unit call f
] ifte ;
: fold-consts ( infix -- infix )
#! Given a mathematical s-expression, perform constant folding,
#! which is doing all the calculations it can do without any
#! variables added.
(fold-consts) drop ;
VARIABLE: modularity
#! This is the variable that stores what mod we're in
GENERIC: (install-mod) ( infix -- infix-with-mod )
: put-mod ( object -- [ mod object modularity ] )
[ \ mod , , modularity , ] make-list ;
M: num/vc (install-mod)
put-mod ;
M: list2 (install-mod)
2unlist (install-mod) 2list put-mod ;
M: list3 (install-mod)
3unlist (install-mod) swap (install-mod) swap 3list put-mod ;
: install-mod ( arglist infix -- new-arglist infix-with-mod)
#! Given an argument list and an infix expression, produce
#! a new arglist and a new infix expression that will evaluate
#! the given one using modular arithmetic.
>r modularity swons r> (install-mod) ;
: quadratic-formula (| a b c |
[ [ - b ] / 2 * a ] +- [ sqrt [ sq b ] - 4 * a * c ] / 2 * a |) ;