PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm: Fermats Vermutung



aporia
31-03-2006, 11:24
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?

Caveman
31-03-2006, 11:49
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

aporia
31-03-2006, 13:44
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.

aporia
31-03-2006, 13:50
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!");
}
}

Caveman
31-03-2006, 13:58
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.

aporia
31-03-2006, 14:09
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?

Caveman
31-03-2006, 14:37
Was hast Du damit vor?
Der Satz ist bewiesen. Willst Du versuchen dies zu wiederlegen?

aporia
31-03-2006, 16:26
Nein, Quatsch! Es geht nur darum, dass ganze in Java darzustellen. Reines Interesse!

Caveman
31-03-2006, 16:35
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.

Starbug
18-04-2006, 16:10
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.