当你检查a和b的所有组合然后检查c的平方根是否为整数时,我尝试过这个简单的代码,但是那个代码真的很慢,那么我尝试使用Euclid的公式
a = d*(n^2 - m^2)
b = 2*n*m*d
c = d*(n^2 + m^2)
我已经编写了一个代码,您首先使用
找到ntrunc(sqrt(max_value))
//this is in pascal
然后检查0 <0的每个组合。 m&lt; n但我得到重复的结果,如果n是7,m是5,d是1,n是6,m是1,d是2。在这两种情况下,你得到24,70和74.所以什么是计算毕达哥拉斯三元组数量的快速方法,我似乎无法找到方法,如果我将所有结果添加到数组,然后检查重复数组,它只需要太多时间......如果有人可以帮助我使用代码,它可以是pascal,c或python,我可以理解所有...
答案 0 :(得分:2)
我很好奇所以我决定尝试这个。我发现this algorithm很容易在Python中实现并且工作得非常快:
import math
def pythagorean_triples(n):
a, b, c = 1, 3, 0
while c < n:
a_ = (a * b) + a
c = 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。)
答案 1 :(得分:1)
毕达哥拉斯三重奏的维基百科页面给了我们一个提示:
当且仅当m和n是互质并且m - n是奇数时,由Euclid公式生成的三元组是原始的。如果m和n都是奇数,则a,b和c将是偶数,因此三元组将不是原始的;然而,如果m和n是互质的,则将a,b和c除以2将产生原始三元组
如果你将m和n限制为互质数并强制m - n为奇数,你将无法生成所有原始的毕达哥拉斯三元组。从这一点开始,您应该能够将这些独特的三元组乘以d
因子,以唯一地生成所有三元组。
在你的例子中,允许n = 7和m = 5是问题,因为它们的差异是均匀的,并且它们生成的三元组不是原始的(你可以将所有方面除以2来获得更小的三元组)
答案 2 :(得分:0)
这是我的解决方案:
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)