Merge branch 'for-slava' of git://git.rfc1149.net/factor

db4
Slava Pestov 2010-06-11 20:10:07 -04:00
commit e4d6611070
2 changed files with 22 additions and 1 deletions

View File

@ -5,6 +5,8 @@ IN: math.primes.tests
{ 1237 } [ 1234 next-prime ] unit-test
{ f t } [ 1234 prime? 1237 prime? ] unit-test
{ { 2 3 5 7 } } [ 10 primes-upto >array ] unit-test
{ { 2 } } [ 2 primes-upto >array ] unit-test
{ { } } [ 1 primes-upto >array ] unit-test
{ { 999983 1000003 } } [ 999982 1000010 primes-between >array ] unit-test
{ { 4999963 4999999 5000011 5000077 5000081 } }
@ -13,6 +15,12 @@ IN: math.primes.tests
{ { 8999981 8999993 9000011 9000041 } }
[ 8999980 9000045 primes-between >array ] unit-test
{ { } } [ 5 4 primes-between >array ] unit-test
{ { 2 } } [ 2 2 primes-between >array ] unit-test
{ { 2 } } [ 1.5 2.5 primes-between >array ] unit-test
[ 2 ] [ 1 next-prime ] unit-test
[ 3 ] [ 2 next-prime ] unit-test
[ 5 ] [ 3 next-prime ] unit-test

View File

@ -46,11 +46,24 @@ PRIVATE>
next-odd [ dup prime? ] [ 2 + ] until
] if ; foldable
: primes-between ( low high -- seq )
<PRIVATE
: (primes-between) ( low high -- seq )
[ [ 3 max dup even? [ 1 + ] when ] dip 2 <range> ]
[ <primes-vector> ] 2bi
[ '[ [ prime? ] _ push-if ] each ] keep clone ;
PRIVATE>
: primes-between ( low high -- seq )
[ ceiling >integer ] [ floor >integer ] bi*
{
{ [ 2dup > ] [ 2drop V{ } clone ] }
{ [ dup 2 = ] [ 2drop V{ 2 } clone ] }
{ [ dup 2 < ] [ 2drop V{ } clone ] }
[ (primes-between) ]
} cond ;
: primes-upto ( n -- seq ) 2 swap primes-between ;
: coprime? ( a b -- ? ) gcd nip 1 = ; foldable