Pythonで非同期処理を用いた素数リストの取得

Q.1

python素数のリストを取得するスクリプトを作成して下さい。 アルゴリズムは、エラトステネスのふるいを使います。 asyncioでタイムアウトを設定し、次の素数を見つけるまでに1秒以上かかったら終了して下さい。

A.1

以下に、エラトステネスのふるいを用いて素数を見つけ、次の素数を見つけるまでに1秒以上かかったら終了するPythonスクリプトを示します。このスクリプトでは、asyncioを用いて非同期処理を行っています。

import asyncio
import time

async def sieve(n):
    primes = []
    sieve = [True] * (n+1)
    for x in range(2, n+1):
        if sieve[x]:
            primes.append(x)
            for i in range(x, n+1, x):
                sieve[i] = False
        await asyncio.sleep(0)  # Switch to other tasks if necessary
    return primes

async def main():
    n = 2
    while True:
        start = time.time()
        try:
            primes = await asyncio.wait_for(sieve(n), timeout=1.0)
            print(f"Primes up to {n}: {primes}")
            n += 1
        except asyncio.TimeoutError:
            print(f"Finding primes up to {n} took too long")
            break

asyncio.run(main())

このスクリプトは、2から始めて、素数を見つけるたびに探索範囲を1つずつ増やしています。エラトステネスのふるいを用いて素数を見つけ、それが1秒以上かかった場合には処理を終了します。

ただし、このスクリプトはあくまで例示であり、実際の使用には向かない可能性があります。エラトステネスのふるいは大きな数に対しては非常に効率が悪く、またこのスクリプトは探索範囲を1つずつ増やしているため、素数が稀になる大きな数になると1秒以上かかる可能性が高くなります。


AIの出力結果には誤った情報や既存と類似した著作物などが含まれる可能性があります The output you created with AI may contain incorrect information or similarity to existing works