自動的に拡張される素数リストの実装

Python素数ジェネレータの実装は結構有名なはず。ProjectEulerのために、ランダムアクセス可能で必要に応じて拡張される素数リストを、素数ジェネレータを利用して作成した。ジェネレータの実装は4 TopCoderより。

from itertools import ifilter
from itertools import count

class Prime(object):
    def __init__(self):
        self.gen = sieve()
        self.primes = []
    def __getitem__(self,index):
        if len(self.primes) <= index:
            shortage = index - len(self.primes) + 1
            new_primes = [p for i,p in zip(range(shortage),self.gen)]
            self.primes.extend(new_primes)
        return self.primes[index]

def sieve():
    g = count(2)
    while True:
        prime = g.next()
        yield prime
        g = ifilter(lambda x,prime=prime: x%prime,g)

使い方はこんな感じ。

primes = Prime()
print primes[1000]
print primes[2000]
for prime in primes:
    print prime

あまり速くはないが、クラスに機能を加えていけば便利そう。