Hallo,
also ich versuche gerade den kleinen Fermat Satz zur Überprüfung von Primzahlen zu Programmieren in C.
http://de.wikipedia.org/wiki/Primzahl
Es gilt:
"a^(p-1) ist kongruent zu 1 in Bezug auf mod p" (hoffe habs so richtig geschrieben)
http://de.wikipedia.org/wiki/Mod_(Mathematik)
Also ihr müsst beachten das dort _kein_ Gleichheitszeichen steht.
Weiter steht bei Wikipedia geschrieben, dass dies für jede ungerade Primzahl p und jede natürliche Zahl a mit 2 <= a < p gilt.
Ich hab es versucht mal in C zu programmieren:
unsigned long x;
long p;
x = pow(2,p-1);
x = x%p;
if(x == 1)
{
//Primzahl
}
else
{
//Keine Primzahl
}
Dabei ist mein a
= 2.
Naja jetzt stoße ich sehr schnell auf ein Problem, denn long kann ja nur Zahlen bis 4 294 967 296 speichern, allerdings ergibt 2^37 = 137 438 953 472 (bräuchte 2^37 Bit speicherplatz).
Dann speichert er also in die Variable x einfach eine 0, und somit sind die weiteren Rechnungen falsch => Falsche Ausgabe. Das ist natürlich nicht so schön, denn die Primzahlen bis 32 (max. größter Wert) kann man ja auswendig ;)
Meine Lösungen dazu wären:
x = pow(2,p-1) % p; //Zeile 39
So könnten ja am Beispiel (p=37) max. einen Wert von bis 36 bekommen.
Das Problem, beim Compiler (Dev-C++ 5.x) erscheint folgende Fehlermeldung:
39 c:\primzahlen.cpp invalid operands of types double' and
long int' to binary `operator%'
Da müsste ich dem Computer irgendwie "verklickern", dass pow(...) _kein_ double sondern ein (long) int ausgibt.
Ich habe mir mal eine hoch funktion geschrieben:
long hoch(long x,long y)
{
long erg,i,x_anf;
x_anf = x;
i = 1;
while(i < y)
{
x = x*x_anf;
i++;
}
return(x);
}
Aber da kann ich ja auch nur Zahlen bis max. 2^32 (sofern ich es noch auf unsigned setze) potenzieren.
Aber:
x = hoch(2,p-1) % p; //Zeile 39
funktioniert dann.
Naja dann 2. Idee wäre:
Wie könnte man größere Zahlen als 2^32 speichern, und mit denen dennoch einen Modulo-Division (%) durchführen kann?
MFG
Andavos