埃拉托色尼筛选法求素数

埃拉托色尼筛选法求素数

列出大于等于2的自然数;2,3,4,5,6,7,8,9,10,11,…
取第一个数2,删掉所有2的倍数;2,3,5,7,9,11,13,14,15,…
取下一个数3,删掉所有3的倍数;3,5,7,11,13,17,19,23,…
取下一个数5,……不断筛选下去,就可找出所有素数
2,3,4,5,6,7,8910,11,12,13,141516,17,18
19,202122,23,2425262728,29,30,31,323334
3536,37,383940,41,42,43,444546,47,484950

Python实现

def primes():
    from functools import partial
    
    def num_generator():
        n = 2
        yield 2
        while True:
            n += 1
            yield n

    def not_divisible(mod, n):
        return n % mod != 0

    num_list = num_generator()
    while True:
        num = next(num_list)
        yield num
        not_divisible_n = partial(not_divisible, num)
        num_list = filter(not_divisible_n, num_list)


if __name__ == '__main__':
    for n in primes():
        if n < 50:
            print(n)
        else:
            break

你可能感兴趣的:(埃拉托色尼筛选法求素数)