Escreva um programa, no idioma de sua escolha, que pareça encontrar com êxito um contra-exemplo do Último Teorema de Fermat . Ou seja, encontre os números inteiros a , b , c > 0 e n > 2 de modo que a n + b n = c n .
Claro, você realmente não pode fazê-lo, a menos que haja uma falha na prova de Andrew Wiles. Quero dizer, fingir , contando com
- estouro inteiro
- erro de arredondamento de ponto flutuante
- comportamento indefinido
- tipos de dados com definições incomuns de adição, exponenciação ou igualdade
- erros de compilador / intérprete
- Ou algo nesse sentido.
Você pode codificar algumas ou todas as variáveis a
, b
, c
, ou n
, ou procurá-los, fazendo voltas como for a = 1 to MAX
.
Este não é um código de golfe; é um concurso para encontrar soluções inteligentes e sutis.
Respostas:
J
Na verdade, Fermat cometeu um grande erro: na verdade, é errado para qualquer b, c ou n se a for 1:
fonte
1^(9 + (3^(9 = (42^9))))
1^i.5
avalia como1 1 1 1 1
.TI-Basic
Saída (verdadeira)
fonte
1782^12+1841^12=1922^12
.Java
Esse cara Fermat deve estar dormindo. Eu recebo centenas de soluções para as equações. Apenas converti minha fórmula do Excel para um programa Java.
fonte
^
em Java é xor, não poder.C ++
Compilado com
clang++ -O3 -o fermat fermat.cpp
, testado comUbuntu clang version 3.4.1-1~exp1 (branches/release_34) (based on LLVM 3.4.1)
:Obviamente, encontramos a, b, c> 0, de modo que a 3 + b 3 = c 3 (isso também funciona para n = 4, 5, 6, ...).
fonte
++
dentroclang++
.val.u
pode estourar (seria diferente se fosseuint32_t
). Além disso, esse código também usa deunion
maneira incorreta (de acordo com o padrão, você não pode gravar em um campo e ler o outro campo), mas isso é permitido por muitos compiladores (de acordo com a documentação).a,b,c
(ou qualquer outra coisa)fermat()
faz com que a função nunca retorne.Java
Parece que o teorema vale para n = 3, mas eu encontrei contra-exemplos para n = 4:
Resultado:
Explicação:
fonte
Pitão
fonte
True
porque math.pow retorna números de ponto flutuante e eles não têm precisão suficiente para obter a resposta corretaFalse
.GolfScript
Essa abordagem encontra várias soluções diferentes. Por exemplo:
Como funciona
fonte
C
Bem, é claro que vocês estão encontrando contra-exemplos, continuam obtendo estouros de número inteiro. Além disso, você está sendo muito lento ao iterar em c também. Esta é uma maneira muito melhor de fazer isso!
fonte
C
Todos odiamos estouros de número inteiro; portanto, usaremos um pequeno expoente
n
e algumas conversões de ponto flutuante. Mas ainda assim o teorema não se sustentariaa = b = c = 2139095040
.Resultado:
Disproved for 2139095040, 2139095040, 2139095040, 42: yes
Disproved for 2139095040, 2139095040, 2139095040, 90: yes
fonte
Javascript
42 é mágico, você sabe.
E também Wiles não é um.
fonte
T-SQL
Para refutar o teorema de Fermat, precisamos apenas encontrar um contra-exemplo. Parece que ele era super preguiçoso, e só tentou isso por permutação muito pequena. Na verdade, ele nem estava tentando. Encontrei um exemplo de contador em apenas 0 <a, b, c <15 e 2 <e <15. Desculpe, mas eu sou um jogador de golfe, então desgolfo esse código mais tarde!
Retorna 1, o que significa que encontramos um exemplo contrário!
fonte
Javascript
Parece que esse cara estava bem em algo. Sobre drogas, se você me perguntar. Dadas as restrições, nenhum conjunto de valores pode ser encontrado para o qual o teorema é verdadeiro.
fonte
n
) deve ser>= 3
.Outro contra-exemplo BÁSICO
fonte