#!/usr/local/micropython-git-2017-06-16/bin/micropython ''' Compute a list of primes below some arbitrary threshold. This borrows from a sieve found on stackoverflow. However, the bits_mod_mp stuff is all DRS'. ''' from __future__ import print_function import re import sys import math import bits_mod_mp def sieve(max_number): '''Generate all primes less than max_number''' sys.stderr.write('Creating bit array\n') bit_set = bits_mod_mp.Bits(max_number, ones=True) #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.clear(0) bit_set.clear(1) sys.stderr.write('Clearing multiples of 2\n') for composite in range(4, max_number, 2): bit_set.clear(composite) for candidate_prime in range(3, int(math.sqrt(max_number)) + 2, 2): if bit_set.is_true(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.clear(multiple_of_prime) if max_number >= 2: yield 2 for number in range(3, max_number, 2): if bit_set.is_true(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()