Skip to content

Instantly share code, notes, and snippets.

@gggauravgandhi
Last active February 24, 2021 10:09
Show Gist options
  • Save gggauravgandhi/c9e89cf96208677f2a8c6b53b4aa8ab3 to your computer and use it in GitHub Desktop.
Save gggauravgandhi/c9e89cf96208677f2a8c6b53b4aa8ab3 to your computer and use it in GitHub Desktop.
Basic Multi Threaded Perfect Number FInder {entryPoint: runner.js, dependencies: ['worker-farm']}
const numberFeeder = ({ start, end }) => {
const perfectNumbers = [];
for (let i = start; i <= end; i += 1) {
if (isPerfectNumber(i)) {
perfectNumbers.push(i);
}
}
return { range: { start, end }, perfectNumbers };
};
const isPerfectNumber = (number) => {
const multipliers = [];
let sum = 0;
for (let i = 1; i < number; i += 1) {
if (number % i === 0) {
multipliers.push(i);
sum += i;
}
}
if (sum === number) {
return true;
}
return false;
};
module.exports = function (inp, callback) {
callback(null, numberFeeder(inp));
};
const workerFarm = require('worker-farm');
const workers = workerFarm(require.resolve('./child'));
const startTime = Date.now();
const perfectnumberFinder = (maxNumber, rangeLimit = 10) => {
const foundPerfectNumbers = [];
let threadEndCounter = 0;
for (let i = 1; i <= maxNumber; i += rangeLimit) {
workers({ start: i, end: i + rangeLimit }, (err, output) => {
threadEndCounter += rangeLimit;
if (err) return console.log(threadEndCounter, err);
const { perfectNumbers } = output;
if (perfectNumbers.length > 0) {
console.log(`Found this perfect numbers: ${perfectNumbers.join(",")}`);
foundPerfectNumbers.push(...perfectNumbers);
}
if (threadEndCounter >= maxNumber) {
console.log(foundPerfectNumbers);
workerFarm.end(workers);
console.log(
`It took: ${Math.round((Date.now() - startTime) / 1000)}secs`
);
}
});
}
};
perfectnumberFinder(10000000, 100);
@gggauravgandhi
Copy link
Author

List of known Perfect numbers on Wikipedia.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment