Guten Abend,
ich sitze gerade am Problem nr.3 von "Project Euler".https://projecteuler.net/problem=3
Es geht um die Primfaktorzerlegung einer großen Zahl und Ermittlung des größten Faktors. Nun wollte ich den kleinen Satz von Fermat als Primzahltest hinzuziehen.https://de.wikipedia.org/wiki/Fermatscher_Primzahltest
Doch es funktioniert nicht, alle Vielfachen der bereits gefundenen Primzahlen werden einfach in die Primzahlenliste aufgenommen(bspw. 15, 9, etc).
Hier werden die Zahlen generiert:
Die Implementierung des kl. Fermat-Satzes:
Hier die Hauptmethode:
Das Prinzip: calc() arbeitet rekursiv. Es wird eine Primzahl gesucht, die Teiler von dem eingegebenen Wert ist. Nun ist der andere Faktor folglich: (eingegebenerWert)/(gefundenenFaktor). Nun wird dieser Wert zerlegt. Das ganze endet, wenn der zu zerlegende Wert selbst prim ist.
Ich habe schon die SuFu benutzt, aber nichts hilfreiches bzgl. der Implementierung des kleinen Fermat-Satzes erhalten, will es unbedingt damit versuchen, es muss doch schließlich damit auch funktionieren.
Vielen Dank im voraus.
ich sitze gerade am Problem nr.3 von "Project Euler".https://projecteuler.net/problem=3
Es geht um die Primfaktorzerlegung einer großen Zahl und Ermittlung des größten Faktors. Nun wollte ich den kleinen Satz von Fermat als Primzahltest hinzuziehen.https://de.wikipedia.org/wiki/Fermatscher_Primzahltest
Doch es funktioniert nicht, alle Vielfachen der bereits gefundenen Primzahlen werden einfach in die Primzahlenliste aufgenommen(bspw. 15, 9, etc).
Hier werden die Zahlen generiert:
Java:
prims = new ArrayList<Double>();
factors = new ArrayList<Double>();
//Generate a list of prims below a certain limit
for(double i = 2; i < 20; i++){
//Leave out all multiples of 2 and exclude all even-valued numbers;
//reduces the runtime of this algorithm.
if(i%2==0)
continue;
if([B]isPrim(i)[/B])
prims.add(i); }
Java:
private boolean isPrim(double n) {
//Choose a as a number 1<a<p
double a = 2;
//If a**(n-1) mod n == 1 mod n, n is prim
if(((Math.pow(2, (n-1))-1)%n)==1)
return true;
//Otherwise, if a**(n-1) mod n == y mod n, 1<y<n so y != 1, n can be factorized and is not prim
return false;
}
Java:
double calc(double value) {
int i = 0;
//Return -1 if the number is prim itself
double biggest = -1;
if(isPrim(value)) {
//detect the biggest of the factors;
biggest = getMax();
return biggest;
}
//passed value is not prim:
for(; i < prims.size(); i++) {
//If we have found a real prim divisor:
if((value%prims.get(i))==0 && !(factors.contains(prims.get(i))))
factors.add(prims.get(i));
i = prims.size();
}
//You found one factor, now let's split up the other one until it is a prim itself.
calc(value/factors.get(i));
return biggest; }
Ich habe schon die SuFu benutzt, aber nichts hilfreiches bzgl. der Implementierung des kleinen Fermat-Satzes erhalten, will es unbedingt damit versuchen, es muss doch schließlich damit auch funktionieren.
Vielen Dank im voraus.