Find all Ramanujan Numbers that can be formed by numbers upto L
Last Updated :
15 Feb, 2023
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 = 20
Output: 1729, 4104
Explanation:
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 = 30
Output: 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 a3 + b3. Finally, after checking for all possible combinations, print all the stored numbers.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
map< int ,vector< int >> ramanujan_On4( int limit)
{
map< int ,vector< int >> dictionary;
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++)
{
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 dictionary;
}
int main()
{
int L = 30;
map< int , vector< int >> ra1_dict = ramanujan_On4(L);
for ( auto x:ra1_dict)
{
cout << x.first << ": (" ;
for ( int i = x.second.size() - 1; i >= 0; i--)
{
if (i == 0)
cout << x.second[i] << ")" ;
else
cout << x.second[i] << ", " ;
}
cout << endl;
}
}
|
Java
import java.util.*;
import java.lang.*;
class GFG{
static Map<Integer, List<Integer>> ra1_dict;
static void ramanujan_On4( int limit)
{
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++)
{
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)));
}
}
}
}
}
}
}
public static void main(String[] args)
{
int L = 30 ;
ra1_dict = new HashMap<>();
ramanujan_On4(L);
for (Map.Entry<Integer,
List<Integer>> x: ra1_dict.entrySet())
{
System.out.print(x.getKey() + ": (" );
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();
}
}
}
|
Python3
import time
def ramanujan_On4(limit):
dictionary = dict ()
for a in range ( 0 , limit):
for b in range ( 0 , limit):
for c in range ( 0 , limit):
for d in range ( 0 , limit):
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 dictionary
L = 30
ra1_dict = ramanujan_On4(L)
for i in sorted (ra1_dict):
print (f '{i}: {ra1_dict[i]}' , end = '\n' )
|
C#
using System;
using System.Collections.Generic;
class GFG {
static Dictionary< int , List< int >> ra1_dict;
static void Ramanujan_On4( int limit) {
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++) {
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[number] = new List< int >{a, b, c, d};
}
}
}
}
}
}
}
static void Main( string [] args) {
int L = 30;
ra1_dict = new Dictionary< int , List< int >>();
Ramanujan_On4(L);
foreach ( var x in ra1_dict) {
Console.Write(x.Key + ": (" );
for ( int i = x.Value.Count - 1; i >= 0; i--) {
if (i == 0)
Console.Write(x.Value[i] + ")" );
else
Console.Write(x.Value[i] + ", " );
}
Console.WriteLine();
}
}
}
|
Javascript
<script>
function ramanujan_On4(limit) {
var dictionary = {};
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++) {
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;
}
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), {});
for (const [key, value] of Object.entries(temp)) {
document.write(key + ": (" + value.reverse() + ")" +
"<br>" );
}
</script>
|
Output:
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:
C++
#include <bits/stdc++.h>
using namespace std;
map< int , vector< int > > ramanujan_On2( int limit)
{
int cubes[limit + 1];
for ( int i = 0; i <= limit; i++) {
cubes[i] = i * i * i;
}
map< int , vector< int > > dict_sum_pairs;
map< int , vector< int > > dict_ramnujan_nums;
for ( int a = 0; a <= limit; a++) {
for ( int b = a + 1; b <= limit; b++) {
int a3 = cubes[a];
int b3 = cubes[b];
int sum_pairs = a3 + b3;
if (dict_sum_pairs.count(sum_pairs)) {
int c = dict_sum_pairs[sum_pairs][0];
int d = dict_sum_pairs[sum_pairs][1];
dict_ramnujan_nums[sum_pairs]
= { a, b, c, d };
}
else {
dict_sum_pairs[sum_pairs] = { a, b };
}
}
}
return dict_ramnujan_nums;
}
int main()
{
int L = 30;
map< int , vector< int > > r_dict
= ramanujan_On2(L);
for ( auto & e : r_dict) {
cout << e.first << ": (" ;
for ( int i = 0; i < e.second.size(); i++) {
if (i == e.second.size() - 1)
cout << e.second[i] << ")" ;
else
cout << e.second[i] << ", " ;
}
cout << endl;
}
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static HashMap<Integer, ArrayList<Integer> >
ramanujan_On2( int limit)
{
int [] cubes = new int [limit + 1 ];
for ( int i = 0 ; i <= limit; i++) {
cubes[i] = i * i * i;
}
HashMap<Integer, ArrayList<Integer> > dict_sum_pairs
= new HashMap<>();
HashMap<Integer, ArrayList<Integer> >
dict_ramnujan_nums = new HashMap<>();
for ( int a = 0 ; a <= limit; a++) {
for ( int b = a + 1 ; b <= limit; b++) {
int a3 = cubes[a];
int b3 = cubes[b];
int sum_pairs = a3 + b3;
if (dict_sum_pairs.containsKey(sum_pairs))
{
int c
= dict_sum_pairs.get(sum_pairs).get(
0 );
int d
= dict_sum_pairs.get(sum_pairs).get(
1 );
dict_ramnujan_nums.put(
sum_pairs,
new ArrayList<>(
Arrays.asList(a, b, c, d)));
}
else
{
dict_sum_pairs.put(
sum_pairs,
new ArrayList<>(
Arrays.asList(a, b)));
}
}
}
return dict_ramnujan_nums;
}
public static void main(String[] args)
{
int L = 30 ;
HashMap<Integer, ArrayList<Integer> > r_dict
= ramanujan_On2(L);
for (Map.Entry<Integer, ArrayList<Integer> > e :
(Iterable<
Map.Entry<Integer, ArrayList<Integer> > >)
r_dict.entrySet()
.stream()
.sorted(
Map.Entry
.comparingByKey())::iterator) {
System.out.print(e.getKey() + ": (" );
for ( int i = 0 ; i <= e.getValue().size() - 1 ;
i++) {
if (i == e.getValue().size() - 1 )
System.out.print(e.getValue().get(i)
+ ")" );
else
System.out.print(e.getValue().get(i)
+ ", " );
}
System.out.println();
}
}
}
|
Python3
from array import *
import time
def ramanujan_On2(limit):
cubes = array( 'i' , [])
dict_sum_pairs = dict ()
dict_ramnujan_nums = dict ()
sum_pairs = 0
for i in range ( 0 , limit):
cubes.append(i * * 3 )
for a in range ( 0 , limit):
for b in range (a + 1 , limit):
a3, b3 = cubes[a], cubes[b]
sum_pairs = a3 + b3
if sum_pairs in dict_sum_pairs:
c, d = dict_sum_pairs.get(sum_pairs)
dict_ramnujan_nums[sum_pairs] = a, b, c, d
else :
dict_sum_pairs[sum_pairs] = a, b
return dict_ramnujan_nums
L = 30
r_dict = ramanujan_On2(L)
for d in sorted (r_dict):
print (f '{d}: {r_dict[d]}' , end = '\n' )
|
C#
using System;
using System.Linq;
using System.Collections.Generic;
class GFG {
static Dictionary< int , List< int > >
Ramanujan_On2( int limit)
{
int [] cubes = new int [limit + 1];
for ( int i = 0; i <= limit; i++) {
cubes[i] = i * i * i;
}
Dictionary< int , List< int > > dict_sum_pairs
= new Dictionary< int , List< int > >();
Dictionary< int , List< int > > dict_ramanujan_nums
= new Dictionary< int , List< int > >();
for ( int a = 0; a <= limit; a++) {
for ( int b = a + 1; b <= limit; b++) {
int a3 = cubes[a];
int b3 = cubes[b];
int sum_pairs = a3 + b3;
if (dict_sum_pairs.ContainsKey(sum_pairs)) {
int c = dict_sum_pairs[sum_pairs][0];
int d = dict_sum_pairs[sum_pairs][1];
dict_ramanujan_nums[sum_pairs]
= new List< int >(
new int [] { a, b, c, d });
}
else {
dict_sum_pairs[sum_pairs]
= new List< int >( new int [] { a, b });
}
}
}
return dict_ramanujan_nums;
}
static void Main( string [] args)
{
int L = 30;
Dictionary< int , List< int > > r_dict
= Ramanujan_On2(L);
foreach (KeyValuePair< int , List< int > > e in
r_dict.OrderBy(key => key.Key))
{
Console.Write(e.Key + ": (" );
for ( int i = 0; i <= e.Value.Count - 1; i++) {
if (i == e.Value.Count - 1)
Console.Write(e.Value[i] + ")" );
else
Console.Write(e.Value[i] + ", " );
}
Console.WriteLine();
}
}
}
|
Javascript
function ramanujan_On2(limit) {
let cubes = [];
let dict_sum_pairs = {};
let dict_ramanujan_nums = {};
let sum_pairs = 0;
for (let i = 0; i < limit; i++) {
cubes.push(i ** 3);
}
for (let a = 0; a < limit; a++) {
for (let b = a + 1; b < limit; b++) {
let a3 = cubes[a];
let b3 = cubes[b];
sum_pairs = a3 + b3;
if (dict_sum_pairs[sum_pairs]) {
let [c, d] = dict_sum_pairs[sum_pairs];
dict_ramanujan_nums[sum_pairs] = [a, b, c, d];
} else {
dict_sum_pairs[sum_pairs] = [a, b];
}
}
}
return dict_ramanujan_nums;
}
const L = 30;
const r_dict = ramanujan_On2(L);
for (let d in r_dict) {
console.log(`${d}: ${r_dict[d]}`);
}
|
Output:
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)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...