@japan-d2/rho
Version:
JavaScript implementation that compute prime factors using Pollard's rho algorithm
75 lines (74 loc) • 1.98 kB
JavaScript
;
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;