找出一定范围内的勾股数a, b, c(均为正整数),而且三个数互质。
import math
MAX = 100 # 设定范围, a,b,c都在100以内
PN = [] # Pythagorean Number 勾股数
for a in range(2, int(MAX//math.sqrt(2))+1):
for b in range(a+1, int(math.sqrt(MAX*MAX - a*a))+1, 2):
c = int(math.sqrt(s := a*a + b*b))
if c*c == s and math.gcd(a,b) == 1:
PN.append((a, b, c))
for t in PN:
print(t)
print(f"Total = {len(PN)}")
根据 a^2 + b^2 = c^2 且 0 < a,b,c < MAX,a取值由 2 至 MAX//sqrt(2) ,b 取值由 a+1 至 sqrt(MAX^2 - a^2) 即可。
由于a和b奇偶性不同(只能是一奇一偶),所以 b 的步长可设为 2。解释参见:
python求基本勾股数_第一章:勾股数组(1)_weixin_39915694的博客-CSDN博客
在判断是否互质一行 math.gcd(a,b) == 1,如果a,b,c三个正整数能满足勾股定理,只需任何两个数互质,则肯定三个数都互质,所以只需判断其中两个数知否互质则可。证明如下:
如果a, b, c三个正整数中任何两个存在共同因数f (f > 1),例如 a = f·m, b = f·n (m, n为正整数),则(f·m)^2 + (f·n)^2 = c^2,化简得到 m^2 + n^2 = (c/f)^2,等式左侧为正整数,如要保证右侧亦为正整数,则 f 必须是 c 的因数。同理,如果a,c或b,c存在共同因数f,则 f 亦必然是第三个数的因数。反之,a, b, c三个正整数中只要任何两个互质,则必然三个数都互质。
结果:
[3, 4, 5]
[5, 12, 13]
[7, 24, 25]
[8, 15, 17]
[9, 40, 41]
[11, 60, 61]
[12, 35, 37]
[13, 84, 85]
[16, 63, 65]
[20, 21, 29]
[28, 45, 53]
[33, 56, 65]
[36, 77, 85]
[39, 80, 89]
[48, 55, 73]
[65, 72, 97]
Total = 16
MAX = 1000 时,Total = 158;MAX = 10000 时,Total = 1593.