/*
very cleverly written implementation
uses tail call recursion nicely
thanks - Craig from 211206 pvt class
*/
fun isPrime(n:Number,divisor=2): Boolean =
if (divisor*divisor > n) true
else
if ((n mod divisor) == 0) false
else isPrime(n,divisor+1)
/* example given by Will Fisher (DWE course -- 220209)
uses a quick check for divisibility by 2 and 3 before giving test over to
a tail recursive routine to check (he reports an improvement to about 8 seconds
from 90 seconds when testing all factors while testing 1M integers)
*/
fun isPrimeOddsOnly(n:Number) = do {
var nmod2 = n mod 2
var nmod3 = n mod 3
var sqrtn = sqrt(n)
fun recurPrimeCheck(n:Number, divisor1:Number = 5, divisor2:Number = 7) =
if (divisor1 > sqrtn) true
else if ((n mod divisor1) == 0) false
else if ((n mod divisor2) == 0) false
else recurPrimeCheck(n, divisor1+6, divisor2+6)
---
n match {
case n if n < 2 -> false
case 2 -> true
case 3 -> true
case n if nmod2 == 0 -> false
case n if nmod3 == 0 -> false
case n if n < 25 -> true
else -> recurPrimeCheck(n)
}
}
Comments