26 lines
935 B
Plaintext
26 lines
935 B
Plaintext
main :: [sys_message]
|
|
main = [Stdout (lay (map showline [1..25])),
|
|
Stdout (lay (map countprimes (25:map (10^) [2..5])))]
|
|
|
|
countprimes :: num->[char]
|
|
countprimes n = "There are " ++ show amount ++ " primes up to " ++ show n
|
|
where amount = #filter prime [2..n]
|
|
|
|
showline :: num->[char]
|
|
showline n = "phi(" ++ show n ++ ") = " ++ show (totient n) ++ ", " ++ kind
|
|
where kind = "prime", if prime n
|
|
= "composite", otherwise
|
|
|
|
prime :: num->bool
|
|
prime n = totient n = n - 1
|
|
|
|
totient :: num->num
|
|
totient n = loop n n (2:[3, 5..])
|
|
where loop tot n (d:ds)
|
|
= tot, if n<=1
|
|
= tot - tot div n, if d*d > n
|
|
= loop tot n ds, if n mod d ~= 0
|
|
= loop (tot - tot div d) (remfac n d) ds, otherwise
|
|
remfac n d = n, if n mod d ~= 0
|
|
= remfac (n div d) d, otherwise
|