25

Pythonで素数を(順番に)列挙できるライブラリ関数はありますか?

私はこの質問を見つけました。Nより下のすべての素数をリストする最も速い方法ですが、自分の素数をロールするよりも、他の誰かの信頼できるライブラリを使用したいと思います。喜んでやりますimport math; for n in math.primes:

4

5 に答える 5

17

gmpy2ライブラリには next_prime() 関数がありますこの単純な関数は、素数の無限の供給を提供するジェネレーターを作成します。

import gmpy2

def primes():
    n = 2
    while True:
        yield n
        n = gmpy2.next_prime(n)

素数を繰り返し検索する場合は、合理的な制限 (1,000,000 など) を下回るすべての素数のテーブルを作成して再利用する方が高速です。gmpy2 とエラトステネスの篩を使用して素数の表を作成する別の例を次に示します。primes2() は最初にテーブルから素数を返し、次に next_prime() を使用します。

import gmpy2

def primes2(table=None):

    def sieve(limit):
        sieve_limit = gmpy2.isqrt(limit) + 1
        limit += 1
        bitmap = gmpy2.xmpz(3)
        bitmap[4 : limit : 2] = -1
        for p in bitmap.iter_clear(3, sieve_limit):
            bitmap[p*p : limit : p+p] = -1
        return bitmap

    table_limit=1000000
    if table is None:
        table = sieve(table_limit)

    for n in table.iter_clear(2, table_limit):
        yield n

    n = table_limit
    while True:
        n = gmpy2.next_prime(n)
        yield n

ニーズに合わせて table_limit を調整できます。値を大きくすると、より多くのメモリが必要になり、primes() の最初の呼び出しの起動時間が長くなりますが、呼び出しを繰り返すと速くなります。

注: 私は gmpy2 のメンテナーです。

于 2012-11-11T03:09:27.577 に答える