diff --git a/extra/math/extras/extras-tests.factor b/extra/math/extras/extras-tests.factor index a643169b95..c5c26cb99f 100644 --- a/extra/math/extras/extras-tests.factor +++ b/extra/math/extras/extras-tests.factor @@ -142,3 +142,9 @@ IN: math.extras.test { { 0 1 2 3 0 0 1 } } [ { 1 2 3 3 2 1 2 } [ <= ] monotonic-count ] unit-test { 4 } [ { 1 2 3 1 2 3 4 5 } [ < ] max-monotonic-count ] unit-test + +{ 2470 } [ 20 iota sum-squares ] unit-test +{ 2470 } [ 20 iota >array sum-squares ] unit-test + +{ 36100 } [ 20 iota sum-cubes ] unit-test +{ 36100 } [ 20 iota >array sum-cubes ] unit-test diff --git a/extra/math/extras/extras.factor b/extra/math/extras/extras.factor index cbedb7f0ad..9b2a86a285 100644 --- a/extra/math/extras/extras.factor +++ b/extra/math/extras/extras.factor @@ -307,3 +307,12 @@ PRIVATE> SYNTAX: .. dup pop scan-object [a,b) suffix! ; SYNTAX: ... dup pop scan-object [a,b] suffix! ; + +GENERIC: sum-squares ( seq -- n ) +M: object sum-squares [ sq ] map-sum ; +M: iota-tuple sum-squares + length 1 - [ ] [ 1 + ] [ 1/2 + ] tri * * 3 / ; + +GENERIC: sum-cubes ( seq -- n ) +M: object sum-cubes [ 3 ^ ] map-sum ; +M: iota-tuple sum-cubes sum sq ;