Showing posts with label Hardy Number. Show all posts
Showing posts with label Hardy Number. Show all posts

Monday, September 5, 2011

Find the smallest number expressible as the sum of cubes of two numbers in two different ways. Indeed, 10^3 + 9^3 =12^3+1^3=1729 , Do It Efficiently


Problem:
A mathematician G. H. Hardy was on his way to visit his collaborator S. Ramanujan an who was in the hospital. Hardy remarked to Ramanujan that he traveled in taxi cab number 1729 which seemed a dull one and he hoped it was not a bad omen. To this, Ramanujan replied that 1729 was a very interesting number-it was the smallest number expressible as the sum of cubes of two numbers in two different ways. Indeed,
103 + 93 =123 + 1 3 二1729.

Hint: This problem is very similar to another very popular problem that is asked in interviews. You are given a  η ×η matrix in which both rows and columns are sorted in ascending order and you are supposed
to find a given number in the matrix.


Algorithm:
In this case, we are essentially looking for an implicit matrix A such that A(i,j) =i^3十j^3. In our case, the matrix will have n^1/3 rows and columns and this matrix of size n^1/3 * n^1/3 we try to search k=i^3+j^3 isn't it  ans algorithms for searching for a number in such a matrix that are linear in the number of rows.

One approach is to start by comparing x to An,1. If  x = An ,l , stop.Otherwise, there are two cases:
- x < A1,n in which case x is less than element at Column n at 1,n position. which mean we can escape whole row itself . we decrement column pointer to left.e.g. previous column.
- x > A1,n , in which case if x > a[1][n] is greater than it will be greater then all elements in Row 1.. we increment the row pointer to next row.


Efficient Solution:
Here is the Pseudo Code For The Same.
int IsNumberEqualstoSumeTwoCubes(int n)
{
       int row=Ceil(Pow(n,1/3));// Pow Has Complexity of O(logn) Ceil(1729)=577
       int column=row;
       int i=0;int j=column;
      while(i<row && j>=0)
     {
               int m=i*i*i+j*j*j;
               if(m==n)
                   return 1; // print i^3 and j^3 these are two such numbers
              else if ( m < n)
               i++;
              else
               j--;
      }
return 0; //such number DNE
}

Complexity Analysis:
In either case, we have a matrix with η fewer elements to search. In each iteration, we remove a row or a column, which means we inspect 2η-1 elements.


We claim that our algorithm that solves the matrix search problem will have to compare x with each of the 2n-l elements shown (i.e the diagonal elements (in case of column element matching )and  the elements immediately below them (in case of row elements matching )and this is obvious just draw a diagram in which both row & column are in sorted order & try to run the above algorithm ).
Call these elemmts the # elements..
Comparing x with any other elements in matrix does not eliminate the any of the # elements.we can easily Proof this by Contradiction:Suppose X algorithm doesn't compare x with  any of the above # elements.
then we could make that element x ( instead of x-1 got to prev. column  or x+1 go to next row.).hence we will get wrong result.

Above Algorithm Really Requires Deep Understanding of Young_tableau :)

Time Complexity O(row+column)=O(N^1/3+N^1/3)=O(2*N^1/3)=O(N^1/3)
Space Complexity O(1)