From 18a91573c3f0bcf891463009dd550a5dd8acf7a7 Mon Sep 17 00:00:00 2001 From: fun-guava <118941851+fun-guava@users.noreply.github.com> Date: Wed, 30 Nov 2022 12:21:08 +0100 Subject: [PATCH] Added a new Maths algorithm to determine if two non-null integers are "friendly numbers" (#1267) --- Maths/FriendlyNumbers.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Maths/FriendlyNumbers.js diff --git a/Maths/FriendlyNumbers.js b/Maths/FriendlyNumbers.js new file mode 100644 index 000000000..a9b6b37ec --- /dev/null +++ b/Maths/FriendlyNumbers.js @@ -0,0 +1,32 @@ +/* + 'In number theory, friendly numbers are two or more natural numbers with a common abundancy index, the + ratio between the sum of divisors of a number and the number itself.' + Source: https://en.wikipedia.org/wiki/Friendly_number + See also: https://mathworld.wolfram.com/FriendlyNumber.html#:~:text=The%20numbers%20known%20to%20be,numbers%20have%20a%20positive%20density. +*/ + +export const FriendlyNumbers = (firstNumber, secondNumber) => { + // input: two integers + // output: true if the two integers are friendly numbers, false if they are not friendly numbers + + // First, check that the parameters are valid + if (!Number.isInteger(firstNumber) || !Number.isInteger(secondNumber) || firstNumber === 0 || secondNumber === 0 || firstNumber === secondNumber) { + throw new Error('The two parameters must be distinct, non-null integers') + } + + return abundancyIndex(firstNumber) === abundancyIndex(secondNumber) +} + +function abundancyIndex (number) { + return sumDivisors(number) / number +} + +function sumDivisors (number) { + let runningSumDivisors = number + for (let i = 0; i < number / 2; i++) { + if (Number.isInteger(number / i)) { + runningSumDivisors += i + } + } + return runningSumDivisors +}