Skip to content

Instantly share code, notes, and snippets.

@GrAndSE
Created April 10, 2013 15:03
Show Gist options
  • Select an option

  • Save GrAndSE/5355402 to your computer and use it in GitHub Desktop.

Select an option

Save GrAndSE/5355402 to your computer and use it in GitHub Desktop.
import abc
import collections
class BasePrime(collections.Sequence):
'''Base class for any primes number sequence
'''
__metaclass__ = abc.ABCMeta
class EvklideSieve(BasePrime):
'''Evklide sieve prime numbers sequence
'''
def __init__(self):
self.primes = [2, 3]
self.last_num = 0
self.primes_num = 2
self.start = self.end = self.step = 5
def _generate_primes(self):
'''Get the numbers starting from start with the count based on primes
'''
sieve = range(self.start, self.end)
for prime in self.primes:
# Get the start value for primes striking
start_value = prime ** 2
if start_value > self.end:
break
if start_value < self.start:
num = self.start / prime
if self.start % prime:
num += 1
start_value = num * prime
# Strike out complex
for index in xrange(start_value, self.end, prime):
sieve[index - self.start] = False
# Get the numbers was not striked out
self.primes.extend([number for number in sieve if number])
def __len__(self):
'''Get current length'''
return self.primes_num
def __getitem__(self, number):
'''Get the n-th prime number'''
while self.primes_num < number:
# Get a new step size for prime sieve
self.last_num = self.primes_num
self.primes_num = len(self.primes)
self.last_prime = self.primes[self.primes_num - 1]
self.start = self.end
self.end = self.last_prime ** 2
if self.primes_num > self.last_num:
self.step *= (number - self.primes_num) * 1. / (self.primes_num - self.last_num)
if self.start + self.step < self.end:
self.end = self.start + int(self.step)
else:
self.step = self.end - self.start
# Get new primes
self._generate_primes()
return self.primes[number - 1]
evklide_sieve = EvklideSieve()
print evklide_sieve[100001]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment