指定した範囲内のすべての素数を出力するPythonプログラム
この記事では、以下の問題文に対する解決方法について学んでいきます。
問題文
ある区間が与えられたとき、その範囲内に含まれるすべての素数を求めて出力する必要があります。
ここでは、素数の基本的な定義に基づいた全探索(ブルートフォース)によるアプローチを紹介します。素数とは、「1とその数自身のみを約数として持ち、それ以外の数を約数に持たない自然数」のことです。
この定義に基づき、各数値が素数の条件を満たしているかどうかを判定し、条件が真(True)と評価されるたびに出力処理を行います。
それでは、実際の実装例を見ていきましょう。
実装例
start = 1
end = 37
for val in range(start, end + 1):
# valが2からval-1までのいずれかの数で
# 割り切れる場合、それは素数ではない
if val > 1:
for n in range(2, val):
if (val % n) == 0:
break
else:
print(val)
出力結果
2 3 5 7 11 13 17 19 23 29 31 37
コードの解説
このプログラムの動作を順番に見ていきます。
- range(start, end + 1):startからendまでのすべての整数を順に取り出します。end + 1としているのは、range関数の終端が排他的(end自体を含まない)であるためです。
- if val > 1:1は素数ではないため、1より大きい数値のみを判定対象とします。
- for n in range(2, val):2からval-1までのすべての数で割り切れるかどうかを確認します。
- break:途中で割り切れる数が見つかった時点で、その数は素数ではないためループを抜けます。
- else節:forループがbreakされずに最後まで完了した場合(=どの数でも割り切れなかった場合)のみprint(val)が実行されます。これはPython特有の「for-else」構文です。
なお、上記のコードで使用されている変数はすべてローカルスコープ内で宣言されており、それぞれの参照関係は図のようになっています。
計算量について
この方法はシンプルで理解しやすい反面、計算量はO(n²)となり、大きな範囲を扱う場合は非効率になります。より高速に素数を列挙したい場合は、エラトステネスのふるいなどのアルゴリズムを使用することをおすすめします。
まとめ
この記事では、指定した区間内のすべての素数を出力する方法について学びました。素数の定義に基づくシンプルな全探索のアプローチは、プログラミングの基礎を理解するのに非常に適した題材です。ぜひ自分でもコードを書いて、動作を確認してみてください。
-
Pythonで与えられた数の素因数をすべて効率的に出力するプログラムの作成方法
本記事では、与えられた整数の素因数(そいんすう)をすべて効率的に求めて出力するPythonプログラムについて詳しく解説します。 問題文 ある整数 n が与えられたとき、その数を構成するすべての素因数を見つけて出力することです。 例えば 200 の場合、200 = 2 × 2 × 2 × 5 × 5 と分解できるため、出力は「2, 2, 2, 5, 5」となります。 効率的なアプローチとは 2からnまですべての数で割り切れるかを順番に確認する素朴な方法では、計算量が O(n) かかり非効率です。そこで、次の3つの性質を利用することで、計算量を O(√n) まで削減できます。 まず2で割れるだけ
-
指定された文字列のすべての順列を出力するPythonプログラム
本記事では、以下の問題に対する解決策について詳しく学んでいきます。 問題文 1つの文字列が与えられたとき、その文字列から作成できるすべての順列(並べ替えの組み合わせ)を表示する必要があります。 それでは、以下の実装例で具体的な解決策を見ていきましょう。 実装例 # リストを文字列に変換 def toString(List): return .join(List) # 順列の生成 def permute(a, l, r): if l == r: print(toString(a)) else: for i in range(l, r +