2017-12-07 7 views
2

現在、a = m^2-n^2、b = 2mn、c = m^2 + n^2の式を使用して、数nまでのすべてのprimitve pytagoreanトリプルを検索しようとしています。 2。ここでは、コードは次のとおりです。Python Primitive Pythagoreanトリプルコードが機能しない

def prim(k): 
     primlist=[] 
     for m in range(1,k): 
      for n in range(m+1,k+1): 
       if m**2+n**2>k: 
        break 
       if m%2==1 and n%2==1: 
        break 
       if n**2-m**2==0 or 2*m*n ==0 or n**2+m**2==0: 
        break 

       if gcd(m,n)!=1: 
        break 


       primlist.append([n**2-m**2,2*m*n,n**2+m**2]) 
     return primlist 
    print(prim(100)) 

ここでは、例20,21,29のために、しかし、いくつかが欠落している、すべてのピタゴラスのトリプルを見つけることを期待しています。しかし、我々は唯一の6乾杯別にm & nが大きすぎて最初の条件から

+0

はSO壊れたコードを修正したり宿題を終らないように、特定の質問をすることがあります。あなたの質問はあなたがすでに試したこととあなたのコードがうまくいかない理由で更新してください。 – Vroomfondel

+1

@Vroomfondelこの質問に間違いはありません。営業担当者はMCVEを掲載し、予想される生産量と実際の生産量を適切に記述した。 –

+0

まあ、私は問題を見つけることができないコードを入れて、問題が何であるかを言いました。コードがどこに間違っていたのか分からなければ、疑問を投げかけます。 –

答えて

2

を得る100の下のCと16をtheresの、あなたは単に、内側のループから抜け出すに進みたくありません次の反復。

次のテスト

は、彼らが 真なることはありませんでき mnあなたといるので、完全に不要です。

if n**2-m**2==0 or 2*m*n ==0 or n**2+m**2==0: 

ですので、コードから削除しました。あなたはgcd関数を提供していないか、または標準ライブラリから1つをインポートしたので、私は自分自身を提供しました。

def gcd(a, b): 
    ''' Greatest common divisor of a & b ''' 
    while b: 
     a, b = b, a % b 
    return a 

def prim(k): 
    primlist=[] 
    for m in range(1,k): 
     for n in range(m+1,k+1): 
      if m**2 + n**2 > k: 
       break 
      if m%2==1 and n%2==1: 
       continue 
      if gcd(m,n)!=1: 
       continue 

      primlist.append([n**2 - m**2, 2*m*n, n**2 + m**2]) 
    return primlist 

print(prim(100)) 

出力

[[3, 4, 5], [15, 8, 17], [35, 12, 37], [63, 16, 65], [5, 12, 13], [21, 20, 29], [45, 28, 53], [77, 36, 85], [7, 24, 25], [55, 48, 73], [9, 40, 41], [33, 56, 65], [65, 72, 97], [11, 60, 61], [39, 80, 89], [13, 84, 85]] 

FWIWは、ここにそのコードを書くためのより効率的な(そして少しPython的)な方法です。リストを作成するのではなく、ジェネレータを作成します。そうすれば、トリプルを印刷したり消費したりすることができます。もちろん、list(prim(100))のようにリストに集めることも簡単です。

def gcd(a, b): 
    ''' Greatest common divisor of a & b ''' 
    while b: 
     a, b = b, a % b 
    return a 

def prim(k): 
    for m in range(1, k): 
     for n in range(m+1, k+1): 
      m2, n2 = m * m, n * n 
      if m2 + n2 > k: 
       break 
      if m % 2 and n % 2: 
       continue 
      if gcd(m, n) > 1: 
       continue 

      yield n2 - m2, 2*m*n, n2 + m2 

for i, t in enumerate(prim(100), 1): 
    print(i, t) 

出力

1 (3, 4, 5) 
2 (15, 8, 17) 
3 (35, 12, 37) 
4 (63, 16, 65) 
5 (5, 12, 13) 
6 (21, 20, 29) 
7 (45, 28, 53) 
8 (77, 36, 85) 
9 (7, 24, 25) 
10 (55, 48, 73) 
11 (9, 40, 41) 
12 (33, 56, 65) 
13 (65, 72, 97) 
14 (11, 60, 61) 
15 (39, 80, 89) 
16 (13, 84, 85) 
関連する問題