从直观的、最简单的勾股数开始推到通用公式,直到推到完全公式。
在直角三角形中,两条短边长度的平方和,与斜边长度的平方相等,这便是勾股定理。其中最著名也是最广为人知的便是“勾三股四弦五”。其由西周初年的商高提出,距今已经3000年,足见中国古代在数学领域研究之早。
1. 勾三股四弦五的特殊性
1.1 规律一:3 2 = 4 + 5 3^{2} =4+5 3 2 = 4 + 5
勾三股四弦五对应的直角边分别为3和4,斜边为5,作为一组特殊的勾股数,除了三边均为整数外,三个数字还满足3 2 = 4 + 5 3^{2} =4+5 3 2 = 4 + 5 的规律。
那么除了勾三股四弦五之外,还有没有其他的整数勾股数也满足这样的要求呢?首先观察一下这一组3 2 = 4 + 5 3^{2} =4+5 3 2 = 4 + 5 ,可以有以下合理推论:
等号右边为相邻整数,其相加则必然为奇数;
这一对相邻整数之和,必须是另一个奇数的平方;
那么是否所有满足以上两条推理的整数集都是勾股数呢?下面需要使用数学方法做一些推演。
等号左边的的数如果为2 n − 1 2n−1 2 n − 1 ,其中n n n 为自然数集。
等号右边的相邻整数可以构造为( 2 n − 1 ) 2 + 1 2 \frac{\left ( 2n-1 \right )^{2}+1 }{2} 2 ( 2 n − 1 ) 2 + 1 和( 2 n − 1 ) 2 − 1 2 \frac{\left ( 2n-1 \right )^{2}-1 }{2} 2 ( 2 n − 1 ) 2 − 1 ,如果三个数满足勾股定理,那么上述推论即可成立。那么我们就只需要知道下面的式子是否始终成立:
( ( 2 n − 1 ) 2 − 1 2 ) 2 + ( 2 n − 1 ) 2 = ( ( 2 n − 1 ) 2 + 1 2 ) 2 (1) \left ( \frac{\left ( 2n-1 \right )^{2}-1 }{2} \right ) ^{2}+\left ( 2n-1 \right ) ^{2}=\left ( \frac{\left ( 2n-1 \right )^{2}+1 }{2} \right ) ^{2} \tag{1} ( 2 ( 2 n − 1 ) 2 − 1 ) 2 + ( 2 n − 1 ) 2 = ( 2 ( 2 n − 1 ) 2 + 1 ) 2 ( 1 ) 对其进行化简:
( 2 n − 1 ) 2 = ( ( 2 n − 1 ) 2 + 1 2 ) 2 − ( ( 2 n − 1 ) 2 − 1 2 ) 2 \left ( 2n-1 \right ) ^{2}=\left ( \frac{\left ( 2n-1 \right )^{2}+1 }{2} \right ) ^{2}-\left ( \frac{\left ( 2n-1 \right )^{2}-1 }{2} \right ) ^{2} ( 2 n − 1 ) 2 = ( 2 ( 2 n − 1 ) 2 + 1 ) 2 − ( 2 ( 2 n − 1 ) 2 − 1 ) 2 利用平方差公式可得:
( 2 n − 1 ) 2 = ( ( 2 n − 1 ) 2 + 1 2 + ( 2 n − 1 ) 2 − 1 2 ) ⋅ ( ( 2 n − 1 ) 2 + 1 2 − ( 2 n − 1 ) 2 − 1 2 ) \left ( 2n-1 \right ) ^{2}=\left ( \frac{\left ( 2n-1 \right )^2+1 }{2}+\frac{\left ( 2n-1 \right )^2-1 }{2} \right ) ·\left ( \frac{\left ( 2n-1 \right )^2+1 }{2}-\frac{\left ( 2n-1 \right )^2-1 }{2} \right ) ( 2 n − 1 ) 2 = ( 2 ( 2 n − 1 ) 2 + 1 + 2 ( 2 n − 1 ) 2 − 1 ) ⋅ ( 2 ( 2 n − 1 ) 2 + 1 − 2 ( 2 n − 1 ) 2 − 1 ) 进一步化简可得:
( 2 n − 1 ) 2 = ( ( 2 n − 1 ) 2 ) ⋅ 1 \left ( 2n-1 \right ) ^{2}=\left ( \left ( 2n-1 \right ) ^2 \right ) ·1 ( 2 n − 1 ) 2 = ( ( 2 n − 1 ) 2 ) ⋅ 1 明显可以看出,等式在任何情况下都可以满足,所以上述两条推理均成立。比如一个奇数为5,那么其相邻整数分别为12、13;奇数7对应的相邻整数分别为24、25,均满足勾股定理。
此外,奇数的倍数也应当满足勾股定理,如3的倍数有6,其对应的相邻数(此处因为倍数的关系,这两个相邻数应当差2)分别为8、10,9对应的相邻数12、15。
所以满足的数可以构造为( 2 n − 1 ) k \left ( 2n-1 \right ) k ( 2 n − 1 ) k 、( 2 n − 1 ) 2 − 1 2 k \frac{\left ( 2n-1 \right ) ^2-1}{2} k 2 ( 2 n − 1 ) 2 − 1 k 和( 2 n − 1 ) 2 + 1 2 k \frac{\left ( 2n-1 \right ) ^2+1}{2} k 2 ( 2 n − 1 ) 2 + 1 k ,其中n n n 和k k k 分别为自然数集。
1.2 规律二:4 2 = ( 3 + 5 ) × 2 4^2=\left ( 3+5 \right ) \times 2 4 2 = ( 3 + 5 ) × 2
同样地,勾三股四弦五这组勾股数还满足4 2 = ( 3 + 5 ) × 2 4^2=\left ( 3+5 \right ) \times 2 4 2 = ( 3 + 5 ) × 2 ,观察式子进行合理推理:
由于等式右边乘数中有偶数2,所以等式左边一定是偶数的平方;
等式右边的2个勾股数差值应当为2;
据此构建勾股数为2 n 2n 2 n 、n 2 − 1 n^2-1 n 2 − 1 和n 2 + 1 n^2+1 n 2 + 1 ,同样验证下面的式子是否成立:
( 2 n ) 2 + ( n 2 − 1 ) 2 = ( n 2 + 1 ) 2 (2) \left ( 2n \right ) ^2+\left ( n^2-1 \right ) ^2=\left ( n^2+1 \right ) ^2 \tag{2} ( 2 n ) 2 + ( n 2 − 1 ) 2 = ( n 2 + 1 ) 2 ( 2 ) 调整次序并用平方差公式进行化简:
( 2 n ) 2 = ( n 2 + 1 ) 2 − ( n 2 − 1 ) 2 = [ ( n 2 + 1 ) + ( n 2 − 1 ) ] ⋅ [ ( n 2 + 1 ) − ( n 2 − 1 ) ] = ( 2 n 2 ) ⋅ 2 \begin{align}
\left ( 2n \right ) ^2&=\left ( n^2+1 \right ) ^2-\left ( n^2-1 \right ) ^2 \\
&=\left [ \left ( n^2+1 \right )+\left ( n^2-1 \right ) \right ] ·\left [ \left ( n^2+1 \right )-\left ( n^2-1 \right ) \right ]\\
&=\left ( 2n^2 \right ) ·2
\end{align} ( 2 n ) 2 = ( n 2 + 1 ) 2 − ( n 2 − 1 ) 2 = [ ( n 2 + 1 ) + ( n 2 − 1 ) ] ⋅ [ ( n 2 + 1 ) − ( n 2 − 1 ) ] = ( 2 n 2 ) ⋅ 2 可以发现,式2为恒等式,所以满足2 n 2n 2 n 的数也能构成勾股数。
根据该规律,可以得到一些新的勾股数组,比如:8、15、17,12、35、37,16、63、65……
事实上两种不同的规律会得到一些重复的勾股数组,以勾数即最小直角边来看,当满足2 n = ( 2 n − 1 ) k 1 2n=\left ( 2n-1 \right ) k_{1} 2 n = ( 2 n − 1 ) k 1 且n 2 + 1 = ( n 2 − n ) k 2 n^2+1=\left ( n^2-n \right ) k_{2} n 2 + 1 = ( n 2 − n ) k 2 时(其中n > 2 n>2 n > 2 ,k 1 k_{1} k 1 必为偶数),得到的均为重复勾数,比如6、10、14……等式左右均能构建出这些勾数。
1.3 非显性规律
可能还有其他规律,没有那么直观可以看到。如下面的勾股数:
20 21 29 28 45 53 33 56 65 36 77 85 39 80 89 48 55 73 57 76 95 60 91 109 65 72 97 69 92 115 … … … \begin{matrix}
20 & 21 & \boldsymbol{29}\\
28 & 45 & \boldsymbol{53}\\
33 & 56 & 65\\
36 & 77 & 85\\
39 & 80 & \boldsymbol{89}\\
48 & 55 & \boldsymbol{73}\\
57 & 76 & 95\\
60 & \boldsymbol{91} & 109\\
65 & 72 & \boldsymbol{97}\\
69 & 92 & 115\\
… & … & …
\end{matrix} 20 28 33 36 39 48 57 60 65 69 … 21 45 56 77 80 55 76 91 72 92 … 29 53 65 85 89 73 95 109 97 115 … 这些勾股数不符合前面的规律,而且无法直观分辨出其规律,比如33 56 65和39 80 89就满足下面的勾股数规律:
( 3 ( 2 n − 1 ) ) 2 + ( ( 2 n − 1 ) 2 − 9 2 ) 2 = ( ( 2 n − 1 ) 2 − 9 2 + 9 ) 2 (3) \left ( 3\left ( 2n-1 \right ) \right ) ^2+\left ( \frac{\left ( 2n-1 \right )^2 -9}{2} \right )^2 =\left ( \frac{\left ( 2n-1 \right ) ^2-9}{2} +9 \right ) ^2 \tag{3} ( 3 ( 2 n − 1 ) ) 2 + ( 2 ( 2 n − 1 ) 2 − 9 ) 2 = ( 2 ( 2 n − 1 ) 2 − 9 + 9 ) 2 ( 3 ) 另一组20 21 29、2 8 45 53、36 77 85勾股数可以满足:
( 4 ( 2 n − 1 ) ) 2 + ( 2 ( 2 n − 1 ) 2 − 8 2 ) 2 = ( 2 ( 2 n − 1 ) 2 + 8 2 ) 2 (4) \left ( 4\left ( 2n-1 \right ) \right ) ^2+\left ( \frac{2\left ( 2n-1 \right )^2 -8}{2} \right )^2 =\left ( \frac{2\left ( 2n-1 \right ) ^2+8}{2} \right ) ^2 \tag{4} ( 4 ( 2 n − 1 ) ) 2 + ( 2 2 ( 2 n − 1 ) 2 − 8 ) 2 = ( 2 2 ( 2 n − 1 ) 2 + 8 ) 2 ( 4 ) 如果希望通过这样的方法穷尽勾股数是办不到的,一方面规律比较难观察,另一方面通用公式较多,无法统一。
2. 完全公式
目前有一些不同的方案可以求出勾股数的完全公式,下面主要介绍一种。
a b a b n n
在上图中,3个任意半径的圆相互外切,其圆心相连构成的三角形为直角三角形,并且三边长分别为两两半径之和,分别为a + b a+b a + b 、b + n b+n b + n 、a + n a+n a + n 。其中a、b均为正整数,且a > b a>b a > b ,根据勾股定理:
( a + b ) 2 + ( b + n ) 2 = ( a + n ) 2 \left ( a+b \right ) ^2+\left ( b+n \right ) ^2=\left ( a+n \right ) ^2 ( a + b ) 2 + ( b + n ) 2 = ( a + n ) 2 反求n n n ,得n = a b + b 2 a − b n=\frac{ab+b^2}{a-b} n = a − b ab + b 2 ,将n n n 带回勾股定理,并进行化简:
( a 2 − b 2 ) 2 + ( 2 a b ) 2 = ( a 2 + b 2 ) 2 (5) \left ( a^2-b^2 \right ) ^2+\left ( 2ab \right ) ^2=\left ( a^2+b^2 \right ) ^2 \tag{5} ( a 2 − b 2 ) 2 + ( 2 ab ) 2 = ( a 2 + b 2 ) 2 ( 5 ) 将任意不相等的正整数带入公式,即可得到一组勾股数。
比如需要用编程方法求出100以内的勾股数,利用该公式可以迅速求得,效率比传统遍历方法快捷不少。
#通过公式求勾股数
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)