Introducción
En teoría de números, decimos que un número es suave cuando sus factores primos son como máximo . Por ejemplo, 2940 es 7-liso porque .
Aquí, definimos un par suave como dos enteros consecutivos que son suave. Un ejemplo de 7 pares suaves será porque 4374 = 2 \ cdot3 ^ 7 y 4375 = 5 ^ 4 \ cdot7 . Dato curioso: este es en realidad el mayor par de 7 suaves .
Størmer demostró en 1897 que por cada , solo hay finitamente muchos pares suaves , y este hecho se conoce como Teorema de Størmer .
Desafío
Su tarea es escribir un programa o función que, dado un número primo de entrada , emite o devuelve todos los pares suaves de sin duplicado (el orden dentro del par no importa) en el orden que desee.
Tenga en cuenta que para los números primos y q , suponiendo que p <q , todos los pares p- suaves también son pares q- suaves.
Muestra de E / S
Input: 2
Output: (1, 2)
Input: 3
Output: (1, 2), (2, 3), (3, 4), (8, 9)
Input: 5
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (8, 9), (9, 10), (15, 16), (24, 25), (80, 81)
Input: 7
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (14, 15),
(15, 16), (20, 21), (24, 25), (27, 28), (35, 36), (48, 49), (49, 50), (63, 64),
(80, 81), (125, 126), (224, 225), (2400, 2401), (4374, 4375)
Restricción
El programa o función debería terminar teóricamente en tiempo finito para todas las entradas. Las lagunas estándar no están permitidas por defecto.
Criterios ganadores
Como se trata de un desafío de código de golf , gana la presentación válida más corta para cada idioma.
fuente
(1, 2)
obligatorio tener parte de la salida? ..(1, 2)
par.Respuestas:
JavaScript (ES7),
234232 bytesEncuentra las soluciones resolviendo las ecuaciones de Pell de la formaX2- 2 qy2= 1 , donde q es un número libre de PAG -cuadrado liso.
Esta es una implementación del procedimiento de Derrick Henry Lehmer , derivado del procedimiento original de Størmer.
Devuelve un objeto cuyas claves y valores describen los paresPAG suaves.
Pruébalo en línea!
¿Cómo?
La función auxiliars prueba si un entero dado norte es un PAG número suave cuando se llama con i = 0 , o un número 1 PAG -smooth cuadrado libre cuando se llama con i = 1 .
Buscamos todos los números lisos 1PAG libres cuadrados en [ 1 .. PPAG- 1 ] , dondePAGPAG se utiliza como límite superior paraPAG! .
Para cada númeronorte encontrado anteriormente, buscamos la solución fundamental de la ecuación de Pell X2- n y2= 1 :
(El código anterior es la versión no recursiva de mi respuesta a este otro desafío )
Una vez que se ha encontrado la solución fundamental( x1, y1) , calculamos las soluciones ( xk, yk) con k ≤ m a x ( 3 , ( P+1)/2) , utilizando las relaciones de recurrencia:
Para cadaxk , probamos si xk es impar y ambos (xk−1)/2 y (xk+1)/2 sonP suaves. Si es así, los almacenamos en el objetor .
1: Debido a que no prueba la primalidad de los divisores, la funcións realmente será verdadera para algunos números libres no cuadrados, incluso cuando se llama con i=1 . La idea es filtrar la mayoría de ellos para que no se resuelvan demasiadas ecuaciones de Pell inútiles.
fuente
x = ~-x / 2
y. ¿-~P / 2
Son estos algún tipo de redondeo ...~x
es un NO bit a bit, que calcula-(x+1)
. Por lo tanto,~-x
es-(-x+1)
=x-1
y-~x
es-(-(x+1))
=x+1
. Como todas las operaciones bit a bit en JS, solo se tiene en cuenta la parte entera de 32 bits. Entonces, de hecho, pueden usarse para redondear. Pero tanto como PJalea ,
1614 bytesPruébalo en línea!
Comprueba pares de hasta4k que es ineficiente para k más grande, pero debe garantizar que no se pierda ninguno.
¡Gracias a @JonathanAllan por guardar 1 byte!
Explicación
fuente
05AB1E , 8 bytes
Pruébalo en línea!
Explicación:
fuente
Jalea , 123 bytes
Pruébalo en línea!
fuente
Haskell ,
118107bytes-11 bytes gracias a nimi
Pruébalo en línea!
q n
calcula una lista de todos los factores primos den
f k
genera una lista defuente
[2..n]
enp
línea e insertarlo en líneaq
. Pruébalo en línea!Jalea , 24 bytes
Pruébalo en línea!
Esto lleva mucho tiempo para 7, pero se calcula mucho más rápido si elimina la cuadratura del factorial: ¡ Pruébelo en línea!
Explicación:
-3 bytes gracias a @JonathanAllen
fuente
(8,9)
un par suave de 3 desdek!
(a excepción de 3, que tiene un factorial pequeño porque es un número pequeño).Python 3 + sympy, 116 bytes
Pruébalo en línea!
Python 3 + sympy, 111 bytes
Pruébalo en línea!
Dos variaciones en mi respuesta Jelly pero en Python 3. Ambas definen una función que acepta un argumento
k
. El primero devuelve una lista de tuplas de los pares que cumplen con los criterios. El segundo los imprime en stdout.fuente
Wolfram Language (Mathematica) , 241 bytes
usa ecuaciones de Pell
Pruébalo en línea!
fuente
Pyth , 15 bytes
Pruébalo en línea!
Utiliza la observación de Nick Kennedy de que ningún número de salida será mayor que
4^k
.fuente
05AB1E , 16 bytes
Pruébelo en línea (extremadamente ineficiente, así que agota el tiempo de espera paran > 3 ..). Aquí una alternativa un poco más rápida , aunque todavía bastante lenta.
Explicación:
fuente
Stax , 14 bytes
Ejecutar y depurarlo
Este no es el programa más corto posible, pero comienza a producir resultados tan pronto como se encuentran pares coincidentes. Finalmente termina , pero la salida se produce como se encuentra.
fuente
Ruby , 89 + 8 = 97 bytes
Usa layo de 1 a 4 4norte , mapear norte -suave, de lo contrario mapearlo,
-rprime
bandera. Para cada numero[i, i+1]
si ambos sonfalse
luego podar todofalse
de la lista.Pruébalo en línea!
fuente