Honaker primes: Difference between revisions

Content added Content deleted
(Added Forth solution)
m (Forth performance improvement)
 
Line 754: Line 754:
=={{header|Forth}}==
=={{header|Forth}}==
{{works with|Gforth}}
{{works with|Gforth}}
<syntaxhighlight lang="forth">: prime? ( n -- ? ) here + c@ 0= ;
<syntaxhighlight lang="forth">5000000 constant limit
create sieve limit allot
: notprime! ( n -- ) here + 1 swap c! ;


: prime_sieve { n -- }
: prime? ( n -- ? ) sieve + c@ 0= ;
: notprime! ( n -- ) sieve + 1 swap c! ;
here n erase

0 notprime!
: prime_sieve
1 notprime!
n 4 > if
sieve limit erase
n 4 do i notprime! 2 +loop
then
3
3
begin
begin
dup dup * n <
dup dup * limit <
while
while
dup prime? if
dup prime? if
n over dup * do
limit over dup * do
i notprime!
i notprime!
dup 2* +loop
dup 2* +loop
Line 781: Line 779:
10 /mod recurse + ;
10 /mod recurse + ;


: next_prime ( u -- u )
: next_odd_prime ( u -- u )
begin
begin
1+ dup prime?
2 + dup prime?
until ;
until ;


: next_honaker_prime ( u u -- u u )
: next_honaker_prime ( u u -- u u )
begin
begin
swap next_prime swap 1+
swap next_odd_prime swap 1+
2dup digit_sum swap digit_sum =
2dup digit_sum swap digit_sum =
until ;
until ;
Line 796: Line 794:


: main
: main
5000000 prime_sieve
prime_sieve
." First 50 Honaker primes (index, prime):" cr
." First 50 Honaker primes (index, prime):" cr
0 0 0 \ prime prime-index honaker-index
3 2 0 \ prime prime-index honaker-index
begin
begin
dup 50 <
dup 50 <