#!/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()