Servus!
Ich hab mir ein paar Java-Kenntnisse angeeignet und mir den relativ simplen Lucas-Lehmer-Algorithmus zur Aufgabe gemacht, um Mersennsche Primzahlen zu erzeugen. Da man da mit dem Standard-Integer-Datentyp schnell an das 32bit-Limit stößt, hab ich ein wenig im Inet gestöbert und bin auf die BigInteger gestoßen, deren Anwendung eigentlich recht simpel ist. Das Programm soll im Wesentlichen eine gewisse Anzahl (vom Benutzer eingegeben) an großen Mersennsche Primzahlen erzeugen. Das klappt auch bestens bis zur Zahl 5 (=Anzahl), dann hängt sich die CMD auf. Ich poste ma den Code:
[Java]
/*
Ziel dieses Programms ist es, grosse Mersennsche Primzahlen zu generieren.
*/
import java.math.BigInteger;
import static jsTools.Input.*;
public class Primzahlerzeugung{
public static void main(String args []){
BigInteger nix=new BigInteger("0");
BigInteger eins=new BigInteger("1");
BigInteger zwei=new BigInteger("2");
BigInteger vier=new BigInteger("4");
BigInteger p1=new BigInteger("3");
BigInteger p2;
BigInteger s=new BigInteger("4");
BigInteger i;
BigInteger j;
String hilf=readString("Geben Sie an, wieviele Primzahlen Sie erzeugen wollen:\n");
BigInteger anzahl=new BigInteger(hilf);
System.out.println("\n");
for(j=eins;j.compareTo(anzahl)<=0;j=j.add(eins)){
s=vier;
//Primzahl p2 berechnen
p2=eins;
for(i=eins;i.compareTo(p1)<=0;i=i.add(eins)) p2=p2.multiply(zwei);
p2=p2.subtract(eins);
//Primzahl p2 pruefen
System.out.println("Es wird geprueft, ob\n2^"+p1+"-1="+p2+"\neine Primzahl ist:");
System.out.println("s(1)=4");
for(i=zwei;i.compareTo(p1)<0;i=i.add(eins)){
s=s.multiply(s);
s=s.subtract(zwei);
s=s.mod(p2);
System.out.print("s("+i+")=");
System.out.println(s);
}
System.out.print("Die Zahl "+p2+" ist ");
//Wenn p2 keine Primzahl ist, muss man eine Berechnung mehr ausfuehren und man muss p1 derart verändern, dass es eine Primzahl wird
if(s.compareTo(nix)!=0){
System.out.print("k");
//Primitiver Primzahltest
for(i=zwei;i.compareTo(p1)<0;i.add(eins))
if((p1.mod(i)).compareTo(nix)==0){
p1=p1.add(zwei);
i=zwei;
}
j=j.subtract(eins);
}
//Falls p2 eine Primzahl ist, muss man p1=p2 setzen
else p1=p2;
System.out.println("eine Primzahl.\n");
}
}
}
[/Java]
Ich muss zu meiner Entschuldigung sagen, dass die readString()-Funktion von wem anderen stammt. Die sollte aber nicht das Problem sein, die ist von meinem Prof, das sollte wohl passen (hoffe ich^^).
Ich schreibe den Code der Übung halber im Editor ohne Highlighter oder andere Hilfmittel, Compiler ist der javac. Es scheint nicht an der Syntax zu liegen, sonst würde der Compiler ja aussteigen, es liegt vermutlich an der Semantik, eventuell sogar nur an der Optimierung des Codes.
Ich würde gerne alle üblichen BigInteger-Funktionen, die Primzahlen betreffen, weglassen, es geht mir um den Übungseffekt. Mir ist durchaus bewusst, dass die java.math.BigInteger da Funktionen zuhauf bietet, ich habe bewusst darauf verzichtet, man will ja lernen ;-).
Also, wenn ich das Programm ausführe, läuft es wunderbar bis zu der vierten generierten Primzahl, dann hört er kommentarlos auf.
Ich freue mich auf eventuelle Lösungen oder Fehlerfunde oder andere Beitäge, die helfen das Problem zu verstehen (muss ja net gleich ne Lösung sein).
LG FelixthePimp
P.S: Ich weiß, der Code is sehr primitiv, aber es ging nur ums Ausprobieren. Besonders das mit den BigInteger-Variablen ist, äh, verbesserungswürdig.
Ich hab mir ein paar Java-Kenntnisse angeeignet und mir den relativ simplen Lucas-Lehmer-Algorithmus zur Aufgabe gemacht, um Mersennsche Primzahlen zu erzeugen. Da man da mit dem Standard-Integer-Datentyp schnell an das 32bit-Limit stößt, hab ich ein wenig im Inet gestöbert und bin auf die BigInteger gestoßen, deren Anwendung eigentlich recht simpel ist. Das Programm soll im Wesentlichen eine gewisse Anzahl (vom Benutzer eingegeben) an großen Mersennsche Primzahlen erzeugen. Das klappt auch bestens bis zur Zahl 5 (=Anzahl), dann hängt sich die CMD auf. Ich poste ma den Code:
[Java]
/*
Ziel dieses Programms ist es, grosse Mersennsche Primzahlen zu generieren.
*/
import java.math.BigInteger;
import static jsTools.Input.*;
public class Primzahlerzeugung{
public static void main(String args []){
BigInteger nix=new BigInteger("0");
BigInteger eins=new BigInteger("1");
BigInteger zwei=new BigInteger("2");
BigInteger vier=new BigInteger("4");
BigInteger p1=new BigInteger("3");
BigInteger p2;
BigInteger s=new BigInteger("4");
BigInteger i;
BigInteger j;
String hilf=readString("Geben Sie an, wieviele Primzahlen Sie erzeugen wollen:\n");
BigInteger anzahl=new BigInteger(hilf);
System.out.println("\n");
for(j=eins;j.compareTo(anzahl)<=0;j=j.add(eins)){
s=vier;
//Primzahl p2 berechnen
p2=eins;
for(i=eins;i.compareTo(p1)<=0;i=i.add(eins)) p2=p2.multiply(zwei);
p2=p2.subtract(eins);
//Primzahl p2 pruefen
System.out.println("Es wird geprueft, ob\n2^"+p1+"-1="+p2+"\neine Primzahl ist:");
System.out.println("s(1)=4");
for(i=zwei;i.compareTo(p1)<0;i=i.add(eins)){
s=s.multiply(s);
s=s.subtract(zwei);
s=s.mod(p2);
System.out.print("s("+i+")=");
System.out.println(s);
}
System.out.print("Die Zahl "+p2+" ist ");
//Wenn p2 keine Primzahl ist, muss man eine Berechnung mehr ausfuehren und man muss p1 derart verändern, dass es eine Primzahl wird
if(s.compareTo(nix)!=0){
System.out.print("k");
//Primitiver Primzahltest
for(i=zwei;i.compareTo(p1)<0;i.add(eins))
if((p1.mod(i)).compareTo(nix)==0){
p1=p1.add(zwei);
i=zwei;
}
j=j.subtract(eins);
}
//Falls p2 eine Primzahl ist, muss man p1=p2 setzen
else p1=p2;
System.out.println("eine Primzahl.\n");
}
}
}
[/Java]
Ich muss zu meiner Entschuldigung sagen, dass die readString()-Funktion von wem anderen stammt. Die sollte aber nicht das Problem sein, die ist von meinem Prof, das sollte wohl passen (hoffe ich^^).
Ich schreibe den Code der Übung halber im Editor ohne Highlighter oder andere Hilfmittel, Compiler ist der javac. Es scheint nicht an der Syntax zu liegen, sonst würde der Compiler ja aussteigen, es liegt vermutlich an der Semantik, eventuell sogar nur an der Optimierung des Codes.
Ich würde gerne alle üblichen BigInteger-Funktionen, die Primzahlen betreffen, weglassen, es geht mir um den Übungseffekt. Mir ist durchaus bewusst, dass die java.math.BigInteger da Funktionen zuhauf bietet, ich habe bewusst darauf verzichtet, man will ja lernen ;-).
Also, wenn ich das Programm ausführe, läuft es wunderbar bis zu der vierten generierten Primzahl, dann hört er kommentarlos auf.
Ich freue mich auf eventuelle Lösungen oder Fehlerfunde oder andere Beitäge, die helfen das Problem zu verstehen (muss ja net gleich ne Lösung sein).
LG FelixthePimp
P.S: Ich weiß, der Code is sehr primitiv, aber es ging nur ums Ausprobieren. Besonders das mit den BigInteger-Variablen ist, äh, verbesserungswürdig.