vincentlowe icon

DataWeave isPrime() function

vincentlowe | PRO | 02/11/22 05:41:46 PM UTC (Edited) | 0 ⭐ | 220 👁️ | Never ⏰ | []
text |

1.1 KB

|

None

|

0 👍

/

0 👎

/*
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