Um triplo pitagórico consiste em três números inteiros positivos a, bec, de modo que a 2 + b 2 = c 2 . Esse triplo é comumente escrito (a, b, c) e um exemplo bem conhecido é (3, 4, 5). Se (a, b, c) é um triplo pitagórico, o mesmo acontece com (ka, kb, kc) para qualquer número inteiro positivo k. Um triplo pitagórico primitivo é aquele em que a, bec são coprimes .
Usando esse conhecimento, podemos criar uma sequência encadeando os menores comprimentos de triplos, onde o próximo elemento na sequência é a hipotenusa (maior número) do menor triplo pitagórico primitivo menor que contém o elemento anterior como o menor de seus comprimentos.
Comece com o menor triplo pitagórico primitivo (3, 4, 5). A sequência começa com 3
, e a hipotenusa (próximo elemento da sequência) é 5
. Em seguida, encontre o menor triplo pitagórico primitivo com 5
uma perna e você obtém (5, 12, 13). Então a sequência continua com 13
.
Faça a saída da sequência para sempre ou pegue uma entrada inteira n
e faça a saída dos primeiros n
elementos da sequência, zero ou um indexado.
Você precisa oferecer suporte à saída pelo menos através e inclusive 28455997
, mas se o limite do tipo de dados que você está usando for subitamente aumentado, ele precisará trabalhar para esse novo limite. Portanto, você não pode codificar uma lista de números.
3
5
13
85
157
12325
90733
2449525
28455997
295742792965
171480834409967437
656310093705697045
1616599508725767821225590944157
4461691012090851100342993272805
115366949386695884000892071602798585632943213
12002377162350258332845595301471273220420939451301220405
Sequências semelhantes (não as produzam!):
12325
.85
... seu próximo mandato é3613
(você pode adivinhar o que é ainda?)Respostas:
Geléia , 19 bytes
Salvou um byte graças a @ Dennis , refatorando para uma sequência infinita.
Não aceita entrada e argumentos, em seguida, gera a sequência infinitamente, imprimindo cada termo à medida que os computa. Este método diminui à medida que os números aumentam, pois depende da fatoração primária.
Experimente online!
Isso calcula o próximo termo calculando a fatoração de potência principal do termo atual. Para 12325, este é {5 2 , 17, 29}. Existe uma variante da fórmula de Euclides para calcular triplos pitagóricos { a , b , c },
onde m > n e o triplo são primitivos se m e n são coprime.
Para calcular a próxima raiz primitiva de 12325, encontre m e n de modo que mn = 12325 e escolha m , n para que gcd ( m , n ) = 1. Em seguida, gere todos os pares de m , n criando todos os subconjuntos de {5 2 , 17, 29} e localizando o produto de cada um desses subconjuntos que são {1, 25, 17, 29, 425, 725, 493, 12325}. Em seguida, divida 12325 por cada valor e par para que cada par seja m , n . Calcule a fórmula para c usando cada par e calcule o mínimo que é 90733.
Explicação
fonte
o3ṄÆfµṪ,P²SHß
com saída infinita salva um byte.Braquilog , 36 bytes
Experimente online!
Você precisa aguardar o tempo limite do programa (1 minuto) antes que o TIO libere a saída. No REPL do SWI-Prolog, isso é impresso assim que encontrar o valor.
Isso imprimirá a sequência para sempre.
Depois de alguns minutos no intérprete offline do SWI-Prolog, obtive
90733
depois12325
. Eu parei depois deste ponto.Isso não é força bruta completa, pois usa restrições para encontrar triplos pitagóricos, embora obviamente não seja otimizado para velocidade.
Explicação
fonte
Perl, 73 bytes
Todos os triplos pitagóricos
a²+b²=c²
satisfazema=r(m²-n²), b=2rmn, c=r(m²+n²)
alguns números inteirosr,m,n
. Quandor=1
em,n
são coprimes, com exatamente um sendo divisível por 2, entãoa,b,c
é um triplo primitivo, ondea,b,c
todos são coprimes em pares.Com isso em mente, dado um pouco
a
, eu uso um algoritmo de força bruta para calcular o menorn
tal quea²-n²
seja um quadrado, a saberm²
. Então,c
é igual an²+m²
.fonte
n
tal quea+n²
é um quadrado.Python 3, 178 bytes
Isso é basicamente apenas um algoritmo de força bruta e, portanto, é muito lento. É preciso a quantidade de termos para a saída como entrada.
Não tenho 100% de certeza sobre a correção desse algoritmo, o programa verifica a outra perna até a primeira perna ao quadrado, o que acredito ser suficiente, mas ainda não fiz as contas.
Experimente em repl.it! (Desatualizado) (por favor, não tente números maiores que 10, será muito lento)
fonte
math.gcd
. Além disso, use emp+=[...]
vez dep.append(...)
. E ao<2
invés de==1
. Eif
tudo pode estar em uma linha.MATL , 27 bytes
Isso produz os primeiros termos da sequência. A entrada é baseada em 0.
O código é muito ineficiente. O compilador online atinge o tempo limite para entradas maiores que
5
. A entrada6
ficou offline por um minuto e meio (e produziu o correto90733
como sexto termo).Experimente online!
fonte
Raquete 106 bytes
Ungolfed:
Teste:
Saída da versão golfed:
Saída da versão ungolfed:
(Erro depois disso na minha máquina)
fonte
Wolfram Language (Mathematica) , 74 bytes
Experimente online!
Wolfram Language (Mathematica) , 74 bytes
Experimente online!
fonte
PHP, 139 bytes
O código acima quebra após 28455997 em sistemas de 32 bits. Se forem necessários números mais altos, eles se tornarão 156 bytes:
fonte
Java 8, 133 bytes
-25 bytes graças a milhas Usando n * n em vez de Math.pow (n, 2)
-24 bytes graças a milhas Usando loops for em vez de while, alterando o tipo de dados, eliminando () devido à ordem das operações
Usa o fato de que
para qualquer par inteiro m> n> 0. Portanto, C é igual a A mais 2 (N) 2 . A função acima encontra o menor valor de N que satisfaz essa relação, enquanto faz com que o segundo elemento do Pitágoras triplique um número inteiro e maior que o primeiro elemento. Em seguida, define o valor do primeiro elemento para o terceiro elemento e se repete com o primeiro elemento atualizado.
Ungolfed:
Ideone it!
* O ideone não imprime o último elemento necessário devido a limites de tempo, no entanto, como você pode ver através da lógica do programa e da versão não destruída (que imprime o 28455997 como o terceiro elemento do triplo pitagórico anterior, em vez de o primeiro elemento de o próximo), os valores são impressos com um limite de tempo maior.
fonte
n*n
vez deMath.pow(n,2)
?for
loops para obtê-lo para baixo para 133 bytes()->{long b=3,c,n;for(;;){for(n=1;;n++){c=b+2*n*n;double d=Math.sqrt(c*c-b*b);if(d==(int)d&b<d){System.out.println(b);break;}}b=c;}};
Python 3.5, 97 bytes
Saída errada após
28455997
, devido aos limites do tipo de dados de ponto flutuante. Asqrt
função não é boa o suficiente, mas se a precisão fosse aumentada magicamente, funcionaria.Muito simples de entender. Incrementar
c
por dois em vez de um reduz o tempo de execução pela metade e apenas números ímpares precisam ser verificados de qualquer maneira, porque os elementos são sempre ímpares.Experimente online
O programa não pode ser executado no Ideone, porque o Ideone usa o Python 3.4
Para que a saída permaneça precisa por mais tempo, eu precisaria usar
decimal
:Experimente online
Para manter a precisão indefinidamente, eu poderia fazer algo horrível como este (aumentar a precisão necessária a cada iteração :
fonte
J ,
5447 bytesTIO
divisão gananciosa de fatores primos em fatores de coprime
antigo 54 bytes TIOfonte
Pari / GP , 71 bytes
Experimente online!
fonte
APL (NARS), 169 caracteres, 338 bytes
teste ok até 14 como argumento de q:
isso abaixo encontraria todos os divisores de seu argumento ...
fonte
JavaScript (Node.js) , 101 bytes
Experimente online!
Sugestões sobre golfe são bem-vindas
fonte