diff --git a/extra/math/primes/authors.txt b/extra/math/primes/authors.txt new file mode 100644 index 0000000000..f3b0233f74 --- /dev/null +++ b/extra/math/primes/authors.txt @@ -0,0 +1 @@ +Samuel Tardieu diff --git a/extra/math/primes/primes-docs.factor b/extra/math/primes/primes-docs.factor new file mode 100644 index 0000000000..1077659d5e --- /dev/null +++ b/extra/math/primes/primes-docs.factor @@ -0,0 +1,30 @@ +USING: help.markup help.syntax ; +IN: math.primes + +{ next-prime prime? } related-words + +HELP: next-prime +{ $values { "n" "a positive integer" } { "p" "a prime number" } } +{ $description "Return the next prime number greater than " { $snippet "n" } "." } ; + +HELP: prime? +{ $values { "n" "an integer" } { "?" "a boolean" } } +{ $description "Test if an integer is a prime number." } ; + +{ lprimes lprimes-from primes-upto primes-between } related-words + +HELP: lprimes +{ $values { "list" "a lazy list" } } +{ $description "Return a sorted list containing all the prime numbers." } ; + +HELP: lprimes-from +{ $values { "n" "an integer" } { "list" "a lazy list" } } +{ $description "Return a sorted list containing all the prime numbers greater or equal to " { $snippet "n" } "." } ; + +HELP: primes-upto +{ $values { "n" "an integer" } { "seq" "a sequence" } } +{ $description "Return a sequence containing all the prime numbers smaller or equal to " { $snippet "n" } "." } ; + +HELP: primes-between +{ $values { "low" "an integer" } { "high" "an integer" } { "seq" "a sequence" } } +{ $description "Return a sequence containing all the prime numbers between " { $snippet "low" } " and " { $snippet "high" } "." } ; diff --git a/extra/math/primes/primes-tests.factor b/extra/math/primes/primes-tests.factor new file mode 100644 index 0000000000..b1bcf79a49 --- /dev/null +++ b/extra/math/primes/primes-tests.factor @@ -0,0 +1,10 @@ +USING: arrays math.primes tools.test lazy-lists ; + +{ 1237 } [ 1234 next-prime ] unit-test +{ f t } [ 1234 prime? 1237 prime? ] unit-test +{ { 2 3 5 7 11 13 17 19 23 29 } } [ 10 lprimes ltake list>array ] unit-test +{ { 101 103 107 109 113 } } [ 5 100 lprimes-from ltake list>array ] unit-test +{ { 1000117 1000121 } } [ 2 1000100 lprimes-from ltake list>array ] unit-test +{ { 999983 1000003 } } [ 2 999982 lprimes-from ltake list>array ] unit-test +{ { 2 3 5 7 } } [ 10 primes-upto >array ] unit-test +{ { 999983 1000003 } } [ 999982 1000010 primes-between >array ] unit-test diff --git a/extra/math/primes/primes.factor b/extra/math/primes/primes.factor new file mode 100644 index 0000000000..68ab5b3221 --- /dev/null +++ b/extra/math/primes/primes.factor @@ -0,0 +1,49 @@ +! Copyright (C) 2007 Samuel Tardieu. +! See http://factorcode.org/license.txt for BSD license. +USING: combinators kernel lazy-lists math math.functions math.miller-rabin + math.primes.list math.ranges sequences sorting ; +IN: math.primes + + + +: next-prime ( n -- p ) + dup 999983 < [ + primes-under-million [ [ <=> ] binsearch 1+ ] keep nth + ] [ + next-odd find-prime-miller-rabin + ] if ; foldable + +: prime? ( n -- ? ) + dup 1000000 < [ + dup primes-under-million [ <=> ] binsearch* = + ] [ + miller-rabin + ] if ; foldable + +: lprimes ( -- list ) + 0 primes-under-million seq>list + 1000003 [ 2 + find-prime-miller-rabin ] lfrom-by + lappend ; + +: lprimes-from ( n -- list ) + dup 3 < [ drop lprimes ] [ 1- next-prime [ next-prime ] lfrom-by ] if ; + +: primes-upto ( n -- seq ) + { + { [ dup 2 < ] [ drop { } ] } + { [ dup 1000003 < ] + [ primes-under-million [ [ <=> ] binsearch 1+ 0 swap ] keep ] } + { [ t ] + [ primes-under-million 1000003 lprimes-from + rot [ <= ] curry lwhile list>array append ] } + } cond ; foldable + +: primes-between ( low high -- seq ) + primes-upto + >r 1- next-prime r> + [ [ <=> ] binsearch ] keep [ length ] keep ; foldable diff --git a/extra/math/primes/summary.txt b/extra/math/primes/summary.txt new file mode 100644 index 0000000000..41b4197178 --- /dev/null +++ b/extra/math/primes/summary.txt @@ -0,0 +1,2 @@ +Prime numbers test and generation +