vincentlowe

DataWeave isPrime() function

Dec 16th, 2021 (edited)
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. /*
  2. very cleverly written implementation
  3. uses tail call recursion nicely
  4.  
  5. thanks - Craig from 211206 pvt class
  6. */
  7.  
  8. fun isPrime(n:Number,divisor=2): Boolean =
  9. if (divisor*divisor > n) true
  10. else
  11. if ((n mod divisor) == 0) false
  12. else isPrime(n,divisor+1)
  13.  
  14. /* example given by Will Fisher (DWE course -- 220209)
  15.  
  16. uses a quick check for divisibility by 2 and 3 before giving test over to
  17. a tail recursive routine to check (he reports an improvement to about 8 seconds
  18. from 90 seconds when testing all factors while testing 1M integers)
  19. */
  20. fun isPrimeOddsOnly(n:Number) = do {
  21. var nmod2 = n mod 2
  22. var nmod3 = n mod 3
  23. var sqrtn = sqrt(n)
  24.  
  25. fun recurPrimeCheck(n:Number, divisor1:Number = 5, divisor2:Number = 7) =
  26. if (divisor1 > sqrtn) true
  27. else if ((n mod divisor1) == 0) false
  28. else if ((n mod divisor2) == 0) false
  29. else recurPrimeCheck(n, divisor1+6, divisor2+6)
  30. ---
  31. n match {
  32. case n if n < 2 -> false
  33. case 2 -> true
  34. case 3 -> true
  35. case n if nmod2 == 0 -> false
  36. case n if nmod3 == 0 -> false
  37. case n if n < 25 -> true
  38. else -> recurPrimeCheck(n)
  39. }
  40. }
  41.  
  42.  
  43.  
  44.  
  45.  
Advertisement
Add Comment
Please, Sign In to add comment