diff --git a/basis/math/polynomials/polynomials-docs.factor b/basis/math/polynomials/polynomials-docs.factor index cb2d2a6058..9c16bf8a7e 100644 --- a/basis/math/polynomials/polynomials-docs.factor +++ b/basis/math/polynomials/polynomials-docs.factor @@ -11,6 +11,7 @@ ARTICLE: "polynomials" "Polynomials" p- p* p-sq + p^ powers n*p p/mod @@ -74,6 +75,11 @@ HELP: p-sq { $description "Squares a polynomial." } { $examples { $example "USING: math.polynomials prettyprint ;" "{ 1 2 0 } p-sq ." "{ 1 4 4 0 0 }" } } ; +HELP: p^ +{ $values { "p" "a polynomial" } { "n" number } { "p^n" "a polynomial" } } +{ $description "Computes " { $snippet "p" } " to the power of " { $snippet "n" } "." } +{ $examples { $example "USING: math.polynomials prettyprint ;" "{ 1 2 0 } 3 p^ ." "{ 1 6 12 8 0 0 0 }" } } ; + HELP: p/mod { $values { "p" "a polynomial" } { "q" "a polynomial" } { "z" "a polynomial" } { "w" "a polynomial" } } { $description "Computes to quotient " { $snippet "z" } " and remainder " { $snippet "w" } " of dividing " { $snippet "p" } " by " { $snippet "q" } "." } diff --git a/basis/math/polynomials/polynomials-tests.factor b/basis/math/polynomials/polynomials-tests.factor index cd88d19d13..e0cedb9adf 100644 --- a/basis/math/polynomials/polynomials-tests.factor +++ b/basis/math/polynomials/polynomials-tests.factor @@ -15,6 +15,8 @@ IN: math.polynomials.tests [ { 0 0 0 } ] [ { 0 0 0 } { 0 0 0 } p- ] unit-test [ { 0 0 0 } ] [ 4 { 0 0 0 } n*p ] unit-test [ { 4 8 0 12 } ] [ 4 { 1 2 0 3 } n*p ] unit-test +[ { 1 4 4 0 0 } ] [ { 1 2 0 } p-sq ] unit-test +[ { 1 6 12 8 0 0 0 } ] [ { 1 2 0 } 3 p^ ] unit-test [ { 1 4 7 6 0 0 0 0 0 } ] [ { 1 2 3 0 0 0 } { 1 2 0 0 } p* ] unit-test [ V{ 7 -2 1 } V{ -20 0 0 } ] [ { 1 1 1 1 } { 3 1 } p/mod ] unit-test [ V{ 0 0 } V{ 1 1 } ] [ { 1 1 } { 1 1 1 1 } p/mod ] unit-test diff --git a/basis/math/polynomials/polynomials.factor b/basis/math/polynomials/polynomials.factor index 99d77d0ce2..694b9ef542 100644 --- a/basis/math/polynomials/polynomials.factor +++ b/basis/math/polynomials/polynomials.factor @@ -38,6 +38,15 @@ PRIVATE> : p-sq ( p -- p^2 ) dup p* ; +ERROR: negative-power-polynomial p n ; + +: p^ ( p n -- p^n ) + { + { [ dup 0 > ] [ 1 - dupd [ p* ] with times ] } + { [ dup 0 = ] [ 2drop { 1 } ] } + { [ dup 0 < ] [ negative-power-polynomial ] } + } cond ; +