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.

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

Zkusmé dělení

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

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

Fermatův test

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

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

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

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

Pépinův test

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

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

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.