數學基礎之勾股數


素勾股數

勾股數公式的簡單推導

轉載自物理學渣的知乎專欄

勾股數的性質

(1)定義:凡符合$X^2 + Y^2 = Z^2$公式的正整數我們稱之為勾股數。$X$和$Y$代表兩條直角邊,$Z$代表斜邊。

(2)凡有公約數的勾股數我們稱之為派生勾股數,例[30, 40, 50]等;無公約數的勾股數,例[3, 4, 5], [8, 15, 17]等,我們稱之為勾股數。全是偶數的勾股數必是派生勾股數,三個奇數不可能符合定義公式。因此,勾股數唯一的可能性是:$X$和$Y$分別是奇數和偶數(偶數和奇數),斜邊$Z$則只能是奇數。

(3)勾股數具有以下特性

  • 斜邊與偶數邊之差是奇數,這個奇數只能是某奇數的平方數, 例1, 9, 25, 49, ..., 至無窮大;
  • 斜邊與奇數邊之差是偶數,這個偶數只能是某偶數平方數的一半, 例2, 8, 18, 32, ..., 至無窮大;

(4)由以上定義我們推導出勾股公式

$$X = P^2 + PQ$$

$$Y = Q^2 / 2 + PQ$$

$$Z = P^2 + Q^2 / 2 + PQ$$

此公式涵蓋了自然界的全部勾股數,包括派生勾股數。

(5)用此公式很容易導出全部勾股數,例如2000以內的勾股數計有320組(不含派生勾股數)。最大的一組是[315, 1972, 1997]。

斜邊是1105和1885的勾股數各有4組:                     

  • [47, 1104, 1105]  [264, 1703, 1105]  [576, 943, 1105]  [744, 817, 1105];
  • [427, 1836, 1885]  [1003, 1596, 1885]  [1643, 924, 1885]  [1813, 516, 1885];

(6)以任意奇數代入$P$ ,任意偶數代入$Q$ ,即可得到唯一一組勾股數。

例如$P = 5, Q = 8$,得到:$X = 25 + 5 × 8 = 65, Y = 32 + 5 × 8 = 72, Z = 25 + 32 + 5 × 8 = 97$。

它極清楚地顯示出了斜邊與偶數直角邊之差是奇數的平方,斜邊與奇數直角邊之差是偶數平方值的一半,而斜邊則是由奇數的平方與偶數平方的一半和此奇數與偶數之積三項之和所構成。

(7)當$P$與$Q$有公約數時,例如9與12,再例如21與28等,推導出來的是派生勾股數;當$P$與$Q$無公約數時,例如9與8,再例如21與16等,推導出來的是勾股數;

(8)不存在不符合本公式的勾股數。例如有人發現趣味勾股數[88209, 90288, 126225],它實際是個派生勾股數,它是[297, 304, 425]乘297倍而成,它是由$P = 11$和$Q = 16$導出。

(9)本文所提供的公式是依據性質第3條的兩條勾股數特性規律推導而出,但是它可以與六百年前印度婆羅門笈多公式相互推導。

(10)依據本公式勾股定理可從正整數拓展到負整數。在笛卡爾座標圖上,勾股三角形可以在更大的位置上顯現。

例題演示

題目描述

特殊畢達哥拉斯三元組

畢達哥拉斯三元組是三個自然數:$a < b < c$組成的集合,並滿足$a^2 + b^2 = c^2$。例如,$3^2 + 4^2 = 9 + 16 = 25 = 5^2$。

有且只有一個畢達哥拉斯三元組滿足$a + b + c = 1000$。求這個三元組的乘積$abc$。

解題思路

由素勾股數的性質可知,只需要求出素勾股數那么它的倍數也是勾股數,而要求素勾股數要借助性質四。

代碼實現(C)

#include<stdio.h>
#include<math.h>
int gcd(int m, int n) {
    return(n ? gcd(n, m%n) : m); //求最大公約數
}

int main() {
    int ans = 0;
    for(int n = 1; n <= 33; n++) { 
        for(int m = n + 1; m <= 33; m++) { // m一定要大於n
            if(gcd(m ,n) != 1) continue;
            int a = 2 * n * m;
            int b = m * m - n * n;
            int c = m * m + n * n;
            if(1000 % (a + b + c) == 0) { //如果1000 % (a + b + c) == 0那么要求勾股數就是它的倍數
                int k = 1000 / (a + b + c);  
                ans = a * b * c *(int)pow(k, 3);
            }
            
        }
    
    } 
     printf("%d", ans);
}

(整理自網絡)

參考資料:

https://zhuanlan.zhihu.com/p/83522763

https://www.cnblogs.com/mfryf/archive/2012/02/16/2354116.html

https://blog.csdn.net/qq_43799957/article/details/99883710


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM