2021-03-24 13:04:30 +00:00
|
|
|
function abs(a) {
|
|
|
|
return (a >= 0) ? a : -a;
|
|
|
|
}
|
|
|
|
|
|
|
|
function bitLength(a) {
|
2021-03-24 14:11:07 +00:00
|
|
|
if (typeof a === 'number')
|
|
|
|
a = BigInt(a);
|
2021-03-24 13:04:30 +00:00
|
|
|
if (a === 1n) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
let bits = 1;
|
|
|
|
do {
|
|
|
|
bits++;
|
|
|
|
} while ((a >>= 1n) > 1n);
|
|
|
|
return bits;
|
|
|
|
}
|
|
|
|
|
|
|
|
function eGcd(a, b) {
|
2021-03-24 14:11:07 +00:00
|
|
|
if (typeof a === 'number')
|
|
|
|
a = BigInt(a);
|
|
|
|
if (typeof b === 'number')
|
|
|
|
b = BigInt(b);
|
|
|
|
if (a <= 0n || b <= 0n)
|
2023-04-11 08:43:47 +00:00
|
|
|
throw new RangeError('a and b MUST be > 0');
|
2021-03-24 13:04:30 +00:00
|
|
|
let x = 0n;
|
|
|
|
let y = 1n;
|
|
|
|
let u = 1n;
|
|
|
|
let v = 0n;
|
2021-03-24 14:11:07 +00:00
|
|
|
while (a !== 0n) {
|
|
|
|
const q = b / a;
|
|
|
|
const r = b % a;
|
2021-03-24 13:04:30 +00:00
|
|
|
const m = x - (u * q);
|
|
|
|
const n = y - (v * q);
|
2021-03-24 14:11:07 +00:00
|
|
|
b = a;
|
|
|
|
a = r;
|
2021-03-24 13:04:30 +00:00
|
|
|
x = u;
|
|
|
|
y = v;
|
|
|
|
u = m;
|
|
|
|
v = n;
|
|
|
|
}
|
|
|
|
return {
|
2021-03-24 14:11:07 +00:00
|
|
|
g: b,
|
2023-04-11 08:43:47 +00:00
|
|
|
x,
|
|
|
|
y
|
2021-03-24 13:04:30 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function gcd(a, b) {
|
2021-03-24 14:11:07 +00:00
|
|
|
let aAbs = (typeof a === 'number') ? BigInt(abs(a)) : abs(a);
|
|
|
|
let bAbs = (typeof b === 'number') ? BigInt(abs(b)) : abs(b);
|
2021-03-24 13:04:30 +00:00
|
|
|
if (aAbs === 0n) {
|
|
|
|
return bAbs;
|
|
|
|
}
|
|
|
|
else if (bAbs === 0n) {
|
|
|
|
return aAbs;
|
|
|
|
}
|
|
|
|
let shift = 0n;
|
|
|
|
while (((aAbs | bAbs) & 1n) === 0n) {
|
|
|
|
aAbs >>= 1n;
|
|
|
|
bAbs >>= 1n;
|
|
|
|
shift++;
|
|
|
|
}
|
|
|
|
while ((aAbs & 1n) === 0n)
|
|
|
|
aAbs >>= 1n;
|
|
|
|
do {
|
|
|
|
while ((bAbs & 1n) === 0n)
|
|
|
|
bAbs >>= 1n;
|
|
|
|
if (aAbs > bAbs) {
|
|
|
|
const x = aAbs;
|
|
|
|
aAbs = bAbs;
|
|
|
|
bAbs = x;
|
|
|
|
}
|
|
|
|
bAbs -= aAbs;
|
|
|
|
} while (bAbs !== 0n);
|
|
|
|
return aAbs << shift;
|
|
|
|
}
|
|
|
|
|
|
|
|
function lcm(a, b) {
|
2021-03-24 14:11:07 +00:00
|
|
|
if (typeof a === 'number')
|
|
|
|
a = BigInt(a);
|
|
|
|
if (typeof b === 'number')
|
|
|
|
b = BigInt(b);
|
|
|
|
if (a === 0n && b === 0n)
|
2021-03-24 13:04:30 +00:00
|
|
|
return BigInt(0);
|
2022-01-17 10:04:55 +00:00
|
|
|
return abs((a / gcd(a, b)) * b);
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function max(a, b) {
|
|
|
|
return (a >= b) ? a : b;
|
|
|
|
}
|
|
|
|
|
|
|
|
function min(a, b) {
|
|
|
|
return (a >= b) ? b : a;
|
|
|
|
}
|
|
|
|
|
|
|
|
function toZn(a, n) {
|
2021-03-24 14:11:07 +00:00
|
|
|
if (typeof a === 'number')
|
|
|
|
a = BigInt(a);
|
|
|
|
if (typeof n === 'number')
|
|
|
|
n = BigInt(n);
|
|
|
|
if (n <= 0n) {
|
2021-03-24 17:30:45 +00:00
|
|
|
throw new RangeError('n must be > 0');
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
2021-03-24 14:11:07 +00:00
|
|
|
const aZn = a % n;
|
|
|
|
return (aZn < 0n) ? aZn + n : aZn;
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function modInv(a, n) {
|
2021-03-24 17:30:45 +00:00
|
|
|
const egcd = eGcd(toZn(a, n), n);
|
|
|
|
if (egcd.g !== 1n) {
|
2023-04-11 08:43:47 +00:00
|
|
|
throw new RangeError(`${a.toString()} does not have inverse modulo ${n.toString()}`);
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
2021-03-24 17:30:45 +00:00
|
|
|
else {
|
|
|
|
return toZn(egcd.x, n);
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function modPow(b, e, n) {
|
2021-03-24 14:11:07 +00:00
|
|
|
if (typeof b === 'number')
|
|
|
|
b = BigInt(b);
|
|
|
|
if (typeof e === 'number')
|
|
|
|
e = BigInt(e);
|
|
|
|
if (typeof n === 'number')
|
|
|
|
n = BigInt(n);
|
|
|
|
if (n <= 0n) {
|
2021-03-24 17:30:45 +00:00
|
|
|
throw new RangeError('n must be > 0');
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
2021-03-24 14:11:07 +00:00
|
|
|
else if (n === 1n) {
|
2021-03-24 17:30:45 +00:00
|
|
|
return 0n;
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
2021-03-24 14:11:07 +00:00
|
|
|
b = toZn(b, n);
|
2021-03-24 13:04:30 +00:00
|
|
|
if (e < 0n) {
|
2021-03-24 14:11:07 +00:00
|
|
|
return modInv(modPow(b, abs(e), n), n);
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
|
|
|
let r = 1n;
|
|
|
|
while (e > 0) {
|
|
|
|
if ((e % 2n) === 1n) {
|
2021-03-24 14:11:07 +00:00
|
|
|
r = r * b % n;
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
|
|
|
e = e / 2n;
|
2021-03-24 14:11:07 +00:00
|
|
|
b = b ** 2n % n;
|
2021-03-24 13:04:30 +00:00
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
export { abs, bitLength, eGcd, gcd, lcm, max, min, modInv, modPow, toZn };
|
2023-04-11 08:43:47 +00:00
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguYnJvd3Nlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RzL2Ficy50cyIsIi4uLy4uL3NyYy90cy9iaXRMZW5ndGgudHMiLCIuLi8uLi9zcmMvdHMvZWdjZC50cyIsIi4uLy4uL3NyYy90cy9nY2QudHMiLCIuLi8uLi9zcmMvdHMvbGNtLnRzIiwiLi4vLi4vc3JjL3RzL21heC50cyIsIi4uLy4uL3NyYy90cy9taW4udHMiLCIuLi8uLi9zcmMvdHMvdG9abi50cyIsIi4uLy4uL3NyYy90cy9tb2RJbnYudHMiLCIuLi8uLi9zcmMvdHMvbW9kUG93LnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPTSxTQUFVLEdBQUcsQ0FBRSxDQUFrQixFQUFBO0FBQ3JDLElBQUEsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQzFCOztBQ0hNLFNBQVUsU0FBUyxDQUFFLENBQWtCLEVBQUE7SUFDM0MsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQUUsUUFBQSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRXhDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRTtBQUFFLFFBQUEsT0FBTyxDQUFDLENBQUE7QUFBRSxLQUFBO0lBQzFCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQTtJQUNaLEdBQUc7QUFDRCxRQUFBLElBQUksRUFBRSxDQUFBO0FBQ1AsS0FBQSxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUM7QUFDekIsSUFBQSxPQUFPLElBQUksQ0FBQTtBQUNiOztBQ0NnQixTQUFBLElBQUksQ0FBRSxDQUFrQixFQUFFLENBQWtCLEVBQUE7SUFDMUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQUUsUUFBQSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3hDLElBQUksT0FBTyxDQUFDLEtBQUss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
|