Fermatův test prvočíselnosti

Z testwiki
Skočit na navigaci Skočit na vyhledávání

Fermatův test prvočíselnosti se používá k určení, zda je dané číslo prvočíslo nebo číslo složené. Patří mezi pravděpodobnostní testy prvočíselnosti a je založený na malé Fermatově větě.

Popis

Fermatův test nepatří mezi typické pravděpodobnostní testy. Jednoznačně nerozliší prvočísla od čísel složených (to jsou tzv. Carmichaelova čísla), proto je často označován jako test složenosti.[1]

Na základě malé Fermatovy věty, je-li n prvočíslo a a není jeho násobek platí an11(modn), nebo lze také říci, že an11 je dělitelné číslem n. Po použití obrácené implikace tohoto tvrzení je zřejmé, že existuje-li a{1,2,...,n1} takové, že n nedělí an11, pak musí být n číslo složené.[2]

Příklad: Při zvolení a=2;n=9; 281=255, číslo 9 není dělitelem čísla 255 nebo

a=2;n=21; 2201=1048575, také 21 nedělí číslo 1048575. Fermatův test potvrdil složenost čísla pro a=2.

n je složené číslo

Pro složené číslo n a přirozené číslo a, platí:

  • an1≢1(modn) – číslo a se nazývá Fermatův svědek složenosti čísla n
  • an11(modn) – číslo n se nazývá pseudoprvočíslo vzhledem k bázi a.[2][1]

Zobecnění

Je-li n prvočíslo (a{1,2,...,n1}:an11(modn)) nebo a{1,2,...,n1}:an1≢1(modn)n není prvočíslo

Příklady

Šablona:Viz též Zadání1: n=5 a platí pro a=1;151=14=1, a=2;251=24=16 atd.

141(mod5)

16=241(mod5)

81=341(mod5)

441(mod5) n=5 je prvočíslo.

Zadání2: n=15; a=2;121=1

1141(mod15)

2144(mod15) kongruence není rovna 1, proto číslo 15 není prvočíslo a číslo 4 je svědek složenosti.[3]

Test pro velká čísla

Pro „velká“ čísla je časově náročné používat Fermatův test pro všechna čísla n.

Zadání3: Je číslo n=21 prvočíslo? Lze vybrat náhodná čísla a={8,13,3}.

a=8820821064101101(mod21) 21 může být prvočíslo,

a=13132013210169101101(mod21) 21 může být prvočíslo,

a=3320910815(3)5(3).819(mod21) 21 není prvočíslo!

Algoritmus

Fermatův test prvočíselnosti:

Vstup: liché celé číslo n3, parametr počet čísel t1.

Výstup: odpověď na otázku „je

n

prvočíslo?“

for (i = 1; i <= t; i++)
{
    vyber náhodné int a;
    r = a*(n-1) \mod n; //RSMA 
    if (r !i = 1 ) then
    return ("složené")
    break;
}
return ("prvočíslo")

Pro testování prvočíselnosti velkého čísla se Fermatův test v praxi běžně nepoužívá. Existuje pravděpodobnost, že místo náhodného lichého celého čísla bude vygenerováno pseudoprvočíslo, tedy složené kladné celé číslo, které je chybně určeno jako prvočíslo.[1]

Reference

Související články

Externí odkazy

Šablona:Pahýl Šablona:Autoritní data

Šablona:Portály