UNPKG

@japan-d2/rho

Version:

JavaScript implementation that compute prime factors using Pollard's rho algorithm

75 lines (74 loc) 1.98 kB
"use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); var bigint_1 = require("@japan-d2/gcd/lib/bigint"); function isPrime(n) { if (n === BigInt(1)) { return false; } if (n === BigInt(2) || n === BigInt(3)) { return true; } if ((n % BigInt(2) === BigInt(0)) || (n % BigInt(3) === BigInt(0))) { return false; } var p = BigInt(5); var w = BigInt(2); while (p * p <= n) { if (n % p === BigInt(0)) { return false; } p += w; w = BigInt(6) - w; } return true; } function f(x) { return x * x - BigInt(1); } function g(x) { return x * x + BigInt(1); } function rho(input, operator) { if (input % BigInt(2) === BigInt(0)) { return BigInt(2); } var n1 = BigInt(2); var n2 = BigInt(2); var divisor = BigInt(0); do { n1 = operator(n1) % input; n2 = operator(operator(n2)) % input; var nd = n1 > n2 ? n1 - n2 : n2 - n1; divisor = bigint_1.default(nd, input); } while (divisor === BigInt(1)); if (divisor === input) { return rho(input, g); } return divisor; } function getFactorNumbers(n) { if (n === BigInt(1)) { return [BigInt(1)]; } if (isPrime(n)) { return [n]; } else { var divisor = rho(n, f); return __spreadArrays(getFactorNumbers(divisor), getFactorNumbers(n / divisor)).sort(function (a, b) { if (a === b) return 0; if (a > b) return 1; return -1; }); } } exports.default = getFactorNumbers;