N以下のすべての素数をリストする最速の方法【Python 3】

PYTHON3 チュートリアル

Python 3でN以下のすべての素数をリストする最速の方法

素数を効率的にリストすることは、プログラミングや数学において重要な課題です。特に、N以下のすべての素数をリストする際には、計算の効率性が求められます。この記事では、Python 3を使用してこの問題を解決するための最速の方法を探ります。

エラトステネスの篩(ふるい)アルゴリズム

エラトステネスの篩は、古代ギリシャの数学者エラトステネスによって考案された、素数を効率的に列挙するためのアルゴリズムです。このアルゴリズムは、2からNまでの整数のリストを作成し、最小の素数である2から順に、その倍数をリストから削除していくことで、素数のみを残す方法です。

def sieve_of_eratosthenes(n):
    primes = [True] * (n + 1)
    p = 2
    while (p * p <= n):
        if primes[p]:
            for i in range(p * p, n + 1, p):
                primes[i] = False
        p += 1
    return [p for p in range(2, n + 1) if primes[p]]

# 使用例
print(sieve_of_eratosthenes(30))

このコードは、N=30の場合にエラトステネスの篩を使用して素数をリストします。出力は、[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]となります。

アルゴリズムの最適化

エラトステネスの篩は効率的ですが、さらに最適化することが可能です。たとえば、偶数を除外することで計算量を削減できます。次のコードでは、偶数を除外したバージョンを示します。

def optimized_sieve(n):
    if n < 2:
        return []
    size = (n - 1) // 2
    primes = [True] * (size + 1)
    primes[0] = False
    for i in range(1, int(n**0.5) // 2 + 1):
        if primes[i]:
            step = 2 * i + 1
            for j in range(i * (i + 1) * 2, size + 1, step):
                primes[j] = False
    return [2] + [2 * i + 1 for i in range(1, size + 1) if primes[i]]

# 使用例
print(optimized_sieve(30))

この最適化されたコードも同様に、N=30の場合に素数をリストします。出力は同じく、[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]です。

Segmented Sieve(分割篩)アルゴリズム

非常に大きなNに対しては、Segmented Sieve(分割篩)アルゴリズムが有効です。このアルゴリズムは、エラトステネスの篩を小さなセグメントに分割して適用することで、メモリ使用量を削減します。

def segmented_sieve(n):
    import math
    limit = int(math.sqrt(n)) + 1
    primes = sieve_of_eratosthenes(limit)
    low = limit
    high = 2 * limit
    while low < n:
        if high > n:
            high = n
        mark = [True] * (high - low + 1)
        for prime in primes:
            low_limit = max(prime * prime, (low + prime - 1) // prime * prime)
            for j in range(low_limit, high + 1, prime):
                mark[j - low] = False
        for i in range(low, high + 1):
            if mark[i - low]:
                primes.append(i)
        low = low + limit
        high = high + limit
    return primes

# 使用例
print(segmented_sieve(30))

Segmented Sieveは、非常に大きな数に対して効率的に素数をリスト化します。出力は、上記の例と同じく、[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]です。

結論

Python 3でN以下のすべての素数をリストするための最速の方法は、エラトステネスの篩およびその最適化バージョンを使用することです。さらに大規模な問題に対しては、Segmented Sieveアルゴリズムが有効です。これらの方法を使い分けることで、効率的な素数列挙が可能となります。

素数(prime number)とは、1とその数自身以外の約数を持たない正の整数のことです。N以下のすべての素数をリストする最速の方法は、エラトステネスの篩(Sieve of Eratosthenes)アルゴリズムを使用することです。

以下は、Python 3でエラトステネスの篩を用いてN以下のすべての素数をリストするコード例です。

```python
def sieve_of_eratosthenes(n):
prime = [True for i in range(n+1)]
p = 2
while p**2 <= n: if prime[p] == True: for i in range(p**2, n+1, p): prime[i] = False p += 1 prime_numbers = [p for p in range(2, n+1) if prime[p]] return prime_numbers N = 100 prime_list = sieve_of_eratosthenes(N) print(prime_list) ``` このコードは、N以下のすべての素数をリストする効率的な方法を提供します。エラトステネスの篩は、重複する計算を避けることで高速に素数を見つけることができるアルゴリズムです。

購読
通知
0 Comments
Inline Feedbacks
View all comments