RosettaCodeData/Task/Giuga-numbers/JavaScript/giuga-numbers.js
2026-04-30 12:34:36 -04:00

37 lines
1.5 KiB
JavaScript

const bigInt = require('big-integer');
class GiugaNumbers {
static main() {
// Initialize static lists here to ensure they exist before use
GiugaNumbers.primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59];
GiugaNumbers.results = [];
const primeCounts = [3, 4, 5];
for (const primeCount of primeCounts) {
GiugaNumbers.primeFactors = new Array(primeCount).fill(0);
GiugaNumbers.combinations(primeCount, 0, 0);
}
GiugaNumbers.results.sort((a, b) => a.minus(b).toJSNumber());
console.log("Found Giuga numbers: " + GiugaNumbers.results.map(n => n.toString()).join(", "));
}
static checkIfGiugaNumber(aPrimeFactors) {
const product = aPrimeFactors.reduce((acc, val) => acc.multiply(val), bigInt(1));
for (const factor of aPrimeFactors) {
const divisor = factor.multiply(factor);
const numerator = product.minus(factor);
if (numerator.mod(divisor).notEquals(0)) {
return;
}
}
GiugaNumbers.results.push(product);
}
static combinations(aPrimeCount, aIndex, aLevel) {
if (aLevel === aPrimeCount) {
GiugaNumbers.checkIfGiugaNumber(GiugaNumbers.primeFactors);
return;
}
for (let i = aIndex; i < GiugaNumbers.primes.length; i++) {
GiugaNumbers.primeFactors[aLevel] = bigInt(GiugaNumbers.primes[i]);
GiugaNumbers.combinations(aPrimeCount, i + 1, aLevel + 1);
}
}
}
GiugaNumbers.main();