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
## If the label is already taken then we have a problem.
if step.label in me._steps:
- raise ValueError('duplicate label `%s\'' % step.label)
+ raise ExpectedError('duplicate label `%s\'' % step.label)
## Store the proof step.
me._pmap[step.p] = step.label
## 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]''',
+ 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()
that the number was chosen maliciously,
and the worst-case
.IR n /4
-bound is the best one can do.
+bound is the best one can do using the Rabin\(enMiller test.
For large candidates,
this is inconveniently slow.
(Also, many implementations incorrectly use
a number of iterations suitable for randomly chosen primes
for testing candidates of unknown provenance.)
.PP
-The
+There
+.I are
+stronger probabilistic tests.
+A combination of Rabin\(enMiller and
+Grantham's Frobenius test
+is known as the
+Baillie\(enPSW test
+(after Baillie, Pomerance, Selfridge, and Wagstaff);
+there are
+.I no
+known composites which pass this test,
+nor is it known how to construct any.
+On the other hand, it's been conjectured that
+infinitely many Baillie\(enPSW pseudoprimes exist.
+While it may be reasonable to assume
+the strength of the Baillie\(enPSW test,
+it must be borne in mind that this
+.I does
+constitute a security assumption.
+.PP
+By contrast,the
.B pock
program will generate prime numbers
of sizes suitable for use in cryptography,
in
.RB ( Z /\fIp Z )\*(ss\(**\*(se
divides
-.I p
+.I n
\-
1.
Consider some prime
From
.BR 4 ,
we have
-.IR t \*(ss q \*(se
+.I t
\*(/=
1
(mod
and,
from
.BR 1 ,
-the
-.I q
-are distinct,
+these primes are distinct,
we deduce that
.I Q
divides
.RI # E\*(usp\*(ue |
\(<=
.RI 2\*(sr p ,
+so, in particular,
+.RI # E\*(usp\*(ue
+\-
+.I p
+\- 1
+\(<=
+.RI 2\*(sr p ,
whence
.I p
+ 1 +