Encontre todos os pares

13

Introdução

Na teoria dos números, dizemos que um número é k suave quando seus fatores primos são todos no máximo k . Por exemplo, 2940 é 7 suave porque 2940=223572 .

Aqui, definimos um par k smooth como dois números inteiros consecutivos que são k smooth. Um exemplo de par suave de 7 será (4374,4375) porque 4374=237 e 4375=547 . Curiosidade: Este é realmente o maior par de 7 pares .

Størmer provou em 1897 que, para cada k , existem apenas finitos pares k suaves , e esse fato é conhecido como Teorema de Størmer .

Desafio

Sua tarefa é escrever um programa ou função que, dado um número primo, insira k , produza ou retorne todos os pares k smooth sem duplicação (a ordem dentro do par não importa) na ordem que você desejar.

Observe que, para os números primos p e q , assumindo p<q , todos os pares p suave são também pares q suaves.

E / S de amostra

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)

Restrição

O programa ou função deve terminar teoricamente em tempo finito para todas as entradas. As brechas padrão não são permitidas por padrão.

Critérios Vencedores

Como se trata de um desafio de , o menor envio válido para cada idioma vence.

Shieru Asakoto
fonte
2
Você poderia adicionar casos de teste para 2, 3 e 5?
Jonathan Allan
@JonathanAllan 2-, 3- e 5- suavizar pares estão incluídos nos pares de 7-lisas, mas irá adicionar os casos por motivos de clareza
Shieru Asakoto
1
Está tendo (1, 2)parte da saída obrigatória ..?
Kevin Cruijssen
@KevinCruijssen Sim, todas as saídas devem conter o (1, 2)par.
Shieru Asakoto

Respostas:

10

JavaScript (ES7),  234  232 bytes

Encontre as soluções resolvendo as equações de Pell da forma x22qy2=1 , onde q é um número livre de quadrados P liso.

Esta é uma implementação do procedimento de Derrick Henry Lehmer , derivado do procedimento original de Størmer.

Retorna um objeto cujas chaves e valores descrevem os pares P 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

Experimente online!

Quão?

A função auxiliar s testa se um número inteiro n é um número P suave quando é chamado com i=0 ou um número 1 P suave sem quadrados quando é chamado com i=1 .

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

Procuramos todos os números quadrados suaves de 1 P livres em [1..PP1] , onde PP é usado como limite superior para P!.

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

Para cada número n encontrado acima, procuramos a solução fundamental da equação de Pell x2ny2=1 :

(_ => {
  for(x = 1; (y = ((++x * x - 1) / n) ** .5) % 1;);
  ...
})()

(o código acima é a versão não recursiva da minha resposta para esse outro desafio )

Uma vez encontrada a solução fundamental (x1,y1) , calculamos as soluções (xk,yk) com kmax(3,(P+1)/2) , usando as relações de recorrência:

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

Para cada xk , testamos se xk é ímpar e ambos (xk1)/2 e (xk+1)/2 são P suaves. Nesse caso, nós os armazenamos no objeto r .

( 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: Como ela não testa a primalidade dos divisores, a função s será verdadeira para alguns números livres não quadrados, mesmo quando for chamada com i=1 . A idéia é filtrar a maioria deles para que não sejam resolvidas muitas equações inúteis de Pell.

Arnauld
fonte
Oi Arnauld! Eu simplesmente não conseguia envolver minha cabeça em torno destes dois: x = ~-x / 2e -~P / 2.are estes algum tipo de arredondamento ...
Rahul Verma
1
@ rv7 ~xé um NOT bit a bit, que calcula -(x+1). Portanto, ~-xé -(-x+1)= x-1e -~xé -(-(x+1))= x+1. Como todas as operações bit a bit em JS, apenas a parte inteira de 32 bits é levada em consideração. Portanto, eles podem realmente ser usados ​​para arredondar. Mas e P já são números inteiros aqui. xP
Arnauld
4

Geléia , 16 14 bytes

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

Experimente online!

Verifica pares de até 4k que é ineficiente para k maior, mas deve garantir que nada seja perdido.

Obrigado a @ Jonathanon Allan por economizar 1 byte!

Explicação

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
fonte
1
Tem certeza de que será sempre grande o suficiente? Na minha solução, usei o k ! 2 mas JonathanAllan não tinha certeza de que sempre seria grande o suficiente. Se 4 k sempre funciona, eu estaria curioso para ouvir uma explicação. 4kk!24k
Camarada SparklePony
1
Obrigado pela resposta rápida. Eu estava pensando da mesma maneira, mas de forma mais ampla: "o fatorial fica bem alto rapidamente, provavelmente é grande o suficiente". (Acontece que não era, a menos que eu o quadratasse). Parabéns pelo golfe mais curto e eficiente, você tem o meu voto positivo.
Camarada SparklePony
1
Nota (de oeis.org/A002072 ) "a (n) <10 ^ n / n, exceto n = 4. (Conjecturado, a partir de dados experimentais.) - MF Hasler, 16 de janeiro de 2015". Penso que temos de nos ater ao fraco limite de Lehmer em projecteuclid.org/download/pdf_1/euclid.ijm/1256067456 (teorema 7), a menos que possamos provar o contrário.
Jonathan Allan
2
... existe uma pergunta em aberto no Mathematics SE perguntando exatamente isso também!
Jonathan Allan
1
@ PeterTaylor é para o número de pares, não para o número máximo. O problema é saber um limite no número máximo de pares não deixa você parar de procurar
Nick Kennedy
3

05AB1E , 8 bytes

°Lü‚ʒfà@

Experimente online!

Explicação:

°            # 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
Grimmy
fonte
2

Gelatina , 123 bytes

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

Experimente online!

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

k

Nick Kennedy
fonte
2

Haskell , 118 107 bytes

-11 bytes graças 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)]

Experimente online!

  • q n calcula uma lista de todos os principais fatores de n
  • f kk
Max Yekhlakov
fonte
1
Você pode percorrer [2..n]dentro pe incorporá-lo q. Experimente online!
Nimi
1

Gelatina , 24 bytes

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

Experimente online!

Isso leva muito tempo para 7, mas computa muito mais rápido se você remover o quadrado do fatorial: Experimente online!

Explicação:

³!²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 graças a @JonathanAllen

Camarada SparklePony
fonte
1
Eu não leio Jelly, você pode dar uma explicação sobre como isso funciona?
Modalidade de ignorância
(8,9)8=239=32
Não tenho certeza se é. O que faz você pensar que isso será válido?
Jonathan Allan
@ JonathanAllan Otimismo ingênuo e o fato de todos os exemplos que eu vi (reconhecidamente não muitos), o maior par é menor que k!(exceto o 3, que tem um fatorial pequeno porque é um número pequeno).
Camarada SparklePony
1
O limite superior que você está usando está no número máximo usado em um par, não no número de pares (você não pode implementar um limite superior no número de pares dessa maneira, pois não saberá quando parar de procurar!) Veja o teorema 7 para um limite superior no produto do maior par.
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]

Experimente online!

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

Experimente online!

Duas variações na minha resposta Jelly, mas no Python 3. Ambas definem uma função que aceita um argumento k. O primeiro retorna uma lista de tuplas dos pares que atendem aos critérios. O segundo os imprime em stdout.

Nick Kennedy
fonte
1

Wolfram Language (Mathematica) , 241 bytes

usa equações 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@#&]])&

Experimente online!

J42161217
fonte
1

05AB1E , 16 bytes

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

n>3 , embora ainda muito lenta ..

Explicação:

°                # 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
fonte
0

Stax , 14 bytes

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

Execute e depure

Este não é o programa mais curto possível, mas começa a produzir resultados assim que os pares correspondentes são encontrados. Ele termina eventualmente , mas a saída é produzida como encontrada.

recursivo
fonte
0

Ruby , 89 + 8 = 97 bytes

Usa a -rprimebandeira. Para cada númeroEu de 1 a 4n, mapeie-o para [i, i+1]se ambos estiveremn-smooth, caso contrário mapeie-o e false, em seguida, remova tudo falseda 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]}

Experimente online!

Value Ink
fonte