C++ 中的尤拉四平方恆等式


在這個問題中,我們得到兩個數字,我們需要使用尤拉四平方恆等式來找到這兩個數字的乘積。

尤拉四平方恆等式是一種尋找兩個數字乘積的方法,如果這兩個數字可以表示為四個平方數之和,則可以使用該方法。

如果 a * b 可以表示為四個平方數之和,則:

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

讓我們舉個例子來理解這個問題:

輸入:

a = 54 = 22 + 32 + 42 + 52

b = 10 = 12 + 22 + 12 + 22


輸出:1*1 + 1*1 + 3*3 + 23*23

解釋:

a 和 b 的乘積 = 540,

可以有多種表示方式。這裡我們將考慮一種解法:

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

解決方案方法:

解決這個問題的一個簡單方法是使用試錯法,嘗試每四個平方的組合來解決問題。為此,我們將使用巢狀迴圈,每個平方值一個巢狀迴圈。然後找到計算出的值並列印所有可能的和表示組合。

這種解決方案有點複雜,時間複雜度為
O( (a*b)4 )。

程式說明了我們解決方案的工作原理:

示例

線上演示

#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;
}

輸出:

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

另一種解決此問題的方法是使用三個巢狀迴圈並檢查第四個值,如果剩餘數字是完全平方數,則其平方根就是第四個數,否則該解不存在。這種方法可能會去掉第四個迴圈,使解決方案更有效。

程式說明了我們解決方案的工作原理:

示例

線上演示

#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;
}

輸出:

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

更新於:2021年1月22日

147 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.