diff --git a/Maths/MillerRabin.js b/Maths/MillerRabin.js new file mode 100644 index 0000000000..638ec2d300 --- /dev/null +++ b/Maths/MillerRabin.js @@ -0,0 +1,70 @@ +/** + * @function millerRabin + * @description Check if number is prime or not (accurate for 64-bit integers) + * @param {Integer} n + * @returns {Boolean} true if prime, false otherwise + * @url https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test + * note: Here we are using BigInt to handle large numbers + **/ + +// Modular Binary Exponentiation (Iterative) +const binaryExponentiation = (base, exp, mod) => { + base = BigInt(base) + exp = BigInt(exp) + mod = BigInt(mod) + + let result = BigInt(1) + base %= mod + while (exp) { + if (exp & 1n) { + result = (result * base) % mod + } + base = (base * base) % mod + exp = exp >> 1n + } + return result +} + +// Check if number is composite +const checkComposite = (n, a, d, s) => { + let x = binaryExponentiation(a, d, n) + if (x == 1n || x == n - 1n) { + return false + } + + for (let r = 1; r < s; r++) { + x = (x * x) % n + if (x == n - 1n) { + return false + } + } + return true +} + +// Miller Rabin Primality Test +export const millerRabin = (n) => { + n = BigInt(n) + + if (n < 2) { + return false + } + + let s = 0n + let d = n - 1n + while ((d & 1n) == 0) { + d = d >> 1n + s++ + } + + // Only first 12 primes are needed to be check to find primality of any 64-bit integer + let prime = [2n, 3n, 5n, 7n, 11n, 13n, 17n, 19n, 23n, 29n, 31n, 37n] + for (let a of prime) { + if (n == a) { + return true + } + if (checkComposite(n, a, d, s)) { + return false + } + } + return true +}
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: