Primtalstest
Wikipedia
Ett primtalstest är en algoritm som avgör huruvida ett givet heltal n är ett primtal, det vill säga inte delbart med något heltal förutom 1 och n självt. Att avgöra huruvida ett tal är primt är beräkningsmässigt betydligt enklare än att faktorisera det. Denna skillnad ligger till grund för krypteringsalgoritmer som exempelvis RSA.
Innehåll |
[redigera] Enkla metoder
Den enklaste algoritmen är trial division, som innebär att alla heltal från 2 till genomsöks för att hitta en faktor. Om inget tal i detta intervall delar n, är n ett primtal. Metoden är med dagens datorer effektiv för tal upp till cirka 15 siffror, och kan även användas för att bevisa att större tal sammansatta (inte prima) genom att hitta små faktorer, men är obrukbar för att bevisa att stora tal är prima.
[redigera] Probabilistiska metoder
De snabbaste primtalstesten för stora tal är probabilistiska, vilket innebär att tal som avgörs vara sammansatta garanterat inte är prima men att sammansatta tal felaktigt kan utpekas som prima. Sådana metoder duger inte för att matematiskt bevisa att tal är prima, men är fullt tillräckliga för nästan alla praktiska tillämpningar eftersom sannolikheten för felaktiga svar kan göras astronomiskt låg, exempelvis lägre än sannolikheten för att beräkningens utgång skulle ha påverkats av kosmisk strålning som stört kretsarna i datorn.[1]
Det enklaste och snabbaste probabilistiska primtalstestet är Fermats primtalstest, som dessvärre ger fel svar tämligen ofta och därmed måste kompletteras med någon mer robust metod. Standardtestet är idag Miller-Rabins test, exempelvis använt av många datoralgebrasystem, vars tillförlitlighet kan justeras till godtycklig nivå genom att välja rätt uppsättning primtal som "vittnen" för att n är ett primtal. Om k stycken små primtal väljs som vittnen, är sannolikheten för att Miller-Rabin-testet tar fel högst (1/4)−k, och troligtvis mycket mindre i praktiken. Genom att välja specifika, välstuderade uppsättningar tal kan Miller-Rabin-testet göras fullständigt säkert för all tal mindre än 1016, och är då mycket snabbare än trial division. Miller-Rabins test är en förbättring av Solovay-Strassens test.
[redigera] Deterministiska metoder
Deterministiska test kan rigoröst bevisa att ett tal är primt, men är i regel långsammare än probabilistiska metoder. Det mest använda deterministiska testet är ECPP som använder elliptiska kurvor. Metoden ger inte bara svaret primt/sammansatt utan returnerar även ett formellt bevis vars riktighet kan verifieras utan att upprepa hela beräkningen.
Den optimala tidskomplexiteten för primtalstest är ett välstuderat teoretiskt problem. Upptäckten av AKS-algoritmen år 2002 innebär att deterministiska primtalsbevis bevisligen är möjliga i polynomiell tid. ECPP har även sedan tidigare förmodats ha tidskomplexiteten
- O((lnn)5 + ε)
vilket är en polynomiell tid, men detta har liksom för flera andra primtalstest ännu inte bevisats rigoröst.
[redigera] Specialfall
För tal på specilla former är det ibland möjligt att genomföra deterministiska primtalstest betydligt snabbare än för tal i allmänhet. Detta gäller framför allt tal n för vilka n−1 eller n+1 har en enkel faktorisering. Det främsta exemplet är mersennetal, tal som är ett mindre än en tvåpotens, för vilka Lucas-Lehmers test kan användas. Lucas-Lehmers test har använts för att hitta de största kända primtalen, som har över 9 miljoner siffror.
[redigera] Källor
- ^ Donald Knuth, The Art of Computer Programming vol 2, s. 395