Un triple pitagórico consta de tres enteros positivos a, byc, de modo que a 2 + b 2 = c 2 . Tal triple se escribe comúnmente (a, b, c), y un ejemplo bien conocido es (3, 4, 5). Si (a, b, c) es un triple pitagórico, entonces también lo es (ka, kb, kc) para cualquier entero positivo k. Un triple pitagórico primitivo es aquel en el que a, byc son coprimos .
Usando este conocimiento, podemos crear una secuencia al encadenar las longitudes de triples menos largas, donde el siguiente elemento en la secuencia es la hipotenusa (número más grande) del triple pitagórico primitivo más pequeño que contiene el elemento anterior como el más pequeño de sus longitudes.
Comience con el triple pitagórico primitivo más pequeño (3, 4, 5). La secuencia comienza con 3
, y la hipotenusa (siguiente elemento de la secuencia) es 5
. Luego, encuentra el triple pitagórico primitivo más pequeño con 5
una pierna, y obtienes (5, 12, 13). Entonces la secuencia continúa con 13
.
O emite la secuencia para siempre, o toma una entrada entera n
y emite los primeros n
elementos de la secuencia, ya sea cero o uno indexado.
Debe admitir la salida al menos a través de e incluyendo 28455997
, pero si el límite del tipo de datos que está utilizando se elevó repentinamente, tendría que funcionar para ese nuevo límite. Por lo tanto, no puede codificar una lista de números.
3
5
13
85
157
12325
90733
2449525
28455997
295742792965
171480834409967437
656310093705697045
1616599508725767821225590944157
4461691012090851100342993272805
115366949386695884000892071602798585632943213
12002377162350258332845595301471273220420939451301220405
Secuencias similares (¡no muestres estas!):
12325
.85
... su próximo término es3613
(¿puedes adivinar qué es todavía?)Respuestas:
Jalea , 19 bytes
Ahorré un byte gracias a @ Dennis refactorizando a una secuencia infinita.
No toma datos ni argumentos, luego emite la secuencia infinitamente imprimiendo cada término a medida que los computa. Este método se ralentiza a medida que los números aumentan, ya que depende de la factorización prima.
Pruébalo en línea!
Esto calcula el próximo término calculando la factorización de potencia prima del término actual. Para 12325, esto es {5 2 , 17, 29}. Hay una variante de la fórmula de Euclides para calcular triples pitagóricos { a , b , c },
donde m > ny el triple es primitivo si m y n son coprimos.
Para calcular el siguiente raíz primitiva de 12.325, encontrar m y n tales que mn = 12.325 y elegir m , n de modo que gcd ( m , n ) = 1. Entonces generar todos los pares de m , n mediante la creación de todos los subconjuntos de {5 2 , 17, 29} y encontrar el producto de cada uno de esos subconjuntos que son {1, 25, 17, 29, 425, 725, 493, 12325}. Luego divida 12325 por cada valor y par de modo que cada par sea m , n . Calcule la fórmula para c usando cada par y tome el mínimo que es 90733.
Explicación
fuente
o3ṄÆfµṪ,P²SHß
con salida infinita guarda un byte.Brachylog , 36 bytes
Pruébalo en línea!
Debe esperar a que se agote el tiempo del programa (1 minuto) antes de que TIO descargue la salida. En REPL de SWI-Prolog, esto se imprime tan pronto como encuentra el valor.
Esto imprimirá la secuencia para siempre.
Después de unos minutos en el intérprete de SWI-Prolog fuera de línea, obtuve
90733
después12325
. Lo detuve después de este punto.Esto no es fuerza bruta completa, ya que utiliza restricciones para encontrar triples pitagóricos, aunque obviamente no está optimizado para la velocidad.
Explicación
fuente
Perl, 73 bytes
Todos los triples pitagóricos
a²+b²=c²
satisfacena=r(m²-n²), b=2rmn, c=r(m²+n²)
para algunos enterosr,m,n
. Cuandor=1
ym,n
son coprimos con exactamente uno divisible por 2, entoncesa,b,c
es un triple primitivo, dondea,b,c
todos son coprimos por pares.Con esto en mente, dado algunos
a
, utilizo un algoritmo de fuerza bruta para calcular el más pequeñon
, quea²-n²
es un cuadrado, a saberm²
. Entonces,c
es igual an²+m²
.fuente
n
tal quea+n²
sea un cuadrado.Python 3, 178 bytes
Esto es básicamente un algoritmo de fuerza bruta y, por lo tanto, es muy lento. Se necesita la cantidad de términos para generar como entrada.
No estoy 100% seguro de la exactitud de este algoritmo, el programa verifica el otro tramo hasta el primer tramo cuadrado, lo cual creo que es suficiente, pero no he hecho los cálculos.
Pruébalo en repl.it! (Anticuado) (Por favor, no lo intente para números mayores que 10, será muy lento)
fuente
math.gcd
. Además, use enp+=[...]
lugar dep.append(...)
. Y<2
en lugar de==1
. Yif
todos pueden estar en una línea.MATL , 27 bytes
Esto produce los primeros términos de la secuencia. La entrada está basada en 0.
El código es muy ineficiente. El compilador en línea agota el tiempo de espera para entradas mayores que
5
. La entrada6
tardó un minuto y medio fuera de línea (y produjo el correcto90733
como sexto término).Pruébalo en línea!
fuente
Raqueta 106 bytes
Sin golf:
Pruebas:
Salida de la versión de golf:
Salida de la versión sin golf:
(Error después de esto en mi máquina)
fuente
Wolfram Language (Mathematica) , 74 bytes
Pruébalo en línea!
Wolfram Language (Mathematica) , 74 bytes
Pruébalo en línea!
fuente
PHP, 139 bytes
El código anterior se rompe después de 28455997 en sistemas de 32 bits. Si se necesitan números más altos, se convierte en 156 bytes:
fuente
Java 8, 133 bytes
-25 bytes gracias a millas Usando n * n en lugar de Math.pow (n, 2)
-24 bytes gracias a millas Uso de bucles en lugar de while, cambio de tipo de datos, eliminación () debido al orden de las operaciones
Utiliza el hecho de que
para cualquier par de enteros m> n> 0. Por lo tanto, C es igual a A más 2 (N) 2 . La función anterior encuentra el menor valor de N que satisface esta relación, al tiempo que hace que el segundo elemento del pitagórico triplique un número entero y mayor que el primer elemento. Luego establece el valor del primer elemento en el tercer elemento y se repite con el primer elemento actualizado.
Sin golf:
Ideone it!
* La ideona no imprime el último elemento requerido debido a los límites de tiempo, sin embargo, como puede ver a través de la lógica del programa y la versión no protegida (que imprime el 28455997 como el tercer elemento del triple pitagórico anterior en lugar del primer elemento de el siguiente), los valores son, con un límite de tiempo más alto, impresos.
fuente
n*n
lugar deMath.pow(n,2)
?for
bucles para reducirlo a 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
Salida incorrecta después
28455997
, debido a los límites del tipo de datos de coma flotante. Lasqrt
función no es lo suficientemente buena, pero si la precisión aumentara mágicamente, funcionaría.Bastante simple de entender. Incrementar
c
en dos en lugar de uno reduce el tiempo de ejecución a la mitad, y de todos modos solo se deben verificar los números impares, porque los elementos siempre son impares.Pruébalo en línea
El programa no se puede ejecutar en Ideone, porque Ideone usa Python 3.4
Para que la salida se mantenga precisa por más tiempo, tendría que usar
decimal
:Pruébalo en línea
Para mantener la precisión indefinidamente, podría hacer algo horrible como esto (aumentar la precisión requerida cada iteración :
fuente
J ,
5447 bytesTIO
ávida división de factores primos en factores coprimos
viejo 54 bytes TIOfuente
Pari / GP , 71 bytes
Pruébalo en línea!
fuente
APL (NARS), 169 caracteres, 338 bytes
prueba ok hasta 14 como argumento de q:
esto a continuación encontraría todos los divisores de su argumento ...
fuente
JavaScript (Node.js) , 101 bytes
Pruébalo en línea!
Sugerencias sobre golf son bienvenidas
fuente