Hubbry Logo
search button
Sign in
Fermat primality test
Fermat primality test
Comunity Hub
History
arrow-down
starMore
arrow-down
bob

Bob

Have a question related to this hub?

bob

Alice

Got something to say related to this hub?
Share it here.

#general is a chat channel to discuss anything related to the hub.
Hubbry Logo
search button
Sign in
Fermat primality test
Community hub for the Wikipedia article
logoWikipedian hub
Welcome to the community hub built on top of the Fermat primality test Wikipedia article. Here, you can discuss, collect, and organize anything related to Fermat primality test. The purpose of the hub is ...
Add your contribution
Fermat primality test

The Fermat primality test is a probabilistic test to determine whether a number is a probable prime.

Concept

[edit]

Fermat's little theorem states that if p is prime and a is not divisible by p, then

If one wants to test whether p is prime, then we can pick random integers a not divisible by p and see whether the congruence holds. If it does not hold for a value of a, then p is composite. This congruence is unlikely to hold for a random a if p is composite.[1] Therefore, if the equality does hold for one or more values of a, then we say that p is probably prime.

However, note that the above congruence holds trivially for , because the congruence relation is compatible with exponentiation. It also holds trivially for if p is odd, for the same reason. That is why one usually chooses a random a in the interval .

Any a such that

when n is composite is known as a Fermat liar. In this case n is called Fermat pseudoprime to base a.

If we do pick an a such that

then a is known as a Fermat witness for the compositeness of n.

Example

[edit]

Suppose we wish to determine whether n = 221 is prime. Randomly pick 1 < a < 220, say a = 38. We check the above congruence and find that it holds:

Either 221 is prime, or 38 is a Fermat liar, so we take another a, say 24:

So 221 is composite and 38 was indeed a Fermat liar. Furthermore, 24 is a Fermat witness for the compositeness of 221.

Algorithm

[edit]

The algorithm can be written as follows:

Inputs: n: a value to test for primality, n>3; k: a parameter that determines the number of times to test for primality
Output: composite if n is composite, otherwise probably prime
Repeat k times:
Pick a randomly in the range [2, n − 2]
If , then return composite
If composite is never returned: return probably prime

The a values 1 and n − 1 are not used as the equality holds for all n and all odd n respectively, hence testing them adds no value.

Complexity

[edit]

Using fast algorithms for modular exponentiation and multiprecision multiplication, the running time of this algorithm is O(k log2n log log n) = Õ(k log2n), where k is the number of times we test a random a, and n is the value we want to test for primality; see Miller–Rabin primality test for details.

Flaw

[edit]

There are infinitely many Fermat pseudoprimes to any given basis a > 1.[1]: Theorem 1  Even worse, there are infinitely many Carmichael numbers.[2] These are numbers for which all values of with are Fermat liars. For these numbers, repeated application of the Fermat primality test performs the same as a simple random search for factors. While Carmichael numbers are substantially rarer than prime numbers (Erdős' upper bound for the number of Carmichael numbers[3] is lower than the prime number function n/log(n)) there are enough of them that Fermat's primality test is not often used in the above form. Instead, other more powerful extensions of the Fermat test, such as Baillie–PSW, Miller–Rabin, and Solovay–Strassen are more commonly used.

In general, if is a composite number that is not a Carmichael number, then at least half of all

(i.e. )

are Fermat witnesses. For proof of this, let be a Fermat witness and , , ..., be Fermat liars. Then

and so all for are Fermat witnesses.

Corollaries

[edit]

Analogous to the Lucas–Lehmer residue, is called the Fermet residue of n to base a. There are a few variants that produce different types of residues,[4] most importantly the strong probable prime (SPRP) residue.[5]

If the residue r for n to base a is known, then for any proper divisor k of n, it is possible to perform a quick though weaker primality test on n/k. If n/k is prime, by Fermat's theorem and . As a result , which can be much more efficiently checked for values of k much smaller than n. (This is the method used by the Great Internet Mersenne Prime Search for testing cofactors.)[4] A even weaker form of the test can be conducted with a truncated r mod 2t if storage space is a concern. A similar test can be done on truncated Lucas–Lehmer residues.[6]

Applications

[edit]

As mentioned above, most applications use a Miller–Rabin or Baillie–PSW test for primality. Sometimes a Fermat test (along with some trial division by small primes) is performed first to improve performance. GMP since version 3.0 uses a base-210 Fermat test after trial division and before running Miller–Rabin tests. Libgcrypt uses a similar process with base 2 for the Fermat test, but OpenSSL does not.

In practice with most big number libraries such as GMP, the Fermat test is not noticeably faster than a Miller–Rabin test, and can be slower for many inputs.[7]

As an exception, OpenPFGW uses only the Fermat test for probable prime testing. The program is typically used with multi-thousand digit inputs with a goal of maximum speed with very large inputs. Another well known program that relies only on the Fermat test is PGP where it is only used for testing of self-generated large random values (an open source counterpart, GNU Privacy Guard, uses a Fermat pretest followed by Miller–Rabin tests).

Prime number search projects

[edit]

Internet volunteer computing projects such as Great Internet Mersenne Prime Search (GIMPS) and PrimeGrid use the Fermat primality test because there is an efficient proof scheme (Gerbicz-Li) for modular exponentiation. Selected intermediate results, combined with a verifiable delay function, are used to generate a "proof" file for verifying the authenticity and correctness of the computation, protecting against both hardware error and malicious actors. This proof is hard to forge given a low order assumption. The original form of the verification (Gerbicz-Pietrzak) only worked with n being derivable from powers of 2, such as in the case of Mersenne primes, Mersenne cofactors, and Proth primes; Li's modification generalizes it to any n.[8]

The GIMPS in particular tests Mersenne primes and Mersenne cofactors. The default is to use a = 3 as all Mersenne numbers would pass the test with a = 2.

References

[edit]
  1. ^ a b Carl Pomerance; John L. Selfridge; Samuel S. Wagstaff, Jr. (July 1980). "The pseudoprimes to 25·109" (PDF). Mathematics of Computation. 35 (151): 1003–1026. doi:10.1090/S0025-5718-1980-0572872-7. JSTOR 2006210.
  2. ^ Alford, W. R.; Granville, Andrew; Pomerance, Carl (1994). "There are Infinitely Many Carmichael Numbers" (PDF). Annals of Mathematics. 140 (3): 703–722. doi:10.2307/2118576. JSTOR 2118576.
  3. ^ Paul Erdős (1956). "On pseudoprimes and Carmichael numbers". Publ. Math. Debrecen. 4: 201–206. MR 0079031.
  4. ^ a b "primenet.h". There are (at least) 5 PRP residue types for testing N=(k*b^n+c)/d: (1) Fermat PRP. Calculate a^(N-1) mod N. PRP if result = 1. (2) SPRP variant. Calculate a^((N-1)/2) mod N. PRP if result = +/-1. (3) Type 1 variant,b=2,d=1. Calculate a^(N-c) mod N. PRP if result = a^-(c-1). (4) Type 2 variant,b=2,d=1. Calculate a^((N-c)/2) mod N. PRP if result = +/-a^-((c-1)/2). (5) Cofactor variant. Calculate a^(N*d-1) mod N*d. PRP if result = a^(d-1) mod N.
  5. ^ "The Prime Glossary: strong probable prime". t5k.org.
  6. ^ Gerbicz, Robert (2018-06-22). "Saving tons of PRP-C and (hypotetical) LL-C tests, a new method". www.mersenneforum.org.
  7. ^ Joe Hurd (2003), Verification of the Miller–Rabin Probabilistic Primality Test, p. 2, CiteSeerX 10.1.1.105.3196
  8. ^ Darren Li; Yves Gallot (8 Feb 2023). "An Efficient Modular Exponentiation Proof Scheme". arXiv.