Introdução
Na teoria dos números, dizemos que um número é suave quando seus fatores primos são todos no máximo . Por exemplo, 2940 é 7 suave porque .
Aqui, definimos um par smooth como dois números inteiros consecutivos que são smooth. Um exemplo de par suave de 7 será porque e . Curiosidade: Este é realmente o maior par de 7 pares .
Størmer provou em 1897 que, para cada , existem apenas finitos pares 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 , produza ou retorne todos os pares smooth sem duplicação (a ordem dentro do par não importa) na ordem que você desejar.
Observe que, para os números primos e , assumindo , todos os pares suave são também pares 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 código-golfe , o menor envio válido para cada idioma vence.
fonte
(1, 2)
parte da saída obrigatória ..?(1, 2)
par.Respostas:
JavaScript (ES7),
234232 bytesEncontre as soluções resolvendo as equações de Pell da formax2−2qy2=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 paresP suaves.
Experimente online!
Quão?
A função auxiliars 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 .
Procuramos todos os números quadrados suaves de 1P livres em [1..PP−1] , onde PP é usado como limite superior para P! .
Para cada númeron encontrado acima, procuramos a solução fundamental da equação de Pell x2−ny2=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 k≤max(3,(P+1)/2) , usando as relações de recorrência:
Para cadaxk , testamos se xk é ímpar e ambos (xk−1)/2 e (xk+1)/2 são P suaves. Nesse caso, nós os armazenamos no objeto r .
1: Como ela não testa a primalidade dos divisores, a funçãos 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.
fonte
x = ~-x / 2
e-~P / 2
.are estes algum tipo de arredondamento ...~x
é um NOT bit a bit, que calcula-(x+1)
. Portanto,~-x
é-(-x+1)
=x-1
e-~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.Geléia ,
1614 bytesExperimente 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
fonte
05AB1E , 8 bytes
Experimente online!
Explicação:
fonte
Gelatina , 123 bytes
Experimente online!
fonte
Haskell ,
118107 bytes-11 bytes graças a nimi
Experimente online!
q n
calcula uma lista de todos os principais fatores den
f k
fonte
[2..n]
dentrop
e incorporá-loq
. Experimente online!Gelatina , 24 bytes
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:
-3 bytes graças a @JonathanAllen
fonte
(8,9)
k!
(exceto o 3, que tem um fatorial pequeno porque é um número pequeno).Python 3 + sympy, 116 bytes
Experimente online!
Python 3 + sympy, 111 bytes
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.fonte
Wolfram Language (Mathematica) , 241 bytes
usa equações de Pell
Experimente online!
fonte
Pitão , 15 bytes
Experimente online!
Usa a observação de Nick Kennedy de que nenhum número de saída será maior que
4^k
.fonte
05AB1E , 16 bytes
Explicação:
fonte
Stax , 14 bytes
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.
fonte
Ruby , 89 + 8 = 97 bytes
Usa aEu de 1 a 4n , mapeie-o para n -smooth, caso contrário mapeie-o e
-rprime
bandeira. Para cada número[i, i+1]
se ambos estiveremfalse
, em seguida, remova tudofalse
da lista.Experimente online!
fonte