spinix-hive/pfth/primes.fth

63 lines
1.2 KiB
Forth

\ primes.4th
\
\ Example code for kForth
\ Copyright (c) 1998 Creative Consulting for Research and Education
\
\ Test for a prime number. Return the largest divisor (< n )
\ and a flag indicating whether the number is prime or not.
: ?prime ( n -- m flag | is n a prime number? )
\ if flag is false (0), m is the largest divisor of n
abs
dup 3 > \ is n > 3 ?
if
abs
dup 2 /mod
swap 0=
if \ is n divisible by 2 ?
nip false
else
1- \ check for divisibility starting
begin \ with n/2 - 1 and counting down
2dup mod
over 1 >
and
while
1-
repeat
nip
dup 1 <=
then
else
dup 1 > IF drop 1 true ELSE false THEN
then
;
: test_prime ( n -- | test for prime number and display result )
?prime
if
." is a prime number" drop
else
." is NOT prime. Its largest divisor is " .
then
cr
;
: list_primes ( n -- | list all the prime numbers from 2 to n )
abs
dup 0>
if
1+ 2 do
i ?prime
if
i . cr
then
drop
loop
else
drop
then
;