Ecrivez un programme, dans la langue de votre choix, qui semble bien trouver un contre-exemple au dernier théorème de Fermat . Autrement dit, recherchez les entiers a , b , c > 0 et n > 2 tels que a n + b n = c n .
Bien sûr, vous ne pouvez pas vraiment le faire, à moins que la preuve d'Andrew Wiles ne comporte un défaut. Je veux dire faux , en s'appuyant sur
- débordement d'entier
- erreur d'arrondi en virgule flottante
- comportement indéfini
- types de données avec des définitions inhabituelles d'addition, d'exponentiation ou d'égalité
- bogues du compilateur / interprète
- Ou quelque chose de ce genre.
Vous pouvez coder en dur une partie ou toutes les variables a
, b
, c
ou n
, ou les rechercher en faisant des boucles comme for a = 1 to MAX
.
Ce n'est pas un code de golf; C'est un concours pour trouver des solutions intelligentes et subtiles.
Réponses:
J
En fait, Fermat a fait une gaffe: en réalité, il est faux pour tout b, c ou n si a est 1:
la source
1^(9 + (3^(9 = (42^9))))
1^i.5
évalue à1 1 1 1 1
.TI-Basic
Sortie (true)
la source
1782^12+1841^12=1922^12
.Java
Ce gars de Fermat devait dormir. Je reçois des centaines de solutions aux équations. J'ai simplement converti ma formule Excel en un programme Java.
la source
^
en Java, c'est xor, pas le pouvoir.C ++
Compilé avec
clang++ -O3 -o fermat fermat.cpp
, testé avecUbuntu clang version 3.4.1-1~exp1 (branches/release_34) (based on LLVM 3.4.1)
:Nous avons évidemment trouvé a, b, c> 0 de sorte que a 3 + b 3 = c 3 (cela fonctionne aussi pour n = 4, 5, 6, ...).
la source
++
dansclang++
.val.u
débordement (ce serait différent si c'était le casuint32_t
). En outre, ce code utilise égalementunion
de manière incorrecte (selon la norme, vous ne pouvez pas écrire dans un champ et lire l'autre), mais cela est autorisé par de nombreux compilateurs (selon leur documentation).a,b,c
(ou quoi que ce soit d'autre)fermat()
fait en sorte que la fonction ne revienne jamais.Java
Il semble que le théorème soit valable pour n = 3, mais j'ai trouvé des contre-exemples pour n = 4:
Sortie:
Explication:
la source
Python
la source
True
car math.pow renvoie des nombres à virgule flottante, qui n’ont pas une précision suffisante pour obtenir la réponse correcteFalse
.GolfScript
Cette approche trouve un tas de solutions différentes. Par exemple:
Comment ça fonctionne
la source
C
Bien sûr, vous trouvez tous des contre-exemples, vous continuez à avoir des débordements d’entiers. De plus, vous êtes vraiment lent en itérant sur c aussi. C'est une bien meilleure façon de le faire!
la source
C
Nous détestons tous les débordements d’entiers, nous allons donc utiliser un petit exposant
n
et quelques conversions en virgule flottante. Mais le théorème ne serait toujours pas valablea = b = c = 2139095040
.Sortie:
Disproved for 2139095040, 2139095040, 2139095040, 42: yes
Disproved for 2139095040, 2139095040, 2139095040, 90: yes
la source
Javascript
42 est magique, vous savez.
Et aussi Wiles n'en est pas un.
la source
T-SQL
Pour réfuter le théorème de ce type Fermat, il suffit de trouver un contre-exemple. Il semble qu'il était super paresseux et ne l'a essayé que pour une très petite permutation. En fait, il n'essayait même pas. J'ai trouvé un exemple en 0 <a, b, c <15 et 2 <e <15. Désolé, je suis un golfeur de cœur, je code donc plus tard ce code!
Renvoie 1, ce qui signifie que nous avons trouvé un contre-exemple!
la source
JavaScript
Il semble que ce gars était sur quelque chose de bien. Sur la drogue si vous me demandez. Compte tenu des contraintes, aucun ensemble de valeurs ne peut être trouvé pour lequel le théorème est vrai.
la source
n
) doit être>= 3
.Un autre contre-exemple BASIC
la source