Fermats primtalstest

Från testwiki
Version från den 4 juli 2023 kl. 10.29 av imported>Harka (puts)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

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 är ett primtal och om a inte är delbart med p så gäller att:

ap11(modp)

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

Observera dock att för ap11(modp) gäller kongruensen trivialt. Det gäller också trivialt om p är udda och a1(modp). Av just denna anledning väljer man vanligtvis ett tal a i intervallet 1<a<p1.

För alla tal a så att:

an11(modn)

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

an1≢1(modn)

då är 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 i intervallet 1<a<220, låt oss säga 38. Vi kontrollerar ovanstående likhet och som om det håller:

an1=382201(mod221)

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

an1=2422081≢1(mod221)

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

Källor

Externa länkar