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

时间:2014-04-02 19:30:30

标签: python c math pascal

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

3 个答案:

答案 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)