从直观的、最简单的勾股数开始推到通用公式,直到推到完全公式。

在直角三角形中,两条短边长度的平方和,与斜边长度的平方相等,这便是勾股定理。其中最著名也是最广为人知的便是“勾三股四弦五”。其由西周初年的商高提出,距今已经3000年,足见中国古代在数学领域研究之早。

1. 勾三股四弦五的特殊性

1.1 规律一:32=4+53^{2}=4+532=4+5

勾三股四弦五对应的直角边分别为3和4,斜边为5,作为一组特殊的勾股数,除了三边均为整数外,三个数字还满足32=4+53^{2}=4+532=4+5的规律。

那么除了勾三股四弦五之外,还有没有其他的整数勾股数也满足这样的要求呢?首先观察一下这一组32=4+53^{2}=4+532=4+5,可以有以下合理推论:

等号右边为相邻整数,其相加则必然为奇数;

这一对相邻整数之和,必须是另一个奇数的平方;

那么是否所有满足以上两条推理的整数集都是勾股数呢?下面需要使用数学方法做一些推演。

等号左边的的数如果为2n−12n-12n−1,其中nnn为自然数集。

等号右边的相邻整数可以构造为(2n−1)2+12\frac{(2n-1)^{2}+1}{2}2(2n−1)2+1​和(2n−1)2−12\frac{(2n-1)^{2}-1}{2}2(2n−1)2−1​,如果三个数满足勾股定理,那么上述推论即可成立。那么我们就只需要知道下面的式子是否始终成立:

(1)((2n−1)2−12)2+(2n−1)2=((2n−1)2+12)2\left ( \frac{(2n-1)^{2}-1}{2} \right ) ^{2}+\left ( 2n-1 \right ) ^{2} =\left ( \frac{(2n-1)^{2}+1}{2} \right ) ^{2} \tag{1}

(2(2n−1)2−1​)2+(2n−1)2=(2(2n−1)2+1​)2(1)

对其进行化简:

(2n−1)2=((2n−1)2+12)2−((2n−1)2−12)2\left ( 2n-1 \right ) ^{2} =\left ( \frac{(2n-1)^{2}+1}{2} \right ) ^{2}-\left ( \frac{(2n-1)^{2}-1}{2} \right ) ^{2}

(2n−1)2=(2(2n−1)2+1​)2−(2(2n−1)2−1​)2

利用平方差公式可得:

(2n−1)2=((2n−1)2+12+(2n−1)2−12)⋅((2n−1)2+12−(2n−1)2−12)\left ( 2n-1 \right ) ^{2} = \left ( \frac{(2n-1)^{2}+1}{2} +\frac{(2n-1)^{2}-1}{2} \right ) \cdot \left ( \frac{(2n-1)^{2}+1}{2} -\frac{(2n-1)^{2}-1}{2} \right )

(2n−1)2=(2(2n−1)2+1​+2(2n−1)2−1​)⋅(2(2n−1)2+1​−2(2n−1)2−1​)

进一步化简可得:

(2n−1)2=((2n−1)2)⋅(1)\left ( 2n-1 \right ) ^{2} = \left ( \left ( 2n-1 \right ) ^{2} \right ) \cdot \left ( 1 \right )

(2n−1)2=((2n−1)2)⋅(1)

明显可以看出,等式在任何情况下都可以满足,所以上述两条推理均成立。比如一个奇数为5,那么其相邻整数分别为12、13;奇数7对应的相邻整数分别为24、25,均满足勾股定理。

此外,奇数的倍数也应当满足勾股定理,如3的倍数有6,其对应的相邻数(此处因为倍数的关系,这两个相邻数应当差2)分别为8、10,9对应的相邻数12、15。

所以满足的数可以构造为(2n−1)k(2n-1)k(2n−1)k、(2n−1)2−12k\frac{(2n-1)^{2}-1}{2}k2(2n−1)2−1​k和(2n−1)2+12k\frac{(2n-1)^{2}+1}{2}k2(2n−1)2+1​k,其中nnn和kkk分别为自然数集。

1.2 规律二:42=(3+5)×24^{2}=(3+5)\times 242=(3+5)×2

同样地,勾三股四弦五这组勾股数还满足42=(3+5)×24^{2}=(3+5)\times 242=(3+5)×2,观察式子进行合理推理:

由于等式右边乘数中有偶数2,所以等式左边一定是偶数的平方;

等式右边的2个勾股数差值应当为2;

据此构建勾股数为2n2n2n、n2−1n^2-1n2−1和n2+1n^2 +1n2+1,同样验证下面的式子是否成立:

(2)(2n)2+(n2−1)2=(n2+1)2\left ( 2n \right ) ^2 + \left ( n^2-1 \right ) ^2 = \left ( n^2 + 1 \right ) ^ 2 \tag{2}

(2n)2+(n2−1)2=(n2+1)2(2)

调整次序并用平方差公式进行化简:

(2n)2=(n2+1)2−(n2−1)2=[(n2+1)+(n2−1)]⋅[(n2+1)−(n2−1)]=(2n2)⋅2\begin{aligned}

\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 ] \cdot \left [ \left ( n^2+1 \right ) -\left ( n^2-1 \right ) \right ] \\

&= \left ( 2n ^2 \right ) \cdot 2

\end{aligned}(2n)2​=(n2+1)2−(n2−1)2=[(n2+1)+(n2−1)]⋅[(n2+1)−(n2−1)]=(2n2)⋅2​

可以发现,式2为恒等式,所以满足2n2n2n的数也能构成勾股数。

根据该规律,可以得到一些新的勾股数组,比如:8、15、17,12、35、37,16、63、65……

事实上两种不同的规律会得到一些重复的勾股数组,以勾数即最小直角边来看,当满足2n=(2n−1)k12n =\left ( 2n-1 \right ) k_{1}2n=(2n−1)k1​且n2+1=(n2−n)k2n^2+1=\left ( n^2-n \right )k_{2}n2+1=(n2−n)k2​时(其中n>2n>2n>2,k1k_{1}k1​必为偶数),得到的均为重复勾数,比如6、10、14……等式左右均能构建出这些勾数。

1.3 非显性规律

可能还有其他规律,没有那么直观可以看到。如下面的勾股数:

20212928455333566536778539808948557357769560911096572976992115………\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}20283336394857606569…​21455677805576917292…​2953658589739510997115…​

这些勾股数不符合前面的规律,而且无法直观分辨出其规律,比如33 56 65​和39 80 89就满足下面的勾股数规律:

(3)(3(2n−1))2+((2n−1)2−92)2=((2n−1)2−92+9)2\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(2n−1))2+(2(2n−1)2−9​)2=(2(2n−1)2−9​+9)2(3)

另一组20 21 29、28 45 53、36 77 85勾股数可以满足:

(4)(4(2n−1))2+(2(2n−1)2−82)2=(2(2n−1)2+82)2\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(2n−1))2+(22(2n−1)2−8​)2=(22(2n−1)2+8​)2(4)

如果希望通过这样的方法穷尽勾股数是办不到的,一方面规律比较难观察,另一方面通用公式较多,无法统一。

2. 完全公式

目前有一些不同的方案可以求出勾股数的完全公式,下面主要介绍一种。

在上图中,3个任意半径的圆相互外切,其圆心相连构成的三角形为直角三角形,并且三边长分别为两两半径之和,分别为a+ba+ba+b、b+nb+nb+n、a+na+na+n。其中a、b均为正整数,且a>ba>ba>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

反求nnn,得n=ab+b2a−bn=\frac{ab+b^{2} }{a-b}n=a−bab+b2​,将nnn带回勾股定理,并进行化简:

(5)(a2−b2)2+(2ab)2=(a2+b2)2\left ( a^{2}- b^{2} \right ) ^{2} +\left ( 2ab \right ) ^{2} =\left ( a^{2} + b^{2} \right ) ^{2} \tag{5}

(a2−b2)2+(2ab)2=(a2+b2)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)