Fermats primtals tester

Tags:    .net

Hej alle,

Jeg sidder med en opgave i programmering på mit studie, der går ud på at lave en funktion der tester om et tal er et primtal og derefter returner true.

Jeg har valgt, at kigge på Fermat og jeg ved godt den er "probabilistic" og derved kun angiver at der mulighed for at et tal er et primtal.

(Se mere her: http://en.wikipedia.org/wiki/Fermat_primality_test )

Jeg er kommet frem til følgende kode:
Fold kodeboks ind/udCSharp kode 


Den falder dog allerede sammen ved 17 og siger det er et sammensat tal. Som jeg har forstået det, så er et Fermat Liar et sammensat tal, eller er det et tal som er et primtal, men som foregives at være sammensat?

Jeg håber i har et forslag. På forhånd tak.



2 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Hej alle,

Jeg sidder med en opgave i programmering på mit studie, der går ud på at lave en funktion der tester om et tal er et primtal og derefter returner true.

Jeg har valgt, at kigge på Fermat og jeg ved godt den er "probabilistic" og derved kun angiver at der mulighed for at et tal er et primtal.

(Se mere her: http://en.wikipedia.org/wiki/Fermat_primality_test )

Jeg er kommet frem til følgende kode:
Fold kodeboks ind/udCSharp kode 


Den falder dog allerede sammen ved 17 og siger det er et sammensat tal. Som jeg har forstået det, så er et Fermat Liar et sammensat tal, eller er det et tal som er et primtal, men som foregives at være sammensat?

Jeg håber i har et forslag. På forhånd tak.


Det du leder efter i algoritmen er et Fermat Witness. Et witness er en garanti for at dit n er sammensat. Desto flere a'er du tester på uden at finde et witness, desto større er sandsynligheden for at n er et primtal.

Hvis funktionen påstår at n er et primtal selvom det i virkeligheden er sammensat, er det fordi at samtlige de a'er du har testet i dine k gennemløb var Fermat Liars.

Din fejl opstår fordi Math.Pow regner forkert. Prøv f.eks. at teste med en simpel pow funktion ala:
Fold kodeboks ind/udKode 




Beklager jeg ikke har fået skrevet tilbage noget før. Nu siger den at 17 er et primtal, men den siger 19 er sammensat. Det er faktisk galt med alle tal over 19, så har jeg lavet en forkert implementering?

Hele min kode ser sådan ud indtil videre:
Fold kodeboks ind/udCSharp kode 




t