Circular primes: Difference between revisions

Content added Content deleted
(refactored the code to reduce stack juggling in circular?)
Line 690: Line 690:


: prime? ( n -- f )
: prime? ( n -- f )
dup 2 <
dup 2 < if drop false exit then
if drop false
dup 2 mod 0= if 2 = exit then
dup 3 mod 0= if 3 = exit then
else
dup 1 and 0=
dup 5 mod 0= if 5 = exit then
wheel-prime? ;
if 2 =
else dup 3 mod 0=
if 3 =
else dup 5 mod 0=
if 5 =
else wheel-prime?
then
then
then
then ;


: log10^ ( n -- 10^[log n], log n )
: log10^ ( n -- 10^[log n], log n )
Line 709: Line 700:
1 0 rot
1 0 rot
begin dup 9 > while
begin dup 9 > while
swap 1+ swap rot 10 * -rot 10 /
>r swap 10 * swap 1+ r> 10 /
repeat drop ;
repeat drop ;


Line 716: Line 707:
: rotate ( n -- n )
: rotate ( n -- n )
dup log10^ drop /mod swap 10 * + ;
dup log10^ drop /mod swap 10 * + ;

: prime-rotation? ( p0 p -- f )
tuck <= swap prime? and ;


: circular? ( n -- f ) \ assume n is not a multiple of 2, 3, 5
: circular? ( n -- f ) \ assume n is not a multiple of 2, 3, 5
dup wheel-prime? invert
dup wheel-prime? invert
if drop false exit
if drop false exit
then dup >r \ save original value for comparison
then dup >r true
dup log10 swap begin over 0> while
over log10 0 ?do
rotate dup r@ < over prime? invert or if
swap rotate j over prime-rotation? rot and
2drop rdrop false exit
loop nip rdrop ;
then swap 1- swap
repeat 2drop rdrop true ;


: .primes
: .primes
Line 744: Line 736:
2 3 5 7 11 13 17 37 79 113 197 199 337 1193 3779 11939 19937 193939 199933
2 3 5 7 11 13 17 37 79 113 197 199 337 1193 3779 11939 19937 193939 199933
</pre>
</pre>

=={{header|FreeBASIC}}==
=={{header|FreeBASIC}}==
<lang freebasic>#define floor(x) ((x*2.0-0.5)Shr 1)
<lang freebasic>#define floor(x) ((x*2.0-0.5)Shr 1)