Euler's Four Square Identity in C++


In this problem, we are given two numbers and we need to find the product of the numbers using Euler's four square Identity. 

Euler’s Four Square Identity is the method to find the product of two numbers which can be represented using the sum of four squares of the number if the numbers can be represented as sum of four squares.

The product a * b can be represented as the sum of four squares if

a = x12 + x22 + x32 + x42
 b = y12 + y22 + y32 + y42
 a * b = z12 + z22 + z32 + z42

Let’s take an example to understand the problem,

Input: 

          a = 54 = 2*2 + 3*3 + 4*4 + 5*5

          b = 10 = 1*1 + 2*2 + 1*1 + 2*2


Output: 1*1 + 1*1 + 3*3 + 23*23

Explanation: 

The product of a and b = 540,

which can be represented in multiple ways. We will find consider one solution here,

540 = 1*1 + 1*1 + 3*3 + 23*23 = 1 + 1 + 9 + 529

Solution Approach −

A simple solution to the problem is by using a trial method to try each of the four square combinations to solve the problem. For this we will be using nested loops, one nested loop for each square value. And then find the value calculated and print all possible combinations of sum representation.

This solution is a bit complex and the time complexity is of the order
O( (a*b)4 ). 

Program to illustrate the working of our solution,

Example

Live Demo

#include <bits/stdc++.h>
using namespace std;

void findEulerSquareNumberValue(int a, int b) {

   int prod = a * b;
   int sumSquare = 0;
   for (int x = 0; x <= sqrt(prod); x++) {
      for (int y = x; y <= sqrt(prod); y++) {
         for (int z = y; z <= sqrt(prod); z++) {
            for (int k = z; k <= sqrt(prod); k++) {
           
               sumSquare = (x*x) + (y*y) + (z*z) + (k*k);
               if (sumSquare == prod) {
                cout<<"The product "<<a<<"*"<<b<<" = "<<prod<<" represented as ";
                cout<<x<<"*"<<x<<" + ";
                cout<<y<<"*"<<y<<" + ";
                cout<<z<<"*"<<z<<" + ";
                cout<<k<<"*"<<k<<endl;
                cout<<endl;
               }
            }
         }
      }
   }
}

int main() {

   int a = (2*2) + (3*3) + (4*4) + (5*5);
   int b = (1*1) + (2*2) + (1*1) + (2*2);
   cout<<"a = (2*2) + (3*3) + (4*4) + (5*5) = "<<a<<endl;
   cout<<"b = (1*1) + (2*2) + (1*1) + (2*2) = "<<b<<endl;
   findEulerSquareNumberValue(a, b);
   
   return 0;
}

Output −

a = (2*2) + (3*3) + (4*4) + (5*5) = 54
b = (1*1) + (2*2) + (1*1) + (2*2) = 10
The product 54*10 = 540 represented as 1*1 + 1*1 + 3*3 + 23*23

The product 54*10 = 540 represented as 1*1 + 3*3 + 13*13 + 19*19

The product 54*10 = 540 represented as 1*1 + 5*5 + 15*15 + 17*17

The product 54*10 = 540 represented as 1*1 + 7*7 + 7*7 + 21*21

The product 54*10 = 540 represented as 1*1 + 9*9 + 13*13 + 17*17

The product 54*10 = 540 represented as 2*2 + 4*4 + 6*6 + 22*22

The product 54*10 = 540 represented as 2*2 + 4*4 + 14*14 + 18*18

The product 54*10 = 540 represented as 2*2 + 6*6 + 10*10 + 20*20

The product 54*10 = 540 represented as 2*2 + 12*12 + 14*14 + 14*14

The product 54*10 = 540 represented as 3*3 + 3*3 + 9*9 + 21*21

The product 54*10 = 540 represented as 3*3 + 7*7 + 11*11 + 19*19

The product 54*10 = 540 represented as 3*3 + 9*9 + 15*15 + 15*15

The product 54*10 = 540 represented as 3*3 + 11*11 + 11*11 + 17*17

The product 54*10 = 540 represented as 4*4 + 10*10 + 10*10 + 18*18

The product 54*10 = 540 represented as 5*5 + 5*5 + 7*7 + 21*21

The product 54*10 = 540 represented as 5*5 + 11*11 + 13*13 + 15*15

The product 54*10 = 540 represented as 6*6 + 6*6 + 12*12 + 18*18

The product 54*10 = 540 represented as 7*7 + 7*7 + 9*9 + 19*19

The product 54*10 = 540 represented as 7*7 + 9*9 + 11*11 + 17*17

The product 54*10 = 540 represented as 9*9 + 11*11 + 13*13 + 13*13

The product 54*10 = 540 represented as 10*10 + 10*10 + 12*12 + 14*14

Another method to solve the problem with less time complexity is using three nested loop and checking the forth value, if the remaining number is perfect square, the root value is the fourth number otherwise the solution is not possible. This method will possibly remove the forth loop and make the solution effective.

Program to illustrate the working of our solution,

Example

Live Demo

#include <bits/stdc++.h>
using namespace std;

void findEulerSquareNumberValue(int a, int b) {

   int prod = a * b;
   int sumSquare = 0;
   for (int x = 0; x <= sqrt(prod); x++) {
      for (int y = x; y <= sqrt(prod); y++) {
         for (int z = y; z <= sqrt(prod); z++) {
         
            sumSquare = (x*x) + (y*y) + (z*z);
            float k = sqrt(prod - sumSquare);
            if ( floor(k) == ceil(k)) {
             cout<<"The product "<<a<<"*"<<b<<" = "<<prod<<" represented as ";
             cout<<x<<"*"<<x<<" + ";
             cout<<y<<"*"<<y<<" + ";
             cout<<z<<"*"<<z<<" + ";
             cout<<k<<"*"<<k<<endl;
             cout<<endl;
            }
         }
      }
   }
}

int main() {

   int a = (2*2) + (3*3) + (4*4) + (5*5);
   int b = (1*1) + (2*2) + (1*1) + (2*2);
   cout<<"a = (2*2) + (3*3) + (4*4) + (5*5) = "<<a<<endl;
   cout<<"b = (1*1) + (2*2) + (1*1) + (2*2) = "<<b<<endl;
   findEulerSquareNumberValue(a, b);
   
   return 0;
}

Output −

a = (2*2) + (3*3) + (4*4) + (5*5) = 54
b = (1*1) + (2*2) + (1*1) + (2*2) = 10
The product 54*10 = 540 represented as 1*1 + 1*1 + 3*3 + 23*23

The product 54*10 = 540 represented as 1*1 + 1*1 + 23*23 + 3*3

The product 54*10 = 540 represented as 1*1 + 3*3 + 13*13 + 19*19

The product 54*10 = 540 represented as 1*1 + 3*3 + 19*19 + 13*13

The product 54*10 = 540 represented as 1*1 + 3*3 + 23*23 + 1*1

The product 54*10 = 540 represented as 1*1 + 5*5 + 15*15 + 17*17

The product 54*10 = 540 represented as 1*1 + 5*5 + 17*17 + 15*15

The product 54*10 = 540 represented as 1*1 + 7*7 + 7*7 + 21*21

The product 54*10 = 540 represented as 1*1 + 7*7 + 21*21 + 7*7

The product 54*10 = 540 represented as 1*1 + 9*9 + 13*13 + 17*17

The product 54*10 = 540 represented as 1*1 + 9*9 + 17*17 + 13*13

The product 54*10 = 540 represented as 1*1 + 13*13 + 17*17 + 9*9

The product 54*10 = 540 represented as 1*1 + 13*13 + 19*19 + 3*3

The product 54*10 = 540 represented as 1*1 + 15*15 + 17*17 + 5*5

The product 54*10 = 540 represented as 2*2 + 4*4 + 6*6 + 22*22

The product 54*10 = 540 represented as 2*2 + 4*4 + 14*14 + 18*18

The product 54*10 = 540 represented as 2*2 + 4*4 + 18*18 + 14*14

The product 54*10 = 540 represented as 2*2 + 4*4 + 22*22 + 6*6

The product 54*10 = 540 represented as 2*2 + 6*6 + 10*10 + 20*20

The product 54*10 = 540 represented as 2*2 + 6*6 + 20*20 + 10*10

The product 54*10 = 540 represented as 2*2 + 6*6 + 22*22 + 4*4

The product 54*10 = 540 represented as 2*2 + 10*10 + 20*20 + 6*6

The product 54*10 = 540 represented as 2*2 + 12*12 + 14*14 + 14*14

The product 54*10 = 540 represented as 2*2 + 14*14 + 14*14 + 12*12

The product 54*10 = 540 represented as 2*2 + 14*14 + 18*18 + 4*4

The product 54*10 = 540 represented as 3*3 + 3*3 + 9*9 + 21*21

The product 54*10 = 540 represented as 3*3 + 3*3 + 21*21 + 9*9

The product 54*10 = 540 represented as 3*3 + 7*7 + 11*11 + 19*19

The product 54*10 = 540 represented as 3*3 + 7*7 + 19*19 + 11*11

The product 54*10 = 540 represented as 3*3 + 9*9 + 15*15 + 15*15

The product 54*10 = 540 represented as 3*3 + 9*9 + 21*21 + 3*3

The product 54*10 = 540 represented as 3*3 + 11*11 + 11*11 + 17*17

The product 54*10 = 540 represented as 3*3 + 11*11 + 17*17 + 11*11

The product 54*10 = 540 represented as 3*3 + 11*11 + 19*19 + 7*7

The product 54*10 = 540 represented as 3*3 + 13*13 + 19*19 + 1*1

The product 54*10 = 540 represented as 3*3 + 15*15 + 15*15 + 9*9

The product 54*10 = 540 represented as 4*4 + 6*6 + 22*22 + 2*2

The product 54*10 = 540 represented as 4*4 + 10*10 + 10*10 + 18*18

The product 54*10 = 540 represented as 4*4 + 10*10 + 18*18 + 10*10

The product 54*10 = 540 represented as 4*4 + 14*14 + 18*18 + 2*2

The product 54*10 = 540 represented as 5*5 + 5*5 + 7*7 + 21*21

The product 54*10 = 540 represented as 5*5 + 5*5 + 21*21 + 7*7

The product 54*10 = 540 represented as 5*5 + 7*7 + 21*21 + 5*5

The product 54*10 = 540 represented as 5*5 + 11*11 + 13*13 + 15*15

The product 54*10 = 540 represented as 5*5 + 11*11 + 15*15 + 13*13

The product 54*10 = 540 represented as 5*5 + 13*13 + 15*15 + 11*11

The product 54*10 = 540 represented as 5*5 + 15*15 + 17*17 + 1*1

The product 54*10 = 540 represented as 6*6 + 6*6 + 12*12 + 18*18

The product 54*10 = 540 represented as 6*6 + 6*6 + 18*18 + 12*12

The product 54*10 = 540 represented as 6*6 + 10*10 + 20*20 + 2*2

The product 54*10 = 540 represented as 6*6 + 12*12 + 18*18 + 6*6

The product 54*10 = 540 represented as 7*7 + 7*7 + 9*9 + 19*19

The product 54*10 = 540 represented as 7*7 + 7*7 + 19*19 + 9*9

The product 54*10 = 540 represented as 7*7 + 7*7 + 21*21 + 1*1

The product 54*10 = 540 represented as 7*7 + 9*9 + 11*11 + 17*17

The product 54*10 = 540 represented as 7*7 + 9*9 + 17*17 + 11*11

The product 54*10 = 540 represented as 7*7 + 9*9 + 19*19 + 7*7

The product 54*10 = 540 represented as 7*7 + 11*11 + 17*17 + 9*9

The product 54*10 = 540 represented as 7*7 + 11*11 + 19*19 + 3*3

The product 54*10 = 540 represented as 9*9 + 11*11 + 13*13 + 13*13

The product 54*10 = 540 represented as 9*9 + 11*11 + 17*17 + 7*7

The product 54*10 = 540 represented as 9*9 + 13*13 + 13*13 + 11*11

The product 54*10 = 540 represented as 9*9 + 13*13 + 17*17 + 1*1

The product 54*10 = 540 represented as 9*9 + 15*15 + 15*15 + 3*3

The product 54*10 = 540 represented as 10*10 + 10*10 + 12*12 + 14*14

The product 54*10 = 540 represented as 10*10 + 10*10 + 14*14 + 12*12

The product 54*10 = 540 represented as 10*10 + 10*10 + 18*18 + 4*4

The product 54*10 = 540 represented as 10*10 + 12*12 + 14*14 + 10*10

The product 54*10 = 540 represented as 11*11 + 11*11 + 17*17 + 3*3

The product 54*10 = 540 represented as 11*11 + 13*13 + 13*13 + 9*9

The product 54*10 = 540 represented as 11*11 + 13*13 + 15*15 + 5*5

The product 54*10 = 540 represented as 12*12 + 14*14 + 14*14 + 2*2

Updated on: 22-Jan-2021

93 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements