diff --git a/basis/math/primes/primes-tests.factor b/basis/math/primes/primes-tests.factor index 3d21a3e7d6..a2e9f4fa48 100644 --- a/basis/math/primes/primes-tests.factor +++ b/basis/math/primes/primes-tests.factor @@ -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 diff --git a/basis/math/primes/primes.factor b/basis/math/primes/primes.factor index 81193af400..7611e22b70 100644 --- a/basis/math/primes/primes.factor +++ b/basis/math/primes/primes.factor @@ -46,11 +46,24 @@ PRIVATE> next-odd [ dup prime? ] [ 2 + ] until ] if ; foldable -: primes-between ( low high -- seq ) + ] [ ] 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