Op het moment ben ik een klein programmaatje in C aan het schrijven. Het programmaatje moet voor mij priemgetallen kunnen berekenen. Dit wil ik uiteraard zo groot mogelijk doen.
Op het moment schijf ik het programma voor het datatype int, maar het vraagstuk zou ook voor een willekeurig ander datatype kunnen gelden. Dus een antwoord als `juggle het geheel naar een ander datatype` is niet het gewenste antwoord.
Mijn probleem is het volgende:
Priemgetallen boven de drie hebben een aantal eigenschappen, die relatief snel controleerbaar zijn.
\(p = 6n\pm1\)
\(p = 4n\pm 1\)
\(p² = 24n + 1\)
Nu wil het geval dat vooral de laatste problemen oplevert.Het probleem behelst het bereik van datatype. In een int(eger) op C kun je maximaal het getal
\(2^{32}-1 = 4294967295\)
opslaan. Dit is het kwadraat van het getal 65535 (omlaag afgerond). Als ik deze controle er dus in houdt kan ik dus enkel getallen tot 65535 controleren op het zijn van een mogelijk priemgetal. Op zich kan dat allemaal wel, dat is het probleem niet. Maar zoals je zult snappen is een dergelijke controle veel sneller dan het aflopen van de rij met priemgetallen die je al eerder berekend hebt.Dus is mijn vraag: hoe kan ik van getal n controleren of het kwadraat voldoet aan de regel
\(24n + 1\)
zonder werkelijk dat kwadraat te berekenen?PS: Mochten jullie andere -snelle- controles kennen, dan hoor ik die ook graag
Puzzels