rg_backend_academy/lecture_3/hello-world-node/perfect-number.js

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");