algorithms.c: Add bindings for STROBE.
[catacomb-python] / pock
diff --git a/pock b/pock
index cb49996..5d7cc50 100644 (file)
--- a/pock
+++ b/pock
@@ -27,7 +27,7 @@
 ###--------------------------------------------------------------------------
 ### Imported modules.
 
-from sys import argv, stdin, stdout, stderr
+import sys as SYS; from sys import argv, stdin, stdout, stderr
 import os as OS
 import itertools as I
 import math as M
@@ -35,9 +35,17 @@ import optparse as OP
 
 import catacomb as C
 
+if SYS.version_info >= (3,):
+  xrange = range
+  range = lambda *args: list(xrange(*args))
+
 ###--------------------------------------------------------------------------
 ### 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 +53,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 +222,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,8 +242,8 @@ 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 = sievesz*[0]
 
@@ -279,7 +285,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 +609,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 +721,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 +902,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 +1011,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 +1066,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 --------------------------------------------------