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