Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Fermat primality test
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{Short description|Probabilistic primality test}} {{for|the test for determining whether a Fermat number is prime|Pépin's test}} The '''Fermat primality test''' is a [[randomized algorithm|probabilistic]] test to determine whether a number is a [[probable prime]]. ==Concept== [[Fermat's little theorem]] states that if ''p'' is prime and ''a'' is not divisible by ''p'', then :<math>a^{p-1} \equiv 1 \pmod{p}.</math> 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.<ref name="PSW">{{cite journal |author1 = Carl Pomerance |author-link1 = Carl Pomerance |author2 = John L. Selfridge |author-link2 = John L. Selfridge |author3 = Samuel S. Wagstaff, Jr. |author-link3 = Samuel S. Wagstaff, Jr. |title=The pseudoprimes to 25·10<sup>9</sup> |journal=Mathematics of Computation |date=July 1980 |volume=35 |issue=151 |pages=1003–1026 |url=//math.dartmouth.edu/~carlp/PDF/paper25.pdf |jstor=2006210 |doi=10.1090/S0025-5718-1980-0572872-7 |doi-access=free }}</ref> Therefore, if the equality does hold for one or more values of ''a'', then we say that ''p'' is [[probable prime|probably prime]]. However, note that the above congruence holds trivially for <math>a \equiv 1 \pmod{p}</math>, because the congruence relation is [[Modular arithmetic#Basic properties|compatible with exponentiation]]. It also holds trivially for <math>a \equiv -1 \pmod{p}</math> if ''p'' is odd, for the same reason. That is why one usually chooses a random ''a'' in the interval <math>1 < a < p - 1</math>. Any ''a'' such that :<math>a^{n-1} \equiv 1 \pmod{n}</math> 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 :<math>a^{n-1} \not\equiv 1 \pmod{n}</math> then ''a'' is known as a ''Fermat witness'' for the compositeness of ''n''. == Example == 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: :<math>a^{n-1} = 38^{220} \equiv 1 \pmod{221}.</math> Either 221 is prime, or 38 is a Fermat liar, so we take another ''a'', say 24: :<math>a^{n-1} = 24^{220} \equiv 81 \not\equiv 1 \pmod{221}.</math> So 221 is composite and 38 was indeed a Fermat liar. Furthermore, 24 is a Fermat witness for the compositeness of 221. ==Algorithm== 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 <math>a^{n-1}\not\equiv1 \pmod n</math>, 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 === Using fast algorithms for [[modular exponentiation]] and multiprecision multiplication, the running time of this algorithm is {{math|[[Big O notation|O]](''k'' log<sup>2</sup>''n'' log log ''n'') {{=}} [[Big O notation#Extensions to the Bachmann–Landau notations|Õ]](''k'' log<sup>2</sup>''n'')}}, 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#Complexity|Miller–Rabin primality test]] for details. ==Flaw== There are infinitely many [[Fermat pseudoprime]]s to any given basis ''a'' > 1.{{r|PSW|p=Theorem 1}} Even worse, there are infinitely many [[Carmichael number]]s.<ref name="Alford1994">{{cite journal |last1=Alford |first1=W. R. |author-link=W. R. (Red) Alford |last2=Granville |first2=Andrew |author-link2=Andrew Granville |last3=Pomerance |first3=Carl |author-link3=Carl Pomerance |year=1994 |title=There are Infinitely Many Carmichael Numbers |journal=[[Annals of Mathematics]] |doi=10.2307/2118576 |volume=140 |issue=3 |pages=703–722 |url=http://www.math.dartmouth.edu/~carlp/PDF/paper95.pdf |jstor=2118576 }}</ref> These are numbers <math>n</math> for which <em>all</em> values of <math>a</math> with <math>\operatorname{gcd}(a, n) = 1</math> 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<ref> {{cite journal |author = Paul Erdős |date=1956 |title=On pseudoprimes and Carmichael numbers |journal=Publ. Math. Debrecen |volume=4 |pages=201–206|author-link=Paul Erdős|mr=0079031 }}</ref> is lower than the [[Prime number theorem|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 primality test|Baillie–PSW]], [[Miller–Rabin primality test|Miller–Rabin]], and [[Solovay–Strassen primality test|Solovay–Strassen]] are more commonly used. In general, if <math>n</math> is a composite number that is not a Carmichael number, then at least half of all :<math>a\in(\mathbb{Z}/n\mathbb{Z})^*</math> (i.e. <math>\operatorname{gcd}(a,n)=1</math>) are Fermat witnesses. For proof of this, let <math>a</math> be a Fermat witness and <math>a_1</math>, <math>a_2</math>, ..., <math>a_s</math> be Fermat liars. Then :<math>(a\cdot a_i)^{n-1} \equiv a^{n-1}\cdot a_i^{n-1} \equiv a^{n-1} \not\equiv 1\pmod{n}</math> and so all <math>a \cdot a_i</math> for <math>i = 1, 2, ..., s</math> are Fermat witnesses. ==Applications== As mentioned above, most applications use a [[Miller–Rabin primality test|Miller–Rabin]] or [[Baillie–PSW primality test|Baillie–PSW]] test for primality. Sometimes a Fermat test (along with some trial division by small primes) is performed first to improve performance. [[GNU Multiple Precision Arithmetic Library|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.<ref>{{citation|author=Joe Hurd|date=2003|title=Verification of the Miller–Rabin Probabilistic Primality Test|page=2|citeseerx=10.1.1.105.3196}}</ref> 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 [[Pretty Good Privacy|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). ==References== {{reflist}} * {{cite book |author=[[Thomas H. Cormen]], [[Charles E. Leiserson]], [[Ronald L. Rivest]], [[Clifford Stein]] |title=Introduction to Algorithms |edition=Second |publisher=MIT Press; McGraw-Hill |year=2001 |isbn=0-262-03293-7 |page=889–890 |chapter=Section 31.8: Primality testing|title-link=Introduction to Algorithms }} {{Pierre de Fermat}} {{number theoretic algorithms}} [[Category:Primality tests]] [[Category:Modular arithmetic]]
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Citation
(
edit
)
Template:Cite book
(
edit
)
Template:Cite journal
(
edit
)
Template:For
(
edit
)
Template:Math
(
edit
)
Template:Number theoretic algorithms
(
edit
)
Template:Pierre de Fermat
(
edit
)
Template:R
(
edit
)
Template:Reflist
(
edit
)
Template:Short description
(
edit
)