86 lines
1.5 KiB
JavaScript
86 lines
1.5 KiB
JavaScript
// Function to check if a number is perfect
|
|
function isPerfect(number) {
|
|
if (number <= 1) {
|
|
return false;
|
|
}
|
|
|
|
let sum = 1;
|
|
|
|
for (let i = 2; i <= Math.sqrt(number); i++) {
|
|
if (number % i === 0) {
|
|
sum += i;
|
|
|
|
if (i !== number / i) {
|
|
sum += number / i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return sum === number;
|
|
}
|
|
|
|
// Slow version: checks every number
|
|
function generatePerfectNumbersSlow(countLimit) {
|
|
let count = 0;
|
|
let number = 1;
|
|
|
|
while (count < countLimit) {
|
|
if (isPerfect(number)) {
|
|
console.log(number);
|
|
count++;
|
|
}
|
|
|
|
number++;
|
|
}
|
|
}
|
|
|
|
// Function to check if a number is prime
|
|
function isPrime(number) {
|
|
if (number <= 1) {
|
|
return false;
|
|
}
|
|
|
|
for (let i = 2; i <= Math.sqrt(number); i++) {
|
|
if (number % i === 0) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Fast version: uses Mersenne primes
|
|
function generatePerfectNumbersFast(countLimit) {
|
|
let count = 0;
|
|
let p = 2;
|
|
|
|
while (count < countLimit) {
|
|
const mersenneNumber = Math.pow(2, p) - 1;
|
|
|
|
if (isPrime(mersenneNumber)) {
|
|
const perfectNumber = Math.pow(2, p - 1) * mersenneNumber;
|
|
console.log(perfectNumber);
|
|
count++;
|
|
}
|
|
|
|
p++;
|
|
}
|
|
}
|
|
|
|
// Keep the slow demonstration small enough to finish in a reasonable time.
|
|
const countLimit = 4;
|
|
|
|
console.log("Slow version:");
|
|
console.time("Slow version time");
|
|
generatePerfectNumbersSlow(countLimit);
|
|
console.timeEnd("Slow version time");
|
|
|
|
console.log("--------------------");
|
|
|
|
console.log("Fast version:");
|
|
console.time("Fast version time");
|
|
generatePerfectNumbersFast(countLimit);
|
|
console.timeEnd("Fast version time");
|
|
|
|
console.log("end");
|