packages feed

timberc-1.0.1: examples/Primes.t

module Primes where

import POSIX 

root env = class
   limit :: Int
   limit = fromRight (parse (env.argv!1))
   primesBound = limit `div` log3 limit

   primes := uniarray primesBound 0
   count  := 0

   isPrime k = loop 0
      where loop n = do 
              p = primes!n
              if p*p > k then
                 result True
              elsif k `mod` p  == 0 then
                 result False
              else loop (n+1)

   checkFrom k = do
     p <- isPrime k
     if p then 
        primes!count := k
        count := count + 1
     if k < limit then checkFrom (k+1)

   result action
     primes!0 := 2
     count := 1
     checkFrom 3
     env.stdout.write (show count++"\n")
     env.exit 0


log3 :: Int -> Int
log3 n  
  | n < 3       = 0
  | otherwise   = 1 + log3 (n `div` 3)