diff --git a/basis/math/primes/primes.factor b/basis/math/primes/primes.factor index ea8c60508d..5dc6a51334 100644 --- a/basis/math/primes/primes.factor +++ b/basis/math/primes/primes.factor @@ -1,8 +1,9 @@ ! Copyright (C) 2007-2009 Samuel Tardieu. ! See http://factorcode.org/license.txt for BSD license. -USING: combinators kernel math math.bitwise math.functions +USING: combinators fry kernel math math.bitwise math.functions math.order math.primes.erato math.primes.erato.private -math.primes.miller-rabin math.ranges literals random sequences sets ; +math.primes.miller-rabin math.ranges literals random sequences sets +vectors ; IN: math.primes 598. Under this limit, we know that there are at most 108 primes. +: upper-pi ( x -- y ) + dup log [ / ] [ 1.2762 swap / 1 + ] bi * ceiling ; + +: lower-pi ( x -- y ) + dup log [ / ] [ 0.992 swap / 1 + ] bi * floor ; + +: ( low high -- vector ) + swap [ [ upper-pi ] [ lower-pi ] bi* - >integer + 108 max 10000 min ] keep + 3 < [ [ 2 swap push ] keep ] when ; + PRIVATE> : prime? ( n -- ? ) @@ -29,9 +45,9 @@ PRIVATE> ] if ; foldable : primes-between ( low high -- seq ) - [ dup 3 max dup even? [ 1 + ] when ] dip - 2 [ prime? ] filter - swap 3 < [ 2 prefix ] when ; + [ [ 3 max dup even? [ 1 + ] when ] dip 2 ] + [ ] 2bi + [ '[ [ prime? ] _ push-if ] each ] keep clone ; : primes-upto ( n -- seq ) 2 swap primes-between ;