Find all Ramanujan Numbers that can be formed by numbers upto L - GeeksforGeeks

11 Jun, 2021
Given a positive integer L, the task is to find all the Ramanujan Numbers that can be generated by any set of quadruples (a, b, c, d), where 0 < a, b, c, d ≤ L.
Ramanujan Numbers are the numbers that can be expressed as sum of two cubes in two different ways. Therefore, Ramanujan Number (N) = a3 + b3 = c3 + d3.  
Examples:
Input: L = 20Output: 1729, 4104Explanation:The number 1729 can be expressed as 123 + 13 and 103 + 93.The number 4104 can be expressed as 163 + 23 and 153 + 93.
Input: L = 30Output: 1729, 4104, 13832, 20683
Naive Approach: The simplest approach is to check for all combination of quadruples (a, b, c, d) from the range [1, L] consisting of distinct elements that satisfy the equation a3 + b3 = c3 + d3. For elements found to be satisfying the conditions, store the Ramanujan Numbers as 3 + b3. Finally, after checking for all possible combinations, print all the stored numbers.
Below is the implementation of the above approach:
C++
Java
Python3
Javascript
// CPP program for the above approach#include<bits/stdc++.h>using namespace std; // Function to find Ramanujan numbers// made up of cubes of numbers up to Lmap<int,vector<int>> ramanujan_On4(int limit){    map<int,vector<int>> dictionary;     // Generate all quadruples a, b, c, d    // of integers from the range [1, L]    for(int a = 0; a < limit; a++)    {        for(int b = 0; b < limit; b++)        {            for(int c = 0; c < limit; c++)            {               for(int d = 0; d < limit; d++)               {                     // Condition // 2:                    // a, b, c, d are not equal                    if ((a != b) and (a != c) and (a != d)                        and (b != c) and (b != d)                            and (c != d)){                         int x = pow(a, 3) + pow(b, 3);                        int y = pow(c, 3) + pow(d, 3);                        if ((x) == (y))                        {                            int number = pow(a, 3) + pow(b, 3);                            dictionary[number] = {a, b, c, d};                        }                    }            }        }    }}     // Return all the possible number    return dictionary;} // Driver Codeint main(){    // Given range Lint L = 30;map<int, vector<int>> ra1_dict = ramanujan_On4(L); // Print all the generated numbersfor(auto x:ra1_dict){    cout << x.first << ": (";      // sort(x.second.begin(),x.second.end());    for(int i = x.second.size() - 1; i >= 0; i--)    {        if(i == 0)          cout << x.second[i] << ")";        else         cout << x.second[i] << ", ";       }    cout << endl;}} // This code is contributed by SURENDRA_GANGWAR.
// Java program for the above approachimport java.util.*;import java.lang.*; class GFG{     static Map<Integer, List<Integer>> ra1_dict;  // Function to find Ramanujan numbers// made up of cubes of numbers up to Lstatic void ramanujan_On4(int limit){         // Generate all quadruples a, b, c, d    // of integers from the range [1, L]    for(int a = 0; a < limit; a++)    {        for(int b = 0; b < limit; b++)        {            for(int c = 0; c < limit; c++)            {               for(int d = 0; d < limit; d++)               {                     // Condition // 2:                    // a, b, c, d are not equal                    if ((a != b) && (a != c) && (a != d) &&                        (b != c) && (b != d) && (c != d))                    {                        int x = (int)Math.pow(a, 3) +                                (int) Math.pow(b, 3);                        int y = (int)Math.pow(c, 3) +                                (int) Math.pow(d, 3);                        if ((x) == (y))                        {                            int number = (int)Math.pow(a, 3) +                                         (int) Math.pow(b, 3);                            ra1_dict.put(number, new ArrayList<>(                                Arrays.asList(a, b, c, d)));                        }                    }                }            }        }    }} // Driver codepublic static void main(String[] args){         // Given range L    int L = 30;         ra1_dict = new HashMap<>();         ramanujan_On4(L);         // Print all the generated numbers    for(Map.Entry<Integer,             List<Integer>> x: ra1_dict.entrySet())    {        System.out.print(x.getKey() + ": (");                 // sort(x.second.begin(),x.second.end());        for(int i = x.getValue().size() - 1; i >= 0; i--)        {            if (i == 0)                System.out.print(x.getValue().get(i) + ")");            else                System.out.print(x.getValue().get(i) + ", ");           }        System.out.println();    }}} // This code is contributed by offbeat
# Python program for the above approachimport time # Function to find Ramanujan numbers# made up of cubes of numbers up to Ldef ramanujan_On4(limit):    dictionary = dict()     # Generate all quadruples a, b, c, d    # of integers from the range [1, L]    for a in range(0, limit):        for b in range(0, limit):            for c in range(0, limit):                for d in range(0, limit):                     # Condition # 2:                    # a, b, c, d are not equal                    if ((a != b) and (a != c) and (a != d)                        and (b != c) and (b != d)                            and (c != d)):                         x = a ** 3 + b ** 3                        y = c ** 3 + d ** 3                        if (x) == (y):                            number = a ** 3 + b ** 3                            dictionary[number] = a, b, c, d     # Return all the possible number    return dictionary  # Driver Code # Given range LL = 30ra1_dict = ramanujan_On4(L) # Print all the generated numbersfor i in sorted(ra1_dict):    print(f'{i}: {ra1_dict[i]}', end ='\n')
<script>       // JavaScript program for the above approach              // Function to find Ramanujan numbers      // made up of cubes of numbers up to L      function ramanujan_On4(limit) {        var dictionary = {};         // Generate all quadruples a, b, c, d        // of integers from the range [1, L]        for (var a = 0; a < limit; a++) {          for (var b = 0; b < limit; b++) {            for (var c = 0; c < limit; c++) {              for (var d = 0; d < limit; d++) {                // Condition // 2:                // a, b, c, d are not equal                if (                  a !== b &&                  a !== c &&                  a !== d &&                  b !== c &&                  b !== d &&                  c !== d                ) {                  var x = Math.pow(a, 3) + Math.pow(b, 3);                  var y = Math.pow(c, 3) + Math.pow(d, 3);                  if (x == y) {                   var number =                   Math.pow(a, 3) + Math.pow(b, 3);                                       dictionary[number] =                   [" " + a, " " + b, " " + c, d];                  }                }              }            }          }        }        return dictionary;      }       // Driver code      // Given range L      var L = 30;       var ra1_dict = ramanujan_On4(L);       var temp = Object.keys(ra1_dict)        .sort()        .reduce((r, k) => ((r[k] = ra1_dict[k]), r), {});      // Print all the generated numbers      for (const [key, value] of Object.entries(temp)) {        document.write(key + ": (" + value.reverse() + ")" +        "<br>");      }       </script>
1729: (9, 10, 1, 12)
4104: (9, 15, 2, 16)
13832: (18, 20, 2, 24)
20683: (19, 24, 10, 27)
 
Time Complexity: O(L4)Auxiliary Space: O(1)
Efficient Approach: The above approach can also be optimized by using Hashing. Follow the steps below to solve the problem:
Initialize an array, say ans[], to stores all the possible Ramanujan Numbers that satisfy the given conditions.
Precompute and store the cubes of all numbers from the range [1, L] in an auxiliary array arr[].
Initialize a HashMap, say M, that stores the sum of all possible combinations of a pair of cubes generated from the array arr[].
Now, generate all possible pairs(i, j) of the array arr[] and if the sum of pairs doesn’t exist in the array, then mark the occurrence of the current sum of pairs in the Map. Otherwise, add the current sum to the array ans[] as it is one of the Ramanujan Numbers.
After completing the above steps, print the numbers stored in the array ans[].
Below is the implementation of the above approach:
Python3
# Python program for the above approachfrom array import *import time # Function to find Ramanujan numbers# made up of cubes of numbers up to Ldef ramanujan_On2(limit):    cubes = array('i', [])     # Stores the sum of pairs of cubes    dict_sum_pairs = dict()     # Stores the Ramanujan Numbers    dict_ramnujan_nums = dict()    sum_pairs = 0     # Stores the cubes from 1 to L    for i in range(0, limit):        cubes.append(i ** 3)          # Generate all pairs (a, b)    # from the range [0, L]    for a in range(0, limit):        for b in range(a + 1, limit):            a3, b3 = cubes[a], cubes[b]             # Find the sum of pairs            sum_pairs = a3 + b3             # Append to dictionary            if sum_pairs in dict_sum_pairs:                 # If the current sum is in                # the dictionary, then store                # the current number                c, d = dict_sum_pairs.get(sum_pairs)                dict_ramnujan_nums[sum_pairs] = a, b, c, d             # Otherwise append the current            # sum pairs to the sum pairs            # dictionary            else:                dict_sum_pairs[sum_pairs] = a, b         # Return the possible Ramanujan    # Numbers    return dict_ramnujan_nums  # Driver Code # Given range LL = 30r_dict = ramanujan_On2(L) # Print all the numbersfor d in sorted(r_dict):    print(f'{d}: {r_dict[d]}', end ='\n')
1729: (9, 10, 1, 12)
4104: (9, 15, 2, 16)
13832: (18, 20, 2, 24)
20683: (19, 24, 10, 27)
 
Time Complexity: O(L2)Auxiliary Space: O(L2)
SURENDRA_GANGWAR
offbeat
rdtank
maths-perfect-cube
Numbers
Mathematical
Mathematical
Numbers
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Algorithm to solve Rubik's Cube
Program to print prime numbers from 1 to N.
Program to multiply two matrices
Fizz Buzz Implementation
Complexity Analysis of Binary Search
Check if a number is Palindrome
Modular multiplicative inverse
Find Union and Intersection of two unsorted arrays
Count ways to reach the n'th stair
Find first and last digits of a number