Primtal igen igen

Tags:    c++

<< < 123 > >>
Målet: At oprette en liste med alle primtalene fra 0x0 til 0xffff.
Hvorledes gøres dette hurtigst? Jeg tror jeg er kommet op med en god metode, men der er noget der irriterer mig, selvom jeg ikke ved hvad det er, er det som om der er noget der ikke er som det skal være, så kommentarer er velkomne.

Her er koden (mad manglende kommentarer. Beklager)
Fold kodeboks ind/udKode 

Konceptet er ganske enkelt. istedet for at have en vector el.lign. indeholdene indeholdene alle primtalende op til 0xffff bruger jeg et bitset som representerer alle de naturlige tal i rangen. De enkelte bits er så sat til enten 0 eller 1 afhænging af om de er primtal eller ej.





Hvorfor ikke bruge en af disse to eksempler http://en.wikipedia.org/wiki/Prime_numbers#Pseudocode_for_programs_to_find_primes
Som du kan se bruger begge koder bla kvadratroden af den øvre begrænsning som bestemmelse for udregningen af et given primtal.



Der findes også væsentlige hurtigere metoder (såvel deterministiske som non-deterministiske) til at lave en hurtigere algoritme end simpel brute-force. Disse baserer sig på grundlæggende talteori, så derfor er det nok en god idé at vide en smule om det, før man kaster sig ud i at implementere sådanne algoritmer.



Jeg ved godt at det ikke har noget med spørgsmålet at gøre, men hvad betyder det at noget er deterministisk?:)



@martin slot
Jeg gør faktisk netop hvad du foreslår.
For at udlede alle primtal i intervalet 0x0 - 0xffff, behøver jeg kun primtalene i intervallet 0x0 - 0xff.

@mikl-dk
Det er et spørgsmål om hvordan man ser på det.
"Sien", som denne metode representerer, er så vidt jeg ved, den hurtigste til at udlede alle primtal i et fastsat interval. Der er muligvis andre metoder som er lige så huritige eller hurtigere, men man må også huste at tage i betragtning hvor mange clockcycles cpuen bruger på de forskellige instruktioner.

@mathias Knudsen:
Jeg bruger normalt ikke denne slags ud tryk, men såfrem jeg har ret i min antagelse, er det gaske simpelt.

Der er fx. måder hvor på man kan udlede primtal hvor du får resultatet: "prime", "not prime" eller "maybe prime". da du ricikerer at få et usikkert resultat må det siges at være en non-deterministisk algoritme, hvor imod hvis du får resultatet: "prime" eller "not prime" har dfu et entydigt resultat hver gang og derfor er betegnelsen deterministisk passende.

"Determine" kan oversættes til "fastslå", men hvis du får resultatet "maybe prime" er der ikke meget der er blevet fastslået.



Felix Nielsen, aaah, så jeg ikke lige. Min fejl :)



Måske skal jeg lige tilføje, at en non-deterministisk algoritme ikke laver falske negativer. Hvis den afviser at et tal er et primtal, så er det ikke et primtal. Men der er falske positiver - tal, der vurderes til sandsynligvis at være et primtal, er det måske alligevel ikke.



Nu har jeg kun skimmet din kode, men det ligner Eratosthenes si - kan det passe?

Du kan evt. kigge på:
http://en.wikipedia.org/wiki/Miller-Rabin_primality_test



Nu har jeg kun skimmet din kode, men det ligner Eratosthenes si - kan det passe?

Du kan evt. kigge på:
http://en.wikipedia.org/wiki/Miller-Rabin_primality_test

Det er netop hvad det er.



Det er såmænd også en fin metode til netop det, du er i gang med - naturligvis afhængigt at antallet af cifre.



ja, det oprindelige mål var jo at generere en liste med alle primtal fra 0x0 til 0xffffffff (32 bit)
Dette er dog ikke muligt fordi bitsetet ikke kan være så stort. I øvrigt ville dataerne også bruge 512 mb.



<< < 123 > >>
t