Fermats primtalstest

Fermats primtalstest är ett probabilistiskt test för att avgöra om ett tal är ett misstänkt primtal.

Essens

Fermats lilla sats säger att om p {\textstyle p} är ett primtal och om a {\textstyle a} inte är delbart med p {\textstyle p} så gäller att:

a p 1 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

Om man vill testa om p {\textstyle p} är ett primtal så kan man välja ett slumpmässigt heltal a {\textstyle a} som inte delbart med p {\textstyle p} och se om likheten stämmer. Om likheten inte stämmer för ett värde av a {\textstyle a} så är p {\textstyle p} ett sammansatt tal. Det är osannolikt att denna kongruens kommer att hålla för slumpmässiga värden av a {\textstyle a} om p {\textstyle p} är ett sammansatt tal.[1] Man säger därför att p {\textstyle p} är ett misstänkt primtal för ett eller flera värden på a {\textstyle a} om likheten håller.

Observera dock att för a p 1 1 ( mod p ) {\textstyle a^{p-1}\equiv 1{\pmod {p}}} gäller kongruensen trivialt. Det gäller också trivialt om p {\textstyle p} är udda och a 1 ( mod p ) {\textstyle a\equiv -1{\pmod {p}}} . Av just denna anledning väljer man vanligtvis ett tal a {\textstyle a} i intervallet 1 < a < p 1 {\textstyle 1<a<p-1} .

För alla tal a {\textstyle a} så att:

a n 1 1 ( mod n ) {\displaystyle a^{n-1}\equiv 1{\pmod {n}}}

när n {\textstyle n} är ett sammansatt tal så är a {\textstyle a} känd som en Fermatlögnare. I detta fall kallas n {\textstyle n} för ett Fermatpseudoprimtal till basen a {\textstyle a} . Om man istället väljer ett tal a {\textstyle a} så att:

a n 1 1 ( mod n ) {\displaystyle a^{n-1}\not \equiv 1{\pmod {n}}}

då är a {\textstyle a} känd som ett Fermatvittne.

Exempel

Anta att vi vill ta reda på om 221 är ett primtal eller inte. Slumpmässigt välj ett tal a {\textstyle a} i intervallet 1 < a < 220 {\textstyle 1<a<220} , låt oss säga 38. Vi kontrollerar ovanstående likhet och som om det håller:

a n 1 = 38 220 1 ( mod 221 ) {\displaystyle a^{n-1}=38^{220}\equiv 1{\pmod {221}}}

Antingen är 221 ett primtal eller så är 38 en Fermatlögnare. Vi testar igen med ett annat tal a {\textstyle a} , låt oss säga 24:

a n 1 = 24 220 81 1 ( mod 221 ) {\displaystyle a^{n-1}=24^{220}\equiv 81\not \equiv 1{\pmod {221}}}

Så är 221 är garanterat ett sammansatt tal och 38 var en Fermatlögnare.

Programmering

Nedan visas implementeringen av Fermats primtalstest i programmering. Koden använder en exponentialfunktion från modulär exponentiering.[2] I exemplet nedan så används C++ som programmeringsspråk:

bool isPrime(unsigned int n, int k) 
{ 
   if (n <= 1 || n == 4)  return false; 
   if (n <= 3) return true;

   while (k>0) 
   {

       int a = 2 + rand()%(n-4);   
  
       if (gcd(n, a) != 1) 
          return false; 
   
       if (power(a, n-1, n) != 1) 
          return false; 
  
       k--; 
    } 
  
    return true; 
}

Referenser

Allmänna källor

  • Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2001). ”Primality testing” (på engelska). Introduction to Algorithms (2). McGraw-Hill: MIT Press. sid. 889–890. Libris länk. ISBN 0-262-03293-7. OCLC 46792720. Läst 23 juli 2020.

Källor

  1. ^ Pomerance, Carl; Selfridge, John Lewis; Wagstaff, Samuel Standfield (juli 1980). ”The Pseudoprimes to 25·109” (på engelska). Mathematics of Computation (Washington: American Mathematical Society) 35 (151): sid. 1003–1003. doi:10.1090/S0025-5718-1980-0572872-7. JSTOR 2006210. ISSN 0025-5718. OCLC 1173748874. https://www.ams.org/journals/mcom/1980-35-151/S0025-5718-1980-0572872-7/S0025-5718-1980-0572872-7.pdf. Läst 23 juli 2020. 
  2. ^ ”Primality Test | Set 2 (Fermat Method)” (på engelska). GeeksforGeeks. Arkiverad från originalet den 23 juli 2020. https://archive.today/20200723085023/https://www.geeksforgeeks.org/primality-test-set-2-fermet-method/. Läst 23 juli 2020. 

Externa länkar

  • Enkel videoförklaring av Fermats primtalstest på YouTube av Numberphile (engelska)
  • Enkel förklaring av Fermats primtalstest på The Math Less Traveled av Brent Yorgey (engelska)