Napisz program w wybranym języku, który wydaje się skutecznie znajdować kontrprzykład na temat ostatniego twierdzenia Fermata . Oznacza to, że znalezienie liczby całkowite a , b , c > 0 n > 2, tak że n + b n = c n .
Oczywiście, nie można naprawdę zrobić, o ile nie jest to wada w dowodzie Andrew Wiles. Mam na myśli podróbkę , polegając na
- całkowitą przepełnienie
- błąd zaokrąglania zmiennoprzecinkowego
- niezdefiniowane zachowanie
- typy danych z nietypowymi definicjami dodawania, potęgowania lub równości
- błędy kompilatora / interpretera
- lub coś podobnego.
Państwo może trudno kod niektóre lub wszystkie zmienne a
, b
, c
, lub n
, lub poszukać dla nich robiąc pętle podoba for a = 1 to MAX
.
To nie jest golf golfowy; konkurs polega na znalezieniu sprytnych i subtelnych rozwiązań.
Odpowiedzi:
jot
W rzeczywistości Fermat popełnił dość pomyłkę: w rzeczywistości jest źle dla dowolnego b, c lub n, jeśli a wynosi 1:
źródło
1^(9 + (3^(9 = (42^9))))
1^i.5
ocenia na1 1 1 1 1
.TI-Basic
Wyjście (prawda)
źródło
1782^12+1841^12=1922^12
.Jawa
Ten facet Fermata musiał spać. Dostaję setki rozwiązań równań. Po prostu przekonwertowałem moją formułę Excel na program Java.
źródło
^
w Javie jest Xor, a nie moc.C ++
Kompilowany
clang++ -O3 -o fermat fermat.cpp
, testowany zUbuntu clang version 3.4.1-1~exp1 (branches/release_34) (based on LLVM 3.4.1)
:Znaleźliśmy a, b, c> 0, więc a 3 + b 3 = c 3 (działa to również dla n = 4, 5, 6, ...).
źródło
++
inclang++
.val.u
przepełnienie (byłoby inaczej, gdyby tak byłouint32_t
). Poza tym kod ten również używaunion
w niewłaściwy sposób (zgodnie ze standardem nie można pisać w jednym polu, a czytać w drugim polu), ale jest to dozwolone przez wiele kompilatorów (zgodnie z ich dokumentacją).a,b,c
(lub cokolwiek, w tym przypadku)fermat()
sprawia, że funkcja nigdy nie powróci.Jawa
Wygląda na to, że twierdzenie dotyczy n = 3, ale znalazłem kontrprzykłady dla n = 4:
Wynik:
Wyjaśnienie:
źródło
Pyton
źródło
True
ponieważ Math.pow zwraca liczb zmiennoprzecinkowych, a te nie mają wystarczająco dużo precyzji, aby uzyskać właściwą odpowiedźFalse
.GolfScript
To podejście znajduje wiele różnych rozwiązań. Na przykład:
Jak to działa
źródło
do
No cóż, oczywiście, wy wszyscy znajdujecie kontrprzykłady, ciągle dostajecie przepełnienia liczb całkowitych. Plus, jesteś naprawdę powolny, powtarzając również na c. To znacznie lepszy sposób na zrobienie tego!
źródło
do
Wszyscy nienawidzimy przepełnień liczb całkowitych, więc użyjemy małego wykładnika
n
i niektórych konwersji zmiennoprzecinkowych. Jednak twierdzenie to nadal nie istniejea = b = c = 2139095040
.Wynik:
Disproved for 2139095040, 2139095040, 2139095040, 42: yes
Disproved for 2139095040, 2139095040, 2139095040, 90: yes
źródło
JavaScript
42 to magia, wiesz.
A także Wiles nie jest jednym.
źródło
T-SQL
Aby obalić twierdzenie tego faceta Fermata, musimy tylko znaleźć przeciwny przykład. Wygląda na to, że był bardzo leniwy i próbował tego tylko dla naprawdę małej permutacji. W rzeczywistości nawet nie próbował. Znalazłem licznik w zaledwie 0 <a, b, c <15 i 2 <e <15. Przepraszam, że jestem golfistą, więc odkopię ten kod później!
Zwraca 1, co oznacza, że znaleźliśmy przeciwny przykład!
źródło
JavaScript
Wygląda na to, że ten facet był na czymś w porządku. Na narkotyki, jeśli mnie pytasz. Biorąc pod uwagę ograniczenia, nie można znaleźć zestawu wartości, dla których twierdzenie jest prawdziwe.
źródło
n
) musi być>= 3
.Kolejny kontrprzykład BASIC
źródło