X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/31b5a1fe9593d7d5d1064433378315f8f8a4f450..1e2e275eb4f02a53c28fc7617042dbe72a5ba413:/pock diff --git a/pock b/pock index 3d9f66b..f4aeaa9 100644 --- a/pock +++ b/pock @@ -38,6 +38,10 @@ import catacomb as C ###-------------------------------------------------------------------------- ### Utilities. +def _excval(): + """Return the most recent exception object.""" + return SYS.exc_info()[1] + class ExpectedError (Exception): """ I represent an expected error, which should be reported in a friendly way. @@ -45,12 +49,8 @@ class ExpectedError (Exception): pass def prod(ff, one = 1): - """ - Return ONE times the product of the elements of FF. - - This is not done very efficiently. - """ - return reduce(lambda prod, f: prod*f, ff, one) + """Return ONE times the product of the elements of FF.""" + return C.MPMul().factor(one).factor(ff).done() def parse_label(line): """ @@ -218,8 +218,10 @@ class Sieve (object): ## Figure out the number of bits in a (nonnegative) primitive `int'. We'll ## use a list of these as our sieve. + try: _MAX = SYS.maxint + except AttributeError: _MAX = SYS.maxsize _NBIT = 15 - while type(1 << (_NBIT + 1)) == int: _NBIT += 1 + while 1 << (_NBIT + 1) < _MAX: _NBIT += 1 def __init__(me, limit): """ @@ -236,10 +238,10 @@ class Sieve (object): me.limit = limit ## Calculate the size of sieve we'll need and initialize the bit list. - n = (limit - 2)/2 - sievesz = (n + me._NBIT - 1)/me._NBIT + n = (limit - 2)//2 + sievesz = (n + me._NBIT - 1)//me._NBIT me._sievemax = sievesz*me._NBIT - me._bits = n*[0] + me._bits = sievesz*[0] ## This is standard Sieve of Eratosthenes. For each index i: if ## bit i is clear, then p = 2 i + 3 is prime, so set the bits @@ -279,7 +281,7 @@ def initsieve(sievebits): global SIEVE if SIEVE is not None: raise ValueError('sieve already defined') if sievebits < 6: sievebits = 6 - SIEVE = Sieve(1 << (sievebits + 1)/2) + SIEVE = Sieve(1 << (sievebits + 1)//2) ###-------------------------------------------------------------------------- ### Primality checking. @@ -603,7 +605,7 @@ def check(pp, line): if p.nbits != nb: raise ExpectedError('check failed: nbits(%s) = %d /= %d' % \ (label, p.nbits, nb)) - if VERBOSITY: print ';; %s = %d [%d]' % (label, p, nb) + if VERBOSITY: print(';; %s = %d [%d]' % (label, p, nb)) def setsievebits(pp, line): """ @@ -715,8 +717,9 @@ class PrimeProof (object): if step is not None: me.addstep(step) lastp = step.p - except ExpectedError, e: - raise ExpectedError('%s:%d: %s' % (file.name, lno, e.message)) + except ExpectedError: + raise ExpectedError('%s:%d: %s' % + (file.name, lno, _excval().message)) return lastp ###-------------------------------------------------------------------------- @@ -895,7 +898,7 @@ def gen(nbits, label = None, p = ProgressReporter()): Give it the LABEL, and report progress to P. """ - if SIEVE.limit >> (nbits + 1)/2: g = gen_small + if SIEVE.limit >> (nbits + 1)//2: g = gen_small else: g = gen_pock return g(nbits, label = label, p = p) @@ -1004,20 +1007,20 @@ def __main__(): ## Prepare an option parser. op = OP.OptionParser( usage = '''\ -pock [-qv] CMD ARGS... +pock [-qv] [-s SIEVEBITS] CMD ARGS... gen NBITS ll NBITS NSUBBITS check [FILE]''', description = 'Generate or verify certified prime numbers.') op.add_option('-v', '--verbose', dest = 'verbosity', action = 'count', default = 1, - help = 'Print mysterious runes while looking for prime numbers.') + help = 'print mysterious runes while looking for prime numbers') op.add_option('-q', '--quiet', dest = 'quietude', action = 'count', default = 0, - help = 'be quiet while looking for prime numbers.') + help = 'be quiet while looking for prime numbers') op.add_option('-s', '--sievebits', dest = 'sievebits', type = 'int', default = 32, - help = 'Size (in bits) of largest small prime.') + help = 'size (in bits) of largest small prime') opts, argv = op.parse_args() VERBOSITY = opts.verbosity - opts.quietude p = ProgressReporter() @@ -1059,7 +1062,7 @@ pock [-qv] CMD ARGS... if __name__ == '__main__': prog = OS.path.basename(argv[0]) try: __main__() - except ExpectedError, e: exit('%s: %s' % (prog, e.message)) - except IOError, e: exit('%s: %s' % (prog, e)) + except ExpectedError: exit('%s: %s' % (prog, _excval().message)) + except IOError: exit('%s: %s' % (prog, _excval())) ###----- That's all, folks --------------------------------------------------