Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm: Fermats Vermutung
Ich probiere grade ein Program aus einem Skript aus, das nach der bewiesenen Vermutung von Fermat eigentlich nicht terminieren dürfte. Was stimmt da nicht an derm Code? Sieht jemand den Fehler?
public class Fermat {
public static void main(String[] args) {
int max=3;
boolean ewig= true;
while(ewig){
for(int k=3;k<=max;k++)
for(int x=2;x<=max;x++)
for(int y=2;y<=max;y++)
for(int z=2;z<=max;z++)
if((Math.pow(x, k)+Math.pow(y, k))==Math.pow(z, k))
{
System.out.println(Math.pow(z, k));
ewig=false;
}
max++;
}
System.out.println("Alarm!");
}
}
"Alarm!" dürfte nicht ausgegeben werden, wird es aber! Irgendwas stimmt da nicht! Liegt es vielleicht an der Math.pow(double arg1, double arg2) Methode?
Welche Ausgabe bekommst Du denn?
Was sagt die Zeile:
System.out.println(Math.pow(z, k));
Für alle nicht Mathematiker:
http://de.wikipedia.org/wiki/Diophantische_Gleichung#Ber.C3.BChmte_Diophantisch e_Gleichungen
Mein Output:
2.1859115597386964E21
2.1859115597386964E21
4.722366482869645E21
1.4063084452067724E22
3.934640807529654E22
4.722366482869645E21
1.4063084452067724E22
3.934640807529654E22
Alarm!
"System.out.println(Math.pow(z, k));" ist eigentlich überflüssig. Habe es eingefügt, um zu sehen, wann er aus der Schleife springt.
Ich hab's! :D 'ewig' muss auf true gesetzt werden! Dann endet er nie! Nochmal der komplette Code:
public class Fermat {
public static void main(String[] args) {
int max=3;
boolean ewig= true;
while(ewig){
for(int k=3;k<=max;k++)
for(int x=2;x<=max;x++)
for(int y=2;y<=max;y++)
for(int z=2;z<=max;z++)
if((Math.pow(x, k)+Math.pow(y, k))==Math.pow(z, k))
{
System.out.println(Math.pow(z, k));
ewig=true;
}
max++;
}
System.out.println("Alarm!");
}
}
Deine Zahlen sind sehr groß.
Double-Werte haben eine Genauigkeit von 64 Bit.
Diese hast Du hier IMO voll ausgeschöpft.
Deshalb kommt es zu Ungenauigkeiten, die if-Bedingung wird wahr und damit wird die Schleife verlassen.
Edit: war zu spät
Wenn Du ewig immer auf true setzt, macht die Variable keinen Sinn mehr.
Zu dem bleibt der Ungenauigkeitsfaktor bestehend.
hmm ... da hab ich mich wohl zu früh gefreut. Aber Math.pow ist doch per default double. Ne Idee wie ich das umgehen kann?
Was hast Du damit vor?
Der Satz ist bewiesen. Willst Du versuchen dies zu wiederlegen?
Nein, Quatsch! Es geht nur darum, dass ganze in Java darzustellen. Reines Interesse!
Dann musst Du dich leider an die Grenzen der Genauigkeit halten.
Wie und ob es unter Java geht diese zu erhöhen, weiß ich leider nicht.
Dass man dann weiterhin die Funktion Math.pow() verwenden kann, denke ich eher nicht.
Born2Burn
31-03-2006, 18:59
Du könntest in Java den Typ BigDecimal benutzen entsprechende Doku findest du bei sun.
Auf Gleicheit bei solchen Berechnungen zu prüfen ist eh immer eine sehr gefährliche Sache. Besser ist bei sowas immer ein >= oder <=, soweit dies möglich ist. Hab mir da das Programm nicht so genau angesehen.
Das Problem auf das du bei solchen Dingen stößt ist ein numerisches. Da spielen solche Dinge wie Maschinengenauigkeit und Wertebereich der Datentypen eine Rolle.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.