簡體   English   中英

產生勾股三元組的最佳方法是什么?

[英]What is the best way to generate Pythagorean triples?

當您只檢查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) + 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。)

勾股三元組的Wikipedia頁面為我們提供了提示:

當且僅當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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM