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"> |
<syntaxhighlight lang="forth">5000000 constant limit |
||
create sieve limit allot |
|||
⚫ | |||
: |
: prime? ( n -- ? ) sieve + c@ 0= ; |
||
⚫ | |||
here n erase |
|||
0 notprime! |
|||
: prime_sieve |
|||
1 notprime! |
|||
sieve limit erase |
|||
n 4 do i notprime! 2 +loop |
|||
then |
|||
3 |
3 |
||
begin |
begin |
||
dup dup * |
dup dup * limit < |
||
while |
while |
||
dup prime? if |
dup prime? if |
||
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_odd_prime ( u -- u ) |
||
begin |
begin |
||
2 + dup prime? |
|||
until ; |
until ; |
||
: next_honaker_prime ( u u -- u u ) |
: next_honaker_prime ( u u -- u u ) |
||
begin |
begin |
||
swap |
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 |
||
prime_sieve |
|||
." First 50 Honaker primes (index, prime):" cr |
." First 50 Honaker primes (index, prime):" cr |
||
3 2 0 \ prime prime-index honaker-index |
|||
begin |
begin |
||
dup 50 < |
dup 50 < |