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).

Updated on: 25-Jul-2023

306 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements