![](/img/trans.png)
[英]Is there a better way to find ‘highly composite’ pythagorean triples in Python?
[英]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.