/usr/share/calc/help/ptest is in apcalc-common 2.12.5.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | NAME
ptest - probabilistic test of primality
SYNOPSIS
ptest(n [,count [,skip]])
TYPES
n integer
count integer with absolute value less than 2^24, defaults to 1
skip integer, defaults to 1
return 0 or 1
DESCRIPTION
In ptest(n, ...) the sign of n is ignored; here we assume n >= 0.
ptest(n, count, skip) always returns 1 if n is prime; equivalently,
if 0 is returned then n is not prime.
If n is even, 1 is returned only if n = 2.
If count >= 0 and n < 2^32, ptest(n,...) essentially calls isprime(n)
and returns 1 only if n is prime.
If count >= 0, n > 2^32, and n is divisible by a prime <= 101, then
ptest(n,...) returns 0.
If count is zero, and none of the above cases have resulted in 0 being
returned, 1 is returned.
In other cases (which includes all cases with count < 0), tests are
made for abs(count) bases b: if n - 1 = 2^s * m where m is odd,
the test for base b of possible primality is passed if b is a
multiple of n or b^m = 1 (mod n) or b^(2^j * m) = n - 1 (mod n) for
some j where 0 <= j < s; integers that pass the test are called
strong probable primes for the base b; composite integers that pass
the test are called strong pseudoprimes for the base b; Since
the test for base b depends on b % n, and bases 0, 1 and n - 1 are
trivial (n is always a strong probable prime for these bases), it
is sufficient to consider 1 < b < n - 1.
The bases for ptest(n, count, skip) are selected as follows:
skip = 0: random in [2, n-2]
skip = 1: successive primes 2, 3, 5, ...
not exceeding min(n, 65536)
otherwise: successive integers skip, skip + 1, ...,
skip+abs(count)-1
In particular, if m > 0, ptest(n, -m, 2) == 1 shows that n is either
prime or a strong pseudoprime for all positive integer bases <= m + 1.
If 1 < b < n - 1, ptest(n, -1, b) == 1 if and only if n is
a strong pseudoprime for the base b.
For the random case (skip = 0), the probability that any one test
with random base b will return 1 if n is composite is always
less than 1/4, so with count = k, the probability is less
than 1/4^k. For most values of n the probability is much
smaller, possible zero.
RUNTIME
If n is composite, ptest(n, 1, skip) is usually faster than
ptest(n, -1, skip), much faster if n is divisible by a small
prime. If n is prime, ptest(n, -1, skip) is usually faster than
ptest(n, 1, skip), possibly much faster if n < 2^32, only slightly
faster if n > 2^32.
If n is a large prime (say 50 or more decimal digits), the runtime
for ptest(n, count, skip) will usually be roughly K * abs(count) *
ln(n)^3 for some constant K. For composite n with
highbit(n) = N, the compositeness is detected quickly if n is
divisible by a small prime and count >= 0; otherwise, if count is
not zero, usually only one test is required to establish
compositeness, so the runtime will probably be about K * N^3. For
some rare values of composite n, high values of count may be
required to establish the compositeness.
If the word-count for n is less than conf("redc2"), REDC algorithms
are used in evaluating ptest(n, count, skip) when small-factor
cases have been eliminated. For small word-counts (say < 10)
this may more than double the speed of evaluation compared with
the standard algorithms.
EXAMPLE
; print ptest(103^3 * 3931, 0), ptest(4294967291,0)
1 1
In the first example, the first argument > 2^32; in the second the
first argument is the largest prime less than 2^32.
; print ptest(121,-1,2), ptest(121,-1,3), ptest(121,-2,2)
0 1 0
121 is the smallest strong pseudoprime to the base 3.
; x = 151 * 751 * 28351
; print x, ptest(x,-4,1), ptest(x,-5,1)
3215031751 1 0
The integer x in this example is the smallest positive integer that is
a strong pseudoprime to each of the first four primes 2, 3, 5, 7, but
not to base 11. The probability that ptest(x,-1,0) will return 1 is
about .23.
; for (i = 0; i < 11; i++) print ptest(91,-1,0),:; print;
0 0 0 1 0 0 0 0 0 0 1
The results for this example depend on the state of the
random number generator; the expectation is that 1 will occur twice.
; a = 24444516448431392447461 * 48889032896862784894921;
; print ptest(a,11,1), ptest(a,12,1), ptest(a,20,2), ptest(a,21,2)
1 0 1 0
These results show that a is a strong pseudoprime for all 11 prime
bases less than or equal to 31, and for all positive integer bases
less than or equal to 21, but not for the bases 37 and 22. The
probability that ptest(a,-1,0) (or ptest(a,1,0)) will return 1 is
about 0.19.
LIMITS
none
LINK LIBRARY
BOOL qprimetest(NUMBER *n, NUMBER *count, NUMBER *skip)
BOOL zprimetest(ZVALUE n, long count, long skip)
SEE ALSO
factor, isprime, lfactor, nextcand, nextprime, prevcand, prevprime,
pfact, pix
## Copyright (C) 1999-2006 Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL. You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
##
## @(#) $Revision: 30.2 $
## @(#) $Id: ptest,v 30.2 2007/09/01 19:53:15 chongo Exp $
## @(#) $Source: /usr/local/src/bin/calc/help/RCS/ptest,v $
##
## Under source code control: 1996/02/25 00:27:43
## File existed as early as: 1996
##
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
|