2017-09-22 4 views
0

フェルマーの最後の定理をテストするpythonアプリケーションを書くことでアルゴリズムを学ぼうとしています。それはa^n + b^n = c^nのすべての組み合わせを繰り返します。a/bが10000で天井を打ち、nが100で天井に当たったとき、私はヒットしませんが、ちょっと楽しかったです。とにかく、細部は本当に重要ではありません。2つのリストから値を追加するときの効率

a + bはaとbが1から10000までのすべての組み合わせを繰り返します。しかし、ここで問題があります:4 + 5は5 + 4とまったく同じです。私のプログラムは2倍の仕事をしていますする必要があります。ミラーリングされた入力をスキップしながらこれらの組み合わせをどのように反復処理できますか?

base_ceiling = 10000 # max values for a and b 
n_ceiling = 100 # max value for power of n 

powers = [] 
for i in range(n_ceiling): 
    jarr = [] 
    for j in range(base_ceiling): 
    jarr.append(j ** i) 
    powers.append(jarr) 

for k in range(3, n_ceiling): 
    for i in range(1, base_ceiling): 
    for j in range(1, base_ceiling): 
     pow_vals = powers[k] 
     a = powers[k][i] 
     b = powers[k][j] 
     c = a + b 
     try: 
     idx = pow_vals.index(c) 
     if idx > -1: 
      print k, ": ", i, j, "=", idx, " results in ", a, b, "=", c 
     except ValueError: 
     continue 
+2

'i'が常に' j'以下で決して大きくないように、最も内側のループを 'for(j、base_ceiling)'に変更します。 'i'が' j'に等しいときは、あなたはまだいくつかの仕事を複製していますが、それは全体の作業の中で無視できる部分です。 – jasonharper

答えて

1

for j in range(i, base_ceiling)と同じくらい簡単です。これは、の代わりに1から開始されるため、よりも小さいものを繰り返しません。 i^n + i^nは決してnの威力にならないので、代わりにi + 1を使用できます。

関連する問題