From a45e411521f3f0b2522cc95e96cdae1942d6b90f Mon Sep 17 00:00:00 2001 From: fun-guava Date: Sun, 27 Nov 2022 16:53:19 +0100 Subject: [PATCH 1/3] Added FriendlyNumbers.js, to determine if two integers are friendly numbers --- Maths/FriendlyNumbers.js | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Maths/FriendlyNumbers.js diff --git a/Maths/FriendlyNumbers.js b/Maths/FriendlyNumbers.js new file mode 100644 index 0000000000..2c7115ee72 --- /dev/null +++ b/Maths/FriendlyNumbers.js @@ -0,0 +1,41 @@ +/* + '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 distrinct, non-null integers') + } + + // Calculate the abundancy index of the two number. + // ... first get the sum of their divisors + let sumDivisorsFirstNumber = firstNumber + let sumDivisorsSecondNumber = secondNumber + + for (let i = 0; i < firstNumber / 2; i++) { + if (Number.isInteger(firstNumber / i)) { + sumDivisorsFirstNumber += i + } + } + for (let i = 0; i < secondNumber / 2; i++) { + if (Number.isInteger(secondNumber / i)) { + sumDivisorsSecondNumber += i + } + } + // ... and divide that sum by the number itself + const abundancyIndexFirstNumber = sumDivisorsFirstNumber / firstNumber + const abundancyIndexSecondNumber = sumDivisorsSecondNumber / secondNumber + + if (abundancyIndexFirstNumber === abundancyIndexSecondNumber) { + return true + } else { + return false + } +} From 27cf17619bf3ecc118e1c02e1c1711be64e1311c Mon Sep 17 00:00:00 2001 From: fun-guava Date: Sun, 27 Nov 2022 17:14:06 +0100 Subject: [PATCH 2/3] Fixed a typo in the error message --- Maths/FriendlyNumbers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths/FriendlyNumbers.js b/Maths/FriendlyNumbers.js index 2c7115ee72..7ba69e90b3 100644 --- a/Maths/FriendlyNumbers.js +++ b/Maths/FriendlyNumbers.js @@ -11,7 +11,7 @@ export const FriendlyNumbers = (firstNumber, secondNumber) => { // 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 distrinct, non-null integers') + throw new Error('The two parameters must be distinct, non-null integers') } // Calculate the abundancy index of the two number. From 7ce4bf3e1cb351d33821ebd039142a9271fea6b4 Mon Sep 17 00:00:00 2001 From: fun-guava Date: Sun, 27 Nov 2022 18:13:39 +0100 Subject: [PATCH 3/3] Following the advice of appgurueu, outsourced abundancyIndex ot its own function --- Maths/FriendlyNumbers.js | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/Maths/FriendlyNumbers.js b/Maths/FriendlyNumbers.js index 7ba69e90b3..a9b6b37ec9 100644 --- a/Maths/FriendlyNumbers.js +++ b/Maths/FriendlyNumbers.js @@ -14,28 +14,19 @@ export const FriendlyNumbers = (firstNumber, secondNumber) => { throw new Error('The two parameters must be distinct, non-null integers') } - // Calculate the abundancy index of the two number. - // ... first get the sum of their divisors - let sumDivisorsFirstNumber = firstNumber - let sumDivisorsSecondNumber = secondNumber + return abundancyIndex(firstNumber) === abundancyIndex(secondNumber) +} - for (let i = 0; i < firstNumber / 2; i++) { - if (Number.isInteger(firstNumber / i)) { - sumDivisorsFirstNumber += i - } - } - for (let i = 0; i < secondNumber / 2; i++) { - if (Number.isInteger(secondNumber / i)) { - sumDivisorsSecondNumber += i - } - } - // ... and divide that sum by the number itself - const abundancyIndexFirstNumber = sumDivisorsFirstNumber / firstNumber - const abundancyIndexSecondNumber = sumDivisorsSecondNumber / secondNumber +function abundancyIndex (number) { + return sumDivisors(number) / number +} - if (abundancyIndexFirstNumber === abundancyIndexSecondNumber) { - return true - } else { - return false +function sumDivisors (number) { + let runningSumDivisors = number + for (let i = 0; i < number / 2; i++) { + if (Number.isInteger(number / i)) { + runningSumDivisors += i + } } + return runningSumDivisors }