生成毕达哥拉斯三元组的最佳方法是什么?

当你只检查a和b的所有组合然后检查c的平方根是否为整数,但是那个代码真的很慢,然后我尝试使用Euclid的公式时,我尝试了这个简单的代码

a = d*(n^2 - m^2) b = 2*n*m*d c = d*(n^2 + m^2) 

我写了一个代码,你首先找到n

 trunc(sqrt(max_value)) //this is in pascal 

然后你检查0 <m <n的每个组合,但我得到重复的结果,如果n是7,m是5,d是1,n是6,m是1,d是2。 在这两种情况下,你得到24,70和74.那么什么是计算毕达哥拉斯三元组数量的快速方法,我似乎无法找到方法,如果我将所有结果添加到数组,然后检查重复的数组,它只需要太多的时间…如果有人可以帮助我的代码,它可以是pascal,c或python,我可以理解所有…

我很好奇所以我决定尝试这个。 我发现这个算法很容易在Python中实现并且工作得非常快:

 import math def pythagorean_triples(n): a, b, c = 1, 3, 0 while c < n: a_ = (a * b) + ac = math.sqrt(a_**2 + b**2) if c == int(c): yield b, a_, int(c) a += 1 b += 2 if __name__ == '__main__': import sys for pt in pythagorean_triples(int(sys.argv[1])): print(pt) 

通过将该脚本复制到pythagorean_triples.py并运行python3 pythagorean_triples.py n尝试它,其中n是您希望它生成的最大c 。 (如果你愿意的话,你可以使用以后的Python2。)

毕达哥拉斯三重奏的维基百科页面给了我们一个提示:

Euclid公式生成的三元组是原始的,当且仅当m和n是互质并且m – n是奇数时。 如果m和n都是奇数,则a,b和c将是偶数,因此三元组将不是原始的; 然而,如果m和n是互质的,则将a,b和c除以2将产生原始三元组

如果你将m和n限制为互质数并强制m – n为奇数,那么你将无法生成所有原始的毕达哥拉斯三元组。 从这一点开始,你应该能够将这些独特的三元组乘以d的因子来唯一地生成所有三元组。

在你的例子中,允许n = 7和m = 5是问题,因为它们的差异是均匀的并且它们生成的三元组不是原始的(你可以将所有边除以2得到更小的三元组)

这是我的解决方案:

 import math def pythagoreanTriplet(n): for b in range(n): for a in range(1, b): c = math.sqrt( a * a + b * b) if c % 1 == 0: print (a, b, int(c)) pythagoreanTriplet(12)