Merge branch 'for-slava' of git://git.rfc1149.net/factor
commit
50bd57bbcd
|
@ -7,3 +7,4 @@ USING: math.primes.factors tools.test ;
|
||||||
{ 999967000236000612 } [ 999969000187000867 totient ] unit-test
|
{ 999967000236000612 } [ 999969000187000867 totient ] unit-test
|
||||||
{ 0 } [ 1 totient ] unit-test
|
{ 0 } [ 1 totient ] unit-test
|
||||||
{ { 425612003 } } [ 425612003 factors ] unit-test
|
{ { 425612003 } } [ 425612003 factors ] unit-test
|
||||||
|
{ { 13 4253 15823 32472893749823741 } } [ 28408516453955558205925627 factors ] unit-test
|
||||||
|
|
|
@ -10,21 +10,30 @@ IN: math.primes.factors
|
||||||
[ dupd /mod zero? ] curry [ nip [ 1+ ] dip ] while drop
|
[ dupd /mod zero? ] curry [ nip [ 1+ ] dip ] while drop
|
||||||
swap ;
|
swap ;
|
||||||
|
|
||||||
: write-factor ( n d -- n' d )
|
: write-factor ( n d -- n' d' )
|
||||||
2dup mod zero? [ [ [ count-factor ] keep swap 2array , ] keep ] when ;
|
2dup mod zero? [
|
||||||
|
[ [ count-factor ] keep swap 2array , ] keep
|
||||||
|
! If the remainder is a prime number, increase d so that
|
||||||
|
! the caller stops looking for factors.
|
||||||
|
over prime? [ drop dup ] when
|
||||||
|
] when ;
|
||||||
|
|
||||||
PRIVATE>
|
: (group-factors) ( n -- seq )
|
||||||
|
|
||||||
: group-factors ( n -- seq )
|
|
||||||
[
|
[
|
||||||
2
|
2
|
||||||
[ 2dup sq < ] [ write-factor next-prime ] until
|
[ 2dup sq < ] [ write-factor next-prime ] until
|
||||||
drop dup 2 < [ drop ] [ 1 2array , ] if
|
drop dup 2 < [ drop ] [ 1 2array , ] if
|
||||||
] { } make ;
|
] { } make ;
|
||||||
|
|
||||||
: unique-factors ( n -- seq ) group-factors [ first ] map ;
|
PRIVATE>
|
||||||
|
|
||||||
: factors ( n -- seq ) group-factors [ first2 swap <array> ] map concat ;
|
: group-factors ( n -- seq )
|
||||||
|
dup prime? [ 1 2array 1array ] [ (group-factors) ] if ; flushable
|
||||||
|
|
||||||
|
: unique-factors ( n -- seq ) group-factors [ first ] map ; flushable
|
||||||
|
|
||||||
|
: factors ( n -- seq )
|
||||||
|
group-factors [ first2 swap <array> ] map concat ; flushable
|
||||||
|
|
||||||
: totient ( n -- t )
|
: totient ( n -- t )
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Samuel Tardieu
|
|
@ -0,0 +1,14 @@
|
||||||
|
USING: help.markup help.syntax ;
|
||||||
|
IN: math.continued-fractions
|
||||||
|
|
||||||
|
HELP: approx
|
||||||
|
{ $values { "epsilon" "a positive floating point number representing the absolute acceptable error" } { "float" "a positive floating point number to approximate" } { "a/b" "a fractional number containing the approximation" } }
|
||||||
|
{ $description "Give a rational approximation of " { $snippet "float" } " with a precision of " { $snippet "epsilon" } " using the smallest possible denominator." } ;
|
||||||
|
|
||||||
|
HELP: >ratio
|
||||||
|
{ $values { "seq" "a sequence representing a continued fraction" } { "a/b" "a fractional number" } }
|
||||||
|
{ $description "Transform " { $snippet "seq" } " into its rational representation." } ;
|
||||||
|
|
||||||
|
HELP: next-approx
|
||||||
|
{ $values { "seq" "a mutable sequence" } }
|
||||||
|
{ $description "Compute the next step in continued fraction calculation." } ;
|
|
@ -0,0 +1,21 @@
|
||||||
|
USING: kernel math.constants math.continued-fractions tools.test ;
|
||||||
|
|
||||||
|
[ V{ 2 2.0 } ] [ V{ 2.5 } dup next-approx ] unit-test
|
||||||
|
[ V{ 2 2 } ] [ V{ 2.5 } dup next-approx dup next-approx ] unit-test
|
||||||
|
|
||||||
|
[ 5/2 ] [ V{ 2 2.1 } >ratio ] unit-test
|
||||||
|
[ 5/2 ] [ V{ 2 1.9 } >ratio ] unit-test
|
||||||
|
[ 5/2 ] [ V{ 2 2.0 } >ratio ] unit-test
|
||||||
|
[ 5/2 ] [ V{ 2 2 } >ratio ] unit-test
|
||||||
|
|
||||||
|
[ 3 ] [ 1 pi approx ] unit-test
|
||||||
|
[ 22/7 ] [ 0.1 pi approx ] unit-test
|
||||||
|
[ 355/113 ] [ 0.00001 pi approx ] unit-test
|
||||||
|
|
||||||
|
[ 2 ] [ 1 2 approx ] unit-test
|
||||||
|
[ 2 ] [ 0.1 2 approx ] unit-test
|
||||||
|
[ 2 ] [ 0.00001 2 approx ] unit-test
|
||||||
|
|
||||||
|
[ 3 ] [ 1 2.5 approx ] unit-test
|
||||||
|
[ 5/2 ] [ 0.1 2.5 approx ] unit-test
|
||||||
|
[ 5/2 ] [ 0.0001 2.5 approx ] unit-test
|
|
@ -0,0 +1,24 @@
|
||||||
|
! Copyright (C) 2009 Samuel Tardieu.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: kernel math math.functions sequences vectors ;
|
||||||
|
IN: math.continued-fractions
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: split-float ( f -- d i ) dup >integer [ - ] keep ;
|
||||||
|
|
||||||
|
: closest ( seq -- newseq ) unclip-last round >integer suffix ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: next-approx ( seq -- )
|
||||||
|
dup [ pop split-float ] [ push ] bi
|
||||||
|
dup zero? [ 2drop ] [ recip swap push ] if ;
|
||||||
|
|
||||||
|
: >ratio ( seq -- a/b )
|
||||||
|
closest reverse unclip-slice [ swap recip + ] reduce ;
|
||||||
|
|
||||||
|
: approx ( epsilon float -- a/b )
|
||||||
|
dup 1vector
|
||||||
|
[ 3dup >ratio - abs < ] [ dup next-approx ] while
|
||||||
|
2nip >ratio ;
|
|
@ -0,0 +1 @@
|
||||||
|
Continued fractions
|
Loading…
Reference in New Issue