Schreiben Sie ein Programm in der Sprache Ihrer Wahl, das ein Gegenbeispiel zu Fermats letztem Satz zu finden scheint . Das heißt, finde ganze Zahlen a , b , c > 0 und n > 2, so dass a n + b n = c n ist .
Natürlich kann man das nicht wirklich tun, es sei denn, Andrew Wiles 'Beweis weist einen Fehler auf. Ich meine, fälschen Sie es , indem Sie sich darauf verlassen
- Integer-Überlauf
- Gleitkomma-Rundungsfehler
- undefiniertes Verhalten
- Datentypen mit ungewöhnlichen Definitionen für Addition, Potenzierung oder Gleichheit
- Compiler / Interpreter-Fehler
- oder etwas in diese Richtung.
Sie können hart Code einige oder alle Variablen a
, b
, c
, oder n
, oder nach ihnen suchen durch Schleifen wie tun for a = 1 to MAX
.
Dies ist kein Code-Golf; Es ist ein Wettbewerb, um clevere und subtile Lösungen zu finden.
Antworten:
J
Eigentlich hat Fermat einen ziemlichen Fehler gemacht: Es ist tatsächlich falsch für jedes b, c oder n, wenn a 1 ist:
quelle
1^(9 + (3^(9 = (42^9))))
1^i.5
bewertet zu1 1 1 1 1
.TI-Basic
Ausgabe (wahr)
quelle
1782^12+1841^12=1922^12
.Java
Dieser Fermat muss geschlafen haben. Ich bekomme Hunderte von Lösungen für die Gleichungen. Ich habe lediglich meine Excel-Formel in ein Java-Programm konvertiert.
quelle
^
In Java ist xor keine Macht.C ++
Kompiliert mit
clang++ -O3 -o fermat fermat.cpp
, getestet mitUbuntu clang version 3.4.1-1~exp1 (branches/release_34) (based on LLVM 3.4.1)
:Wir haben offensichtlich a, b, c> 0 gefunden, so dass a 3 + b 3 = c 3 (dies funktioniert auch für n = 4, 5, 6, ...).
quelle
++
in vergessenclang++
.val.u
was überlaufen kann (es wäre anders, wenn esuint32_t
stattdessen wäre). Außerdem wird dieser Code auchunion
falsch verwendet (standardmäßig können Sie nicht in ein Feld schreiben und das andere Feld lesen), aber dies wird von vielen Compilern (gemäß ihrer Dokumentation) zugelassen.a,b,c
(oder was auch immer)fermat()
der Funktion dazu führt, dass sie niemals zurückkehrt.Java
Es sieht so aus, als ob der Satz für n = 3 gilt, aber ich habe Gegenbeispiele für n = 4 gefunden:
Ausgabe:
Erläuterung:
quelle
Python
quelle
True
weil math.pow Gleitkommazahlen zurückgibt und diese nicht genau genug sind, um die richtige Antwort zu erhaltenFalse
.GolfScript
Dieser Ansatz findet eine Reihe verschiedener Lösungen. Zum Beispiel:
Wie es funktioniert
quelle
C
Natürlich findet ihr alle Gegenbeispiele, ihr bekommt immer wieder Integer-Überläufe. Außerdem sind Sie sehr langsam, wenn Sie auch c durchlaufen. Dies ist ein viel besserer Weg, es zu tun!
quelle
C
Wir alle hassen Integer-Überläufe, daher verwenden wir einen kleinen Exponenten
n
und einige Gleitkommakonvertierungen. Aber dennoch würde der Satz nicht geltena = b = c = 2139095040
.Ausgabe:
Disproved for 2139095040, 2139095040, 2139095040, 42: yes
Disproved for 2139095040, 2139095040, 2139095040, 90: yes
quelle
Javascript
42 ist Magie, weißt du?
Und auch Wiles ist keiner.
quelle
T-SQL
Um den Satz von Fermat zu widerlegen, müssen wir nur ein Gegenbeispiel finden. Es scheint, er war super faul und versuchte es nur für eine wirklich kleine Permutation. Tatsächlich versuchte er es nicht einmal. Ich habe ein Gegenbeispiel in nur 0 <a, b, c <15 und 2 <e <15 gefunden. Tut mir leid, dass ich im Herzen ein Golfer bin, also werde ich diesen Code später wieder entfernen!
Gibt 1 zurück, was bedeutet, dass wir ein Gegenbeispiel gefunden haben!
quelle
JavaScript
Es scheint, dass dieser Kerl auf etwas in Ordnung war. Auf Drogen, wenn du mich fragst. Angesichts der Einschränkungen kann kein Satz von Werten gefunden werden, für den der Satz gilt.
quelle
n
) sein>= 3
.Ein weiteres BASIC-Gegenbeispiel
quelle