#!/usr/local/cpython-3.6/bin/python # pylint: disable=superfluous-parens # superfluous-parens: Parentheses are good for clarity and portabilty ''' Compute a list of primes below some arbitrary threshold. This borrows from a sieve found on stackoverflow. However, the bits_mod stuff is all DRS'. ''' import re import sys import math import numpy def sieve(max_number): '''Generate all primes less than max_number''' sys.stderr.write('Creating bit array\n') # This is a boolean type, but apparently it is implemented as an array of bytes, not an array of bits... bit_set = numpy.ones(max_number, dtype=numpy.bool_) #sys.stderr.write('Marking all bits\n') #for bitno in xrange(max_number): # bit_set.mark(bitno) #bit_set[0] = bit_set[1] = False bit_set[0] = False bit_set[1] = False sys.stderr.write('Clearing multiples of 2\n') for composite in range(4, max_number, 2): bit_set[composite] = False for candidate_prime in range(3, int(math.sqrt(max_number)) + 2, 2): if bit_set[candidate_prime]: sys.stderr.write('Clearing multiples of %d\n' % candidate_prime) for multiple_of_prime in range(candidate_prime ** 2, max_number, candidate_prime * 2): bit_set[multiple_of_prime] = False if max_number >= 2: yield 2 for number in range(3, max_number, 2): if bit_set[number]: yield number def main(): '''Main function''' if sys.argv[1:]: max_number = int(re.sub(',', '', sys.argv[1])) else: max_number = 100 for prime in sieve(max_number): print(prime) main()