[解決済み] Project Euler 5 in Python - どうすれば解を最適化できますか?
質問内容
最近、PythonでProject Eulerの問題に取り組んでいます。私はPythonにかなり慣れておらず、プログラマーとしてもまだ少し経験が浅いです。
いずれにせよ、問題番号5の解答をコーディングする際に、スピードに関する問題にぶつかった。その問題とは
2520は、1から10までの数字で余すことなく割り切れる最小の数字である。1から20までのすべての数で均等に割り切れる最小の正の数は何ですか?"
いくつか調べてみましたが、特にPythonに関連するこの問題についてのものは見つかりませんでした。完成したスクリプトもありましたが、できれば他の人のコードを丸ごと見るのは避けて、自分のコードを改善したいのです。
私が書いたコードは、2520の例と1から10の範囲で正常に実行され、質問で動作するように直接修正することができるはずです。しかし、それを実行すると、私は答えを得ることはできません。おそらく、非常に大きな数字であり、コードの速度が十分でないのでしょう。現在チェックされている数を印刷すると、これを裏付けているようで、数百万に達しても答えが得られません。
現在の実装では、以下のようなコードになっています。
rangemax = 20
def div_check(n):
for i in xrange(11,rangemax+1):
if n % i == 0:
continue
else:
return False
return True
if __name__ == '__main__':
num = 2
while not div_check(num):
print num
num += 2
print num
私はすでに、スピードアップに役立つと思われる変更をいくつか加えています。1つ目は、ある数字が1から20までのすべての数字で割り切れるためには、偶数でなければなりません。(これは調べていませんが、理にかなっていると思います。)
しかし、このコードではまだ十分な速度が得られません。このコードをより速く実行するために、プログラム的または数学的にどのような最適化が可能でしょうか?
お分かりになる方、よろしくお願いします。
解決方法は?
Michael Miorさんやpokeさんのアドバイスを受けて、解決策を書きました。 高速化するためにちょっとした工夫をしてみました。
比較的短い数字のリストをテストする必要があるので、それなら、繰り返し
xrange()
または
range()
.
また、単に数字を並べるだけではうまくいきませんが
[1, 2, 3, ..., 20]
をリストに入れれば、少し考えて、数字を抜き出すことができます。
1を取り出せばいいんだよ。 すべての整数は1によって均等に割り切れる。
20を残すなら、2を残す必要はない。 20で割り切れる整数はすべて2で割り切れる(ただし、逆は真でない場合がある)。 そこで、20を残し、2と4と5を取り除く。 この作業を繰り返すと、試すべき数字のリストがずっと少なくなる。
Michael Miorが提案したように、20から始めて、20ずつ数を増やしていきます。 の内部でジェネレーター式を使用します。
all()
というのは、ポークが提案したとおりです。
の代わりに
while
ループを使用し
for
ループに
xrange()
この方が若干速いと思います。
その結果
check_list = [11, 13, 14, 16, 17, 18, 19, 20]
def find_solution(step):
for num in xrange(step, 999999999, step):
if all(num % n == 0 for n in check_list):
return num
return None
if __name__ == '__main__':
solution = find_solution(20)
if solution is None:
print "No answer found"
else:
print "found an answer:", solution
私のパソコンでは、9秒以内に答えが見つかります。
EDIT David Zaslavskyのアドバイスに従えば、2520からループを始めて、2520ずつステップを踏んでいけばいいことがわかります。 そうすると、私のコンピュータでは、約10分の1秒で正しい答えが得られます。
を作りました。
find_solution()
は引数を取ります。 を呼び出してみてください。
find_solution(2520)
.
関連
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Pythonコンテナのための組み込み汎用関数操作
-
Python百行で韓服サークルの画像クロールを実現する
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み] データ型が理解できない
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] 3つ以上の数値の最小公倍数