基本介紹
常用套路,簡介,第一套路,第二套路,公式證明,證明,推廣形式,完全公式,公式,組數N,編程,Java,C++,Python3.x,整勾股數,常見組合,特殊組合,20以內,20-130,其他公式,
常用套路
簡介
所謂勾股數,一般是指能夠構成直角三角形三條邊的三個正整數(例如a,b,c)。
即a2+b2=c2,a,b,c∈N
關於這樣的數組,比較常用也比較實用的套路有以下兩種:
第一套路
當a為大於1的奇數2n+1時,b=2n2+2n, c=2n2+2n+1。
n=1時(a,b,c)=(3,4,5)
n=2時(a,b,c)=(5,12,13)
n=3時(a,b,c)=(7,24,25)
……
這是最經典的一個套路,而且由於兩個連續自然數必然互質,所以用這個套路得到的勾股數組全部都是互質的。
第二套路
2、當a為大於4的偶數2n時,b=n2-1, c=n2+1
也就是把a的一半的平方分別減1和加1,例如:
n=3時(a,b,c)=(6,8,10)
n=4時(a,b,c)=(8,15,17)
n=5時(a,b,c)=(10,24,26)
n=6時(a,b,c)=(12,35,37)
……
所以如果你只想得到互質的數組,這條可以改成,對於a=4n (大於等於2), b=4n2-1, c=4n2+1,例如:
n=2時(a,b,c)=(8,15,17)
n=3時(a,b,c)=(12,35,37)
n=4時(a,b,c)=(16,63,65)
……
公式證明
證明
a=2mn
b=m2-n2
c=m2+n2
證:
假設a2+b2=c2,這裡研究(a,b)=1的情況(如果不等於1則(a,b)|c,兩邊除以(a,b)即可)
等式化為4k2 = (c+b)(c-b)
顯然b,c同奇偶(否則右邊等於奇數矛盾)
作代換:M=(c+b)/2, N=(c-b)/2,顯然M,N為正整數
往證:(M,N)=1
如果存在質數p,使得p|M,p|N, 那么p|M+N(=c), p|M-N(=b), 從而p|c, p|b, 從而p|a,這與(a,b)=1矛盾
所以(M,N)=1得證。
如果對於某個pi,M的pi因子個數為奇數個,那N對應的pi因子必為奇數個(否則加起來不為偶數),從而pi|M, pi|N,(M,N)=pi>1與剛才的證明矛盾 所以對於所有質因子,pi2|M, pi2|N,即M,N都是平方數。
設M = m2, N = n2
從而有c+b = 2m2, c-b = 2n2,解得c=m2+n2, b=m2-n2, 從而a=2mn
推廣形式
關於勾股數的公式還是有局限的。勾股數公式可以得到所有的基本勾股數,但是不可能得到所有的派生勾股數。比如3,4,5;6,8,10;9,12,15...,就不能全部有公式計算出來。
但可以採用同乘以任意整數的形式來獲取所有解!
其中規定m>n>0(兩負數相乘可抵消固不考慮),(m,n)=1,m和n必須為一奇一偶,t為正整數
完全公式
公式
a=m,b=(m^2 / k - k) / 2,c=(m^2 / k + k) / 2 ①
其中m ≥3
⒈ 當m確定為任意一個 ≥3的奇數時,k={1,m^2的所有小於m的因子}
⒉ 當m確定為任意一個 ≥4的偶數時,k={m^2 / 2的所有小於m的偶數因子}
基本勾股數與派生勾股數可以由完全一併求出。例如,當m確定為偶數432時,因為k={432^2 / 2的所有小於432的偶數因子}= {2,4,6,8,12,16,18,24,32,36,48,54,64,72,96,108,128,144,162,192,216,288,324,384},將m=432及24組不同k值分別代入b=(m^2 / k - k) / 2,c=(m^2 / k + k) / 2;即得直角邊a=432時,具有24組不同的另一直角邊b和斜邊c,基本勾股數與派生勾股數一併求出。而勾股數的組數也有公式能直接得到。
組數N
當a給定時,不同勾股數組a,b,c的組數N等於①式中k的可取值個數
⒈ 取奇數a=p1^m1×p2^m2×……×pr^mr,其中k={1,a^2的所有小於a的因子},則k的可取值個數:
N=[(2m1+1)×(2m2+1)×……×(2mr+1)-1]/2
⒉ 取偶數a=2^m0×p1^m1×p2^m2×……×pr^mr,其中k={a^2 / 2的所有小於a的偶數因子},則k的可取值個數:
N=[(2m0-1)×(2m1+1)×(2m2+1)×……×(2mr+1)-1]/2
其中,p1,p2,……,pr為互不相同的奇素數,m0,m1,……,mr為冪指數。
編程
Java
import java.math.*;public class Test{ public static void main(String[] args){ int number=0; int a=3,b,c; double d; for(;a<100;a++) for(b=a+1;b<100;b++){ d=Math.sqrt(a*a+b*b); c=(int)d; if(c>100)break; if(d-c<=0){ number++; System.out.print("("+a+""+b+""+c+")"); if(number%4==0){ System.out.println(); } } } System.out.println("共有"+number+"組"); } }
C++
#include <iostream>using namespace std;int main(){ int a, b, c; for (a = 1; a < 100; a++) for (b = 1; b < 100; b++) for (c = 1; c < 100; c++) if (a<b && a*a + b*b == c*c) cout << a << " " << b << " " << c << endl; return 0;}
Python3.x
#通過公式求勾股數def Ht(k, m): ''' a = k * (m * m - n * n) b = k * (2 * m * n) c = k * (m * m + n * n) ''' result = [] for k0 in range(1, k + 1): for m0 in range(2, m + 1): for n0 in range(1, m0): a = k0 * (m0 * m0 - n0 * n0) b = k0 * (2 * m0 * n0) c = k0 * (m0 * m0 + n0 * n0) if not {a, b, c} in result: result.append({a, b, c}) result = [sorted(list(x)) for x in result] return (sorted(result,key=lambda x:x[0]), '共有 {length} 組勾股數'.format(length = len(result)))Ht(10, 10)
整勾股數
常見組合
3,4,5 : 勾三股四弦五
5,12,13 : 5·21(12)記一生(13)
6,8,10: 連續的偶數
8,15,17 : 八月十五在一起(17)
特殊組合
連續的勾股數只有3,4,5
連續的偶數勾股數只有6,8,10
20以內
3 4 5;5 12 13; 6 8 10;8,15,17;9 12 15
20-130
7 24 25;9 40 41;10 24 26;11 60 61;12 16 20;12 35 37;13 84 85;14 48 50;15 20 25;15 36 39;15 112 113;16 30 34;16 63 65;18 24 30;18 80 82;20 21 29;20 48 52;20 99 101;21 28 35;21 72 75;22 120 122;24 32 40;24 45 51;24 70 74;25 60 65;27 36 45;28 45 53;28 96 100;30 40 50;30 72 78;32 60 68;33 44 55;33 56 65;35 84 91;36 48 60;36 77 85;39 52 65;39 80 89;40 42 58;40 75 85 ;40 96 104;42 56 70 ; 45 60 75 ; 48 55 73 ; 48 64 80 ; 48 90 102 ; 51 68 85 ;54 72 90 ; 56 90 106 ; 57 76 95 ; 60 63 87 ; 60 80 100 ;60 91 109 ; 63 84 105 ; 65 72 97 ; 66 88 110 ; 69 92 115 ;72 96 120 ; 75 100 125 ; 80 84 116。
三個數都在100以內共有52組。
其他公式
三個任意半徑的圓相互外切,其半徑兩兩相加,分別是以三個圓的圓心為頂點的三角形的三個邊長。如圖:設一直角三角形斜邊為a+n,另兩個直角邊分別是a+b和b+n。a、b都是正整數,且a>b。以勾股定理得,展開並化簡得:,即,按圖中步驟得,將任意兩個不相等的正整數數帶入上式,注意a>b,即可得到一組勾股數。不過得到的勾股數可能不互質,要除以三個數的最大公因數,就可得到一組互質的勾股數。