Test prvočíselnosti

Test prvočíselnosti je algoritmus z oboru teorie čísel, kterým lze určit, zda je zadané přirozené číslo prvočíslem. Obvykle přitom tuto otázku zodpoví, aniž by přímo našel prvočíselný rozklad (to je považováno za podstatně náročnější úlohu), a často se jedná o pravděpodobnostní algoritmy či algoritmy použitelné jen na určitý druh čísel.

Ukázka Mersennova prvočísla

Kromě algoritmů, které v případě úspěchu prokáží, že je číslo prvočíslem, jsou také algoritmy, které v případě úspěchu prokáží, že se jedná o složené číslo – takové se někdy označují testy složenosti a jejich zřejmě nejznámějším příkladem je oblíbený Millerův-Rabinův test prvočíselnosti.

Testování prvočíselnosti je obecně možné v polynomiálním čase, což bylo prokázáno objevením algoritmu AKS v roce 2002. Jedná se ovšem o asymptotickou složitost, při praktickém použití svou rychlostí silně zaostává a jsou často upřednostňovány jiné algoritmy, byť třeba pravděpodobnostní.

Jednoduché algoritmy editovat

Zkusmé dělení editovat

Koncepčně nejjednodušším algoritmem testujícím prvočíselnost je zkusmé dělení, které postupně zkouší dělit testované číslo možnými děliteli. V závislosti na propracovanosti implementace se může jednat o zkusmé dělení všemi přirozenými čísly menšími než číslo samo, nebo o optimalizované varianty, kdy se zkouší dělit například pouze dvojkou a pak lichými čísly, nebo pouze prvočísly menšími než odmocnina testovaného čísla.

Tento algoritmus má v každém případě asymptoticky exponenciální složitost (je klasickým příkladem algoritmu s pseudopolynomickou časovou složitostí).

Pro otestování prvočíselnosti malého čísla řádově do milionu ale může být jeho optimalizovaná varianta řešením nejrychlejším.

Algoritmy hledání prvočísel editovat

Jako test prvočíselnosti je možné použít i algoritmy, jejichž úkolem je najít všechna prvočísla od 2 do zadaného čísla. Klasickým příkladem je Eratosthenovo síto. Asymptoticky ale má exponenciální časovou složitost a navíc má i vyšší paměťovou náročnost a je celkově poměrně pomalé, neboť řeší daleko obsáhlejší úlohu a pro cílené testování prvočíselnosti náhodných velkých čísel se tedy nehodí.

To platí i pro jeho moderní optimalizované varianty a odnože, například Atkinovo síto.

Obecné pravděpodobnostní algoritmy editovat

Fermatův test editovat

Fermatův test je založen na Malé Fermatově větě, tedy na pravidle, že pro prvočíselné   platí

 

pro všechna  . Pokud se podaří nalézt  , pro které rovnost neplatí, pak   nemůže být prvočíslo. I v případě složeného čísla ale rovnost může platit pro některá   (složené číslo se pak vzhledem k   označuje za Fermatovo pseudoprvočíslo), dokonce existuje nekonečně mnoho takzvaných Carmichaelových čísel, která se pro všechna   chovají vzhledem tomuto testu jako prvočíslo a rovnici splňují. Fermatův test je tedy pravděpodobnostním testem složenosti.

Solovayův-Strassenův test editovat

Solovayův-Strassenův test využívá Eulerovu větu a Jacobiho symbol a to tak, že ověřuje platnost rovnice

 

kterou všechna prvočísla   splňují pro všechna  . Pokud test najde  , které rovnici nesplňuje, našel důkaz, že   je složené číslo. Ovšem i pro složené číslo může být rovnost splněna – říká se mu pak Eulerovo pseudoprvočíslo. Jedná se tedy o pravděpodobnostní test složenosti.

Millerův-Rabinův test editovat

Millerův-Rabinův test podobně jako Fermatův a Solovayův-Strassenův test hledá svědka složenosti, tedy nějaké  , které nesplní rovnice, které by pro prvočíslo platily. V případě Millerova-Rabinova testu je potřeba najít  , že

 

a

  pro všechna  

kde   a   je liché. I Millerův-Rabinův test je pravděpodobnostním testem složenosti.

Specializované algoritmy editovat

Některé algoritmy jsou určeny jen pro čísla určitého tvaru.

Pépinův test editovat

Pépinův test je určen k testování Fermatových čísel. Jedná se o deterministický test, který běží v polynomiálním čase a je jím možno prokázat, že dané číslo je prvočíslem.

Lucasův-Lehmerův test editovat

Lucasův-Lehmerův test je určen k testování Mersennových čísel.