Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 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)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment