Encuentra todos los pares

13

Introducción

En teoría de números, decimos que un número es k suave cuando sus factores primos son como máximo . Por ejemplo, 2940 es 7-liso porque .k2940=2235 57 72

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 .kk(4374,4375)4374=237 74375=5 54 47 7

Størmer demostró en 1897 que por cada , solo hay finitamente muchos pares suaveskk , 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.kk

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.pagqpag<qpagq

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 , gana la presentación válida más corta para cada idioma.

Shieru Asakoto
fuente
2
¿Podría agregar casos de prueba para 2, 3 y 5?
Jonathan Allan
@JonathanAllan 2, 3 y 5 pares suaves están incluidos en los 7 pares suaves, pero
agregaré
1
¿Es (1, 2)obligatorio tener parte de la salida? ..
Kevin Cruijssen
@KevinCruijssen Sí, todas las salidas deben contener el (1, 2)par.
Shieru Asakoto

Respuestas:

10

JavaScript (ES7),  234  232 bytes

Encuentra las soluciones resolviendo las ecuaciones de Pell de la forma X2-2qy2=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 pares PAG suaves.

P=>[...Array(P**P)].map((_,n)=>(s=(n,i=0,k=2)=>k>P?n<2:n%k?s(n,i,k+1):s(n/k,i,k+i))(n,1)&&(_=>{for(x=1;(y=((++x*x-1)/n)**.5)%1;);(h=(x,y)=>k--&&h(X*x+n*Y*y,X*y+Y*x,x&s(x=~-x/2)&s(x+1)?r[x]=x+1:0))(X=x,Y=y,k=P<5?3:-~P/2)})(),r={})&&r

Pruébalo en línea!

¿Cómo?

La función auxiliar s prueba si un entero dado norte es un PAG número suave cuando se llama con yo=0 0 , o un número 1 PAG -smooth cuadrado libre cuando se llama con yo=1 .

s = (
  n,
  i = 0,
  k = 2
) =>
  k > P ?
    n < 2
  :
    n % k ?
      s(n, i, k + 1)
    :
      s(n / k, i, k + i)

Buscamos todos los números lisos 1 PAG libres cuadrados en [1 ..PAGPAG-1] , dondePAGPAG se utiliza como límite superior paraPAG!.

P=>[...Array(P ** P)].map((_, n) => s(n, 1) && (...))

Para cada número norte encontrado anteriormente, buscamos la solución fundamental de la ecuación de Pell X2-nortey2=1 :

(_ => {
  for(x = 1; (y = ((++x * x - 1) / n) ** .5) % 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 kmax(3,(P+1)/2) , utilizando las relaciones de recurrencia:

xk+1=x1xk+ny1ykyk+1=x1yk+y1xk

Para cada xk , probamos si xk es impar y ambos (xk1)/2 y (xk+1)/2 sonP suaves. Si es así, los almacenamos en el objetor .

( h = (x, y) =>
  k-- &&
  h(
    X * x + n * Y * y,
    X * y + Y * x,
    x &
    s(x = ~-x / 2) &
    s(x + 1) ?
      r[x] = x + 1
    :
      0
  )
)(X = x, Y = y, k = P < 5 ? 3 : -~P / 2)

1: Debido a que no prueba la primalidad de los divisores, la función s 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.

Arnauld
fuente
Hola arnauld Simplemente no podía entender a estos dos: x = ~-x / 2y. ¿ -~P / 2Son estos algún tipo de redondeo ...
Rahul Verma
1
@ rv7 ~xes un NO bit a bit, que calcula -(x+1). Por lo tanto, ~-xes -(-x+1)= x-1y -~xes -(-(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 PxP ya son enteros aquí.
Arnauld
4

Jalea , 16 14 bytes

4*ÆfṀ<ɗƇ‘rƝLÐṂ

Pruébalo en línea!

Comprueba pares de hasta 4k 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

4*ÆfṀ<ɗƇ‘rƝLÐṂ  | Monadic link, input k

4*              | 4**k, call this n
      ɗƇ        | For each number from 1..n filter those where:
  Æf            |   - Prime factors
    Ṁ           |   - Maximum
     <  ‘       |   - Less than k+1
         rƝ     | Inclusive range between neighbouring values
           LÐṂ  | Keep only those of minimum length (i.e. adjacent values)
Nick Kennedy
fuente
1
¿Estás seguro de que siempre serán lo suficientemente grandes? En mi solución, usé k ! 2 pero JonathanAllan no estaba seguro de que siempre fuera lo suficientemente grande. Si 4 k siempre funciona, sería curioso escuchar una explicación. 4kk!24k
Camarada SparklePony
1
Gracias por la rápida respuesta. Estaba pensando de manera similar, pero en términos más generales: "el factorial se eleva bastante rápido, probablemente sea lo suficientemente grande". (Resulta que no fue a menos que lo cuadre). Felicidades por el golf más corto y más eficiente, tienes mi voto a favor.
Camarada SparklePony
1
Nota (de oeis.org/A002072 ) "a (n) <10 ^ n / n excepto para n = 4. (Conjeturado, a partir de datos experimentales) - MF Hasler, 16 de enero de 2015". Creo que tenemos que seguir con el límite débil de Lehmer en projecteuclid.org/download/pdf_1/euclid.ijm/1256067456 (teorema 7) a menos que podamos demostrar lo contrario.
Jonathan Allan
2
... hay una pregunta abierta sobre Mathematics SE que pregunta exactamente esto también.
Jonathan Allan
1
@PeterTaylor es para la cantidad de pares, no para la cantidad máxima. El problema es saber que un límite en el número máximo de pares no te permite dejar de buscar
Nick Kennedy
3

05AB1E , 8 bytes

°Lü‚ʒfà@

Pruébalo en línea!

Explicación:

°            # 10 ** the input
 Lü‚         # list of pairs up to that number
    ʒ        # filtered by...
     fà      # the greatest prime factor (of either element of the pair)...
       @     # is <= the input
Mugriento
fuente
2

Jalea , 123 bytes

¹©Æ½Ø.;µU×_ƭ/;²®_$÷2ị$}ʋ¥⁸;+®Æ½W¤:/$$µƬṪ€F¹;Ḋ$LḂ$?ṭ@ṫ-ṚZæ.ʋ¥ƒØ.,U¤-ịWµ1ịżU×®W¤Ɗ$æ.0ị$ṭµ³’H»3¤¡
ÆRŒPP€ḟ2ḤÇ€ẎḢ€+€Ø-HÆfṀ€<ẠʋƇ‘

Pruébalo en línea!

2×max(3,k+12)x12,x+12 .

k

Nick Kennedy
fuente
2

Haskell , 118107 bytes

-11 bytes gracias a nimi

q 1=[1]
q n=(:)<*>q.div n$[x|x<-[2..n],mod n x==0]!!0
f k|let r=all(<=k).q=[(n,n+1)|n<-[1..4^k],r n,r(n+1)]

Pruébalo en línea!

  • q n calcula una lista de todos los factores primos de n
  • f k genera una lista de k-pares suaves para una k dada filtrando una lista de todos los pares
Max Yekhlakov
fuente
1
Puede recorrerlo [2..n]en plínea e insertarlo en línea q. Pruébalo en línea!
nimi
1

Jalea , 24 bytes

³!²R‘Ė
ÇÆFḢ€€€’<³FȦ$€Tị¢

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:

³!²R‘Ė                Generates a list like [[1,2],[2,3],...]
³!²                  Take the square of the factorial of the input
   R                 Range 1 through through the above number.
    ‘Ė               Decrement and enumerate, yielding desired list


ÇÆFḢ€€€’<³FȦ$€Tị¢  
Ç                    Get the list of pairs  
 ÆF                  Get the prime factors of each number
   Ḣ€€€              Get the base of each
       ’<³           Is each base less than or equal to the input?
          FȦ$€       Check that all bases of a pair fit the above.
              T      Get a list of the truthy indexes
               ị¢    Index into the original list of pairs
                     Implicit output

-3 bytes gracias a @JonathanAllen

Camarada SparklePony
fuente
1
No leo Jelly, ¿puedes dar una explicación de cómo funciona esto?
Encarnación de la ignorancia
No creo que esto funcione, no es (8,9)un par suave de 3 desde8=23 y 9 9=32?
Jonathan Allan
Sin embargo, no estoy seguro de que lo sea. ¿Qué te hace pensar que aguantará?
Jonathan Allan
@JonathanAllan Optimismo ingenuo y el hecho de todos los ejemplos que he visto (ciertamente no muchos), el par más grande es menor que k!(a excepción de 3, que tiene un factorial pequeño porque es un número pequeño).
Camarada SparklePony
1
El límite superior que está utilizando está en el número máximo utilizado en un par, no en el número de pares (¡no puede implementar un límite superior en el número de pares de esta manera, ya que no sabrá cuándo dejar de mirar!) Vea el teorema 7 para un límite superior en el producto del par más grande.
Jonathan Allan
1

Python 3 + sympy, 116 bytes

import sympy
def f(k):x=[i for i in range(2,4**k)if max(sympy.factorint(i))<=k];return[(y,y+1)for y in x if y+1in x]

Pruébalo en línea!

Python 3 + sympy, 111 bytes

from sympy import*
def f(k):
 b=1
 for i in range(2,4**k):
  x=max(factorint(i))<=k
  if x&b:print(i-1,i)
  b=x

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.

Nick Kennedy
fuente
1

Wolfram Language (Mathematica) , 241 bytes

usa ecuaciones de Pell

(s=#;v@a_:=Max[#&@@@#&/@FactorInteger@a]<=s;Select[{#-1,#+1}/2&/@(t={};k=y=1;While[k<=Max[3,(s+1)/2],If[IntegerQ[x=Sqrt[1+2y^2#]],t~AppendTo~x;k++];y++];t),v@#&]&/@Join[{1},Select[Range[3,Times@@Prime@Range@PrimePi@s],SquareFreeQ@#&&v@#&]])&

Pruébalo en línea!

J42161217
fuente
1

05AB1E , 16 bytes

°LʒfàI>‹}Xšü‚ʒ¥`

Pruébelo en línea (extremadamente ineficiente, así que agota el tiempo de espera paranorte>3..). Aquí una alternativa un poco más rápida , aunque todavía bastante lenta.

Explicación:

°                # Take 10 to the power of the (implicit) input
 L               # Create a list in the range [1, 10^input]
  ʒ              # Filter this list by:
   fà            #  Get the maximum prime factor
     I>‹         #  And check if it's smaller than or equal to the input
        }Xš      # After the filter: prepend 1 again
           ü‚    # Create pairs
             ʒ   # And filter these pairs by:
              ¥` #  Where the forward difference / delta is 1
Kevin Cruijssen
fuente
0

Stax , 14 bytes

Θ",²aÇu,á‼⌐çLB

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.

recursivo
fuente
0

Ruby , 89 + 8 = 97 bytes

Usa la -rprimebandera. Para cada numeroyo de 1 a 4 4norte, mapear [i, i+1]si ambos sonnorte-suave, de lo contrario mapearlo, falseluego podar todo falsede la lista.

->n{g=->x{x.prime_division.all?{|b,_|b<=n}};(1..4**n).map{|i|g[i]&&g[i+1]&&[i,i+1]}-[!1]}

Pruébalo en línea!

Tinta de valor
fuente