1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonでエラトステネスの篩を実装してみた

Last updated at Posted at 2020-02-29

pythonとアルゴリズムの勉強かねがね、素数判定器「エラトステネスの篩」版を実装してみました。

↑だと14~15桁までの数値が素数かどうか1秒以内で判定できるのですが、複数値の素数確認をする場合はいちいち割り算をし直すため処理時間がかさんでしまいます。

AtCoder Beginner Contest 084
D - 2017-like Number
https://atcoder.jp/contests/abc084/tasks/abc084_d

こちらの過去問では「要求を満たす素数の数」が求められるため、「要求範囲内にある素数を導出」という用途のロジックを作成した…というのが今回の実装です。

10 ** 5までの素数を0.3~0.4秒程度で導出できましたので、とりあえず満足です。

※指定値がnp.arrayの対象外になっていたので修正しました。

sieve_of_eratosthenes.py
import datetime
import numpy as np

def sieve_of_eratosthenes(numbers):
    """指定された値までの素数を導出する関数.
    戻り値:
    素数のリスト
    """
    # 2から指定値までのndarrayを作成
    checker_np = np.array(range(2,numbers + 1))

    # 素数を格納するリストを作成
    prime_list = []

    while len(checker_np) != 0:
        # リストの先頭(この値は必ず素数)を抽出
        _x = checker_np[0]
        # 取り出した値を素数リストに格納
        prime_list.append(_x)
        # ndarrayの中身のうち、抽出した素数で割り切れる値を除外
        # ※先頭の値が必ず最小の素数になる
        checker_np = np.delete(checker_np, np.where(checker_np % _x == 0))

    return prime_list

# 入力値
numbers = 10 ** 5

start_time = datetime.datetime.now()
print(sieve_of_eratosthenes(numbers))
end_time = datetime.datetime.now()

# 処理速度を確認
print(end_time - start_time)
1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?