Dado um número inteiro positivo que não é um quadrado, encontre a solução fundamental da equação de Pell associada
Detalhes
- O fundamental é um par de números inteiros satisfazendo a equação em que é mínimo e positivo. (Sempre existe a solução trivial que não é contada.)
- Você pode assumir que não é um quadrado.
Exemplos
n x y
1 - -
2 3 2
3 2 1
4 - -
5 9 4
6 5 2
7 8 3
8 3 1
9 - -
10 19 6
11 10 3
12 7 2
13 649 180
14 15 4
15 4 1
16 - -
17 33 8
18 17 4
19 170 39
20 9 2
21 55 12
22 197 42
23 24 5
24 5 1
25 - -
26 51 10
27 26 5
28 127 24
29 9801 1820
30 11 2
31 1520 273
32 17 3
33 23 4
34 35 6
35 6 1
36 - -
37 73 12
38 37 6
39 25 4
40 19 3
41 2049 320
42 13 2
43 3482 531
44 199 30
45 161 24
46 24335 3588
47 48 7
48 7 1
49 - -
50 99 14
51 50 7
52 649 90
53 66249 9100
54 485 66
55 89 12
56 15 2
57 151 20
58 19603 2574
59 530 69
60 31 4
61 1766319049 226153980
62 63 8
63 8 1
64 - -
65 129 16
66 65 8
67 48842 5967
68 33 4
69 7775 936
70 251 30
71 3480 413
72 17 2
73 2281249 267000
74 3699 430
75 26 3
76 57799 6630
77 351 40
78 53 6
79 80 9
80 9 1
81 - -
82 163 18
83 82 9
84 55 6
85 285769 30996
86 10405 1122
87 28 3
88 197 21
89 500001 53000
90 19 2
91 1574 165
92 1151 120
93 12151 1260
94 2143295 221064
95 39 4
96 49 5
97 62809633 6377352
98 99 10
99 10 1
n
s. (aliás, também fiquei surpreso, mas tive esse desafio na caixa de areia por cerca de um ano)Respostas:
Piet , 612 codéis
Toma n da entrada padrão. Emite y e x , separados por espaço.
Codel size 1:
Codel tamanho 4, para facilitar a visualização:
Explicação
Confira este rastreamento NPiet , que mostra o programa calculando a solução para um valor de entrada 99.
Não tenho certeza se alguma vez ouvi falar da equação de Pell antes desse desafio, por isso recebi o seguinte na Wikipedia; especificamente, essas seções de três artigos:
Basicamente, o que fazemos é o seguinte:
Sinceramente, não tenho idéia se uma abordagem de força bruta seria mais curta, e não vou tentar!Ok, então eu tentei.fonte
Piet , 184 codéis
Essa é a alternativa de força bruta que eu disse (na minha outra resposta ) que não queria escrever. Demora mais de 2 minutos para calcular a solução para n = 13. Eu realmente não quero experimentá-lo em n = 29 ... mas ele faz check-out para cada n até 20, por isso estou confiante de que está correto.
Assim como a outra resposta, isso leva n da entrada padrão e gera y e x , separados por espaço.
Codel size 1:
Codel tamanho 4, para facilitar a visualização:
Explicação
Aqui está o rastreamento NPiet para um valor de entrada 5.
Esta é a força bruta mais brutal, repetindo tanto quanto . Outras soluções podem iterar sobre e calcular , mas são fracos .x y x y=x2−1n−−−−√
Começando com e , isso verifica se e já resolveram a equação. Se tiver (o garfo na parte inferior, próximo à direita), ele gera os valores e sai.x=2 y=1 x y
Caso contrário, ele continua à esquerda, onde é incrementado e comparado com . (Depois, há algumas mudanças de direção para seguir o caminho em zig-zag.)y x
Esta última comparação é onde o caminho se divide em torno do meio esquerdo. Se eles são iguais, é incrementado e é retornado para 1. E voltamos a verificar se ainda é uma solução.x y
Ainda tenho algum espaço em branco disponível, então talvez eu veja se consigo incorporar esse cálculo de raiz quadrada sem ampliar o programa.
fonte
Braquilog , 16 bytes
Experimente online!
Explicação
fonte
Pari / GP , 34 bytes
O PARI / GP quase possui um recurso interno para isso:Q(D−−√) D x2-n⋅y2=±1-1x2−n⋅y2=±1 −1
quadunit
fornece a unidade fundamental do campo quadrático , onde é o discriminante do campo. Em outras palavras, resolve a equação de Pell . Então eu tenho que pegar o quadrado quando sua norma é .quadunit(4*n)
Não sei qual algoritmo ele usa, mas funciona mesmo quando não é quadrado.n
As respostas são fornecidas no formulárion−−√
x + y*w
, ondew
denota .Experimente online!
fonte
Wolfram Language (Mathematica) , 46 bytes
Experimente online!
fonte
05AB1E ,
171614 bytesGuardou um byte graças a Kevin Cruijssen .
Saídas
[y, x]
Experimente online!
Explicação
fonte
Ų
está cheio de casas decimais ..>. <De qualquer forma, você pode remover os dois,
e adicionar um final‚
(não, as vírgulas não são as mesmo; p) para salvar um byte.Ų
primeira vez perceber que não funcionava como o esperado.Java 8,
747372 bytes-1 byte graças a @Arnauld .
-1 byte graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
n
para umdouble
, ex
a umint
, jogando sobre o facto de quex*x-1
é igual a(-x-1)*(-x+1)
.(x+1)*(x+1)-1
é igual a-x*-(x+2)
, para ser totalmente correto.R,
66565453524745 bytesum programa completo
-1 -2graças a @Giuseppe-7 graças a @ Giuseppe e @Robin Ryder -2 @JAD
fonte
.5
vez de0.5
x
é equivalente a encontrar o menor valor dey
. Isso permite que você salve 2 bytes porque a expressãox
em termos dey
é mais curta do que o contrário e 4 bytes usando o truque de usarT
inicializado em 1.+T
no final para garantir que quandoy==1
ele retornar, em1
vez de,TRUE
mas eu não tenho certeza.Geléia , 40 bytes
Experimente online!
Uma resposta alternativa da Jelly, menos eficiente, mas mais eficiente quando algoritmos x e y são grandes. Ele encontra os convergentes da fração contínua regular que se aproxima da raiz quadrada de n e, em seguida, verifica qual resolve a equação de Pell. Agora encontra corretamente o período da fração contínua regular.
Graças a @TimPederick, também implementei uma solução baseada em número inteiro que deve lidar com qualquer número:
Geléia , 68 bytes
Experimente online!
Por exemplo, a solução para 1234567890 possui dígitos de 1936 e 1932 para o numerador e o denominador, respectivamente.
fonte
JavaScript (ES7), 47 bytes
Experimente online!
Abaixo está uma versão alternativa de 49 bytes, que monitora diretamente em vez de esquadrinhar a cada iteração:x²−1 x
Experimente online!
Ou podemos seguir o caminho não recursivo por 50 bytes :
Experimente online!
fonte
TI-BASIC,
444241 bytesEntrada é . Saída é uma lista cujos valores correspondem a .n
(x,y)
Usa a equação para para calcular a solução fundamental. O par atual para essa equação é uma solução fundamental se .y=x2−1n−−−−√ x≥2
(x,y) ymod1=0
Exemplos:
Explicação:
Nota: TI-BASIC é um idioma tokenizado. Contagem de caracteres não é igual à contagem de bytes.
fonte
MATL , 17 bytes
Experimente online!
Explicação
O código continua aumentando um contador k = 1, 2, 3, ... Para cada k , as soluções x , y com 1 ≤ x ≤ k , 1 ≤ y ≤ k são pesquisadas. O processo quando alguma solução for encontrada.
Esse procedimento é garantido para encontrar apenas uma solução, que é precisamente a fundamental. Para ver o porquê, observe que
Como conseqüência de 1 e 2,
fonte
Python 2 , 49 bytes
Experimente online!
Encontra
x
como o menor número acima de 1 em quex % sqrt(n) <= 1/x
. Então, encontray
dex
comoy = floor(x / sqrt(n))
.fonte
Haskell , 46 bytes
Uma busca direta por força bruta. Isso faz uso do fato de que uma solução fundamental satisfaz deve ter .(x,y) x2−ny2=1 y≤x
Experimente online!
fonte
n
parax
iny<-[1..n]
para poder calcularf 13
.C # (compilador interativo do Visual C #),
7069 bytesPorta da minha resposta Java 8 , mas gera uma tupla em vez de uma string para salvar bytes.
Experimente online.
fonte
Gelatina , 15 bytes
Experimente online!
Um programa completo que usa um único argumento
n
e retorna uma tupla dex, y
.fonte
Casca , 12 bytes
Experimente online!
Explicação
fonte
MathGolf , 12 bytes
Experimente online!
Estou jogando uma Ave Maria quando se trata da formatação de saída. Se não for permitido, tenho uma solução com 1 byte a mais. O formato de saída é
x.0y
onde.0
está o separador entre os dois números.Explicação
Eu me inspirei na resposta 05AB1E de Emigna, mas consegui encontrar algumas melhorias. Se o separador escolhido não for permitido, adicione um espaço antes do último byte para uma contagem de 13 bytes.
fonte
APL (NARS), 906 bytes
Acima, existem 2 funções sqrti função que iria encontrar a função de raiz e Pell quadrado chão voltaria Zilde para erro, e baseia-se ler a página http://mathworld.wolfram.com/PellEquation.html seria usar a algo para saber a sqrt de um número trhu continue a fração (mesmo se eu usar um algo para saber sqrt usando o método newton) e pare quando encontrar p e q de modo que
Teste:
Existe um limite para ciclos no loop na função sqrti e um limite para ciclos no loop na função Pell, ambos para o número possível de casos são muito grandes ou algo não converge ... (não sei se o sqrti convergem todas as entradas possíveis e a mesma função Pell também)
fonte
Groovy , 53 bytes
Experimente online!
Respostas Java e C # do porto de Kevin Cruijssen
fonte
Pitão, 15 bytes
Experimente online aqui . A saída é
x
entãoy
separada por uma nova linha.fonte
Wolfram Language (Mathematica) , 41 bytes
√
é o caractere Unicode de 3 bytes # 221A. Emite a solução na ordem (y, x) em vez de (x, y). Como de costume com o imperfeito//.
e suas iterações limitadas, funciona apenas em entradas em que o valor real dey
é no máximo 65538.Experimente online!
fonte
> <> , 45 bytes
Experimente online!
Algoritmo de força bruta, pesquisando de
x=2
cima para baixo , comy=x-1
e diminuindo em cada loop, incrementandox
quandoy
atingir 0. A saída éx
seguida pory
, separada por uma nova linha.fonte
C # (compilador interativo do Visual C #) , 69 bytes
Experimente online!
fonte
Python 3 , 75 bytes
Experimente online!
Explicação
Força bruta. Usando como um limite superior de pesquisa, que está bem abaixo do limite superior definido da solução fundamental da equação de Pellx<ii x≤i!
Esse código também seria executado no Python 2. No entanto, a função range () no Python 2 cria uma lista em vez de um gerador como no Python 3 e, portanto, é imensamente ineficiente.
Com tempo e memória inifinte, pode-se usar uma compreensão de lista em vez do iterador e salvar 3 bytes da seguinte forma:
Python 3 , 72 bytes
Experimente online!
fonte
Python 2 , 64 bytes
Experimente online!
Retorna
(x, y)
.fonte