- Trending Categories
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
Physics
Chemistry
Biology
Mathematics
English
Economics
Psychology
Social Studies
Fashion Studies
Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Check if the given two numbers are friendly pairs or not
Friendly Numbers − According to number theory, friendly numbers are two or more numbers having the same abundancy index.
Abundancy Index − Abundancy index of a natural number can be defined as the ratio between the sum of all the divisors of the natural number and the natural number itself.
The abundancy of a number n can be expressed as $\mathrm{\frac{\sigma(n)}{n}}$ where $\mathrm{\sigma(n)}$ denotes the divisor function equal to all the divisors of n.
For example, the abundancy index of the natural number 30 is,
$$\mathrm{\frac{\sigma(30)}{30}=\frac{1+2+3+5+6+10+15+30}{30}=\frac{72}{30}=\frac{12}{5}}$$
A number n is said to be a ‘friendly number’ if there exists a number m mn, such that
$\mathrm{\frac{\sigma(m)}{m}=\frac{\sigma(n)}{n}}$
Friendly Pair − Two numbers with the same abundancy index are called a ‘friendly pair’.
Problem Statement
Given two numbers Num1 and Num2. Return if the two numbers are a friendly pair not.
Sample Example 1
Input: Num1 = 30, Num2 = 140
Output: Yes
Explanation
$$\mathrm{\frac{\sigma(30)}{30}=\frac{1+2+3+5+6+10+15+30}{30}=\frac{72}{30}=\frac{12}{5}}$$
$$\mathrm{\frac{\sigma(140)}{140}=\frac{1+2+4+5+7+10+14+20+28+35+70+140}{140}=\frac{336}{140}=\frac{12}{5}}$$
Since,\frac{\sigma(30)}{30}=\frac{\sigma(140)}{140}, thus 30 and 140 are a friendly pair.
Sample Example 2
Input: Num1 = 5, Num2 = 24
Output: No
Explanation
$$\mathrm{\frac{\sigma(5)}{5}=\frac{1+5}{5}=\frac{6}{5}=\frac{6}{5}}$$
$$\mathrm{\frac{\sigma(24)}{24}=\frac{1+2+3+4+6+8+12+24}{24}=\frac{60}{24}=\frac{15}{6}}$$
Since,$\mathrm{\frac{\sigma(5)}{5}\neq\frac{\sigma(24)}{24}}$ , thus 5 and 24 are not a friendly pair.
Approach 1: Brute Force Approach
Brute force solution to the problem can be to first find the sum of all the divisors of both the number and then calculate the value of abundancy index of both of them and compare to get the result.
Pseudocode
procedure sumOfDivisors (n) sum = 0 for i = 1 to n if i is a factor of n sum = sum + i end if ans = sum end procedure procedure friendlyPair (num1, num2) sum1 = sumOfDivisors (num1) sum2 = sumOfDivisors (num2) abIndex1 = sum1 / num1 abIndex2 = sum2 / num2 if (abIndex1 == abIndex2) ans = TRUE else ans = FALSE end if end procedure
Examle: C++ Implementation
In the following program, the sum of all divisors are calculated to find abundancy index.
#include <bits/stdc++.h> using namespace std; // Function to find sum of all the divisors of number n int sumOfDivisors(int n){ int sum = 0; for (int i = 1; i <= n; i++){ if (n % i == 0){ sum += i; } } return sum; } // Function to find if two numbers are friendly pairs or not int friendlyPair(int num1, int num2){ // Finding the sum of all divisors of num1 and num2 int sum1 = sumOfDivisors(num1); int sum2 = sumOfDivisors(num2); // Calculating the abundancy index as the ratio of the sum of divisors by the number int abIn1 = sum1 / num1, abIn2 = sum2 / num2; // Friendly pair if the abundancy index of both the numbers are same if (abIn1 == abIn2){ return true; } return false; } int main(){ int num1 = 30, num2 = 140; cout << num1 << " and " << num2 << " are friendly pair : "; if (friendlyPair(num1, num2)){ cout << "YES"; } else{ cout << "NO"; } return 0; }
Output
30 and 140 are friendly pair : YES
Time Complexity − O(n) as sumOfDivisors() function traverses one loop
Space Complexity − O(1)
Approach 2: Reduced form of Abundancy Index
The reduced form of an abundancy index can be found by dividing the numerator and denominator by GCD. Then check if the two numbers are friendly pairs by checking if the reduced form of the abundancy indeed of the two numbers is equal by checking if their numerator and denominator are equal or not.
Pseudocode
procedure sumOfDivisors (n) ans = 1 for i = 1 to sqrt(n) count = 0 sum = 1 term = 1 while n % i == 0 count = count + 1 n = n / i term = term * i sum = sum + term ans = ans * sum if n >= 2 ans = ans * (n + 1) end if end procedure procedure gcd (n1, n2) if n1 == 0 return n2 end if rem = n2 % n1 return gcd (rem, n2) end procedure procedure friendlyPair (num1, num2) sum1 = sumOfDivisors (num1) sum2 = sumOfDivisors (num2) gcd1 = gcd (num1, sum1) gcd2 = gcd (num2, sum2) if (num1 / gcd1 == num2 / gcd2) && (sum1 / gcd1 == sum2 / gcd2) ans = TRUE else ans = FALSE end if end procedure
Example: C++ Implementation
In the following program, we check if the reduced form of abundancy index of two numbers is same or not by comparing the numerator and denominator.
#include <bits/stdc++.h> using namespace std; // Function to find the sum of all the divisors of number n int sumOfDivisors(int n){ int ans = 1; // By looping till sqrt(n), we traverse all the prime factors of n for (int i = 2; i <= sqrt(n); i++){ int cnt = 0, sum = 1, term = 1; while (n % i == 0){ cnt++; // Reducing the value of n n /= i; term *= i; sum += term; } ans *= sum; } // When n is a prime number greater than 2 if (n >= 2){ ans *= (n + 1); } return ans; } // Function to find the gcd of two numbers int gcd(int num1, int num2){ if (num1 == 0) { return num2; } int rem = num2 % num1; return gcd(rem, num1); } // Function to find if two numbers are friendly pairs or not int friendlyPair(int num1, int num2){ // Finding the sum of all divisors of num1 and num2 int sum1 = sumOfDivisors(num1); int sum2 = sumOfDivisors(num2); // Finding gcd of num and the sum of its divisors int gcd1 = gcd(num1, sum1); int gcd2 = gcd(num2, sum2); // Checking if the numerator and denominator of the reduced abundancy index are the same or not if (((num1 / gcd1) == (num2 / gcd2)) && ((sum1 / gcd1) == (sum2 / gcd2))){ return true; } return false; } int main(){ int num1 = 30, num2 = 140; cout << num1 << " and " << num2 << " are friendly pair : "; if (friendlyPair(num1, num2)){ cout << "YES"; } else{ cout << "NO"; } return 0; }
Output
30 and 140 are friendly pair : YES
Time Complexity − O(n1/2log2n) for the sumOfDivisors() function.
Space Complexity − O(1)
Conclusion
In conclusion, friendly pairs are two natural numbers whose abundancy index is the same, i.e. ratio of the sum of all divisors of the number and the number itself. For finding if two numnbers are friendly pairs or not, follow the above approaches specifying the brute force solution of time complexity O(n) and optimized solution with time complexity O(n1/2log2n).