O teorema chinês do restante pode ser bastante útil na aritmética modular.
Por exemplo, considere o seguinte conjunto de relações de congruência:
Para conjuntos de relações de congruência como essa, em que todas as bases ( 3, 5, 7
neste exemplo) são co-primas entre si, haverá um e apenas um número inteiro n
entre 1
e o produto das bases ( 3*5*7 = 105
neste exemplo) inclusive, que satisfaz as relações .
Neste exemplo, o número seria 14
, gerado por esta fórmula:
onde 2, 4, and 0
são fornecidos a partir do exemplo acima.
70, 21, 15
são os coeficientes da fórmula e são dependentes das bases 3, 5, 7
,.
Para calcular os coeficientes da fórmula ( 70, 21, 15
em nosso exemplo) para um conjunto de bases, usamos o seguinte procedimento.
Para cada número a
em um conjunto de bases:
- Encontre o produto de todas as outras bases, denotadas como
P
. - Encontre o primeiro múltiplo
P
que deixa um resto de1
quando dividido pora
. Este é o coeficiente dea
.
Por exemplo, para calcular o coeficiente que corresponde à base 3
, encontramos o produto de todas as outras bases (ie 5*7 = 35
) e, em seguida, encontramos o primeiro múltiplo desse produto que deixa um restante 1
quando dividido pela base.
Nesse caso, 35
deixa o restante de 2
quando dividido por 3
, mas 35*2 = 70
deixa o restante de 1
quando dividido por 3
, assim 70
como o coeficiente correspondente para 3
. Da mesma forma, 3*7 = 21
deixa o restante de 1
quando dividido por 5
e 3*5 = 15
deixa o restante de 1
quando dividido por 7
.
Em poucas palavras
Para cada número a
em um conjunto de números:
- Encontre o produto de todos os outros números, denotados como
P
. - Encontre o primeiro múltiplo
P
que deixa um resto de1
quando dividido pora
. Este é o coeficiente dea
.
O desafio
- O desafio é, para um conjunto de duas ou mais bases, encontrar o conjunto dos coeficientes correspondentes.
- É garantido que o conjunto de bases seja co-prime em pares e cada base seja maior que 1.
- Sua entrada é uma lista de números inteiros como entrada
[3,4,5]
ou sequência separada por espaço"3 4 5"
ou, no entanto, suas entradas funcionam. - Sua saída deve ser uma lista de números inteiros ou sequência separada por espaço que denota o conjunto de coeficientes.
Casos de teste
input output
[3,5,7] [70,21,15]
[2,3,5] [15,10,6]
[3,4,5] [40,45,36]
[3,4] [4,9]
[2,3,5,7] [105,70,126,120]
[40,27,11] [9801,7480,6480]
[100,27,31] [61101,49600,56700]
[16,27,25,49,11] [363825,2371600,2794176,5583600,529200]
Muito obrigado a Leaky Nun por sua ajuda ao escrever este desafio. Como sempre, se o problema não estiver claro, entre em contato. Boa sorte e bom golfe!
Respostas:
Haskell,
615553 bytesDefine uma função
f
que recebe entrada e fornece saída como uma lista de números inteiros.Primeiro fazemos um loop sobre todos os números inteiros na entrada (1). Depois, pegamos o produto de todos os números inteiros (2) e dividimos por n para obter apenas o produto dos não
n
inteiros, que éP
(3).Em seguida, usamos o resultado (
P
) como o valor da etapa para um intervalo que começa em zero (4). Nós pegamos o resultado[0, P, 2P, 3P, ...]
e filtramos em valores para os quais o resultado de uma operação mod-n é um (5). Por fim, tomamos o primeiro elemento, que funciona graças à avaliação preguiçosa (6).Obrigado a @xnor por 2 bytes!
fonte
quot
pode ser umdiv
, ehead
pode ser!!0
.Jelly ,
117 bytesExperimente online! ou verifique todos os casos de teste .
fundo
Seja P e um estritamente positivos, números coprime .
O processo de duas etapas da pergunta - encontrar um múltiplo de P que deixa um restante de 1 quando dividido por um - pode ser descrito pela seguinte equação de congruência.
Pelo teorema de Euler-Fermat , temos
onde φ denota a função totiente de Euler . Deste resultado, deduzimos o seguinte.
Finalmente, como o desafio exige que calculemos Px , observamos que
Onde Pa pode ser calculado como o produto de todos os módulos.
Como funciona
fonte
J, 13 bytes
Baseado na incrível resposta de @Dennis .
Uso
Alguns casos de teste precisarão da entrada como números inteiros estendidos que possuem um sufixo
x
.Explicação
Experimente aqui.
fonte
Mathematica, 27 bytes
fonte
Pitão , 14 bytes
Suíte de teste.
Implementação ingênua do algoritmo.
fonte
Geléia,
1413 bytesGuardou um byte graças a @ Dennis !
Usa o processo descrito na especificação do desafio. A entrada é uma lista de bases e a saída é uma lista de coeficientes.
Experimente online ou verifique todos os casos de teste .
Explicação
fonte
JavaScript (ES6), 80 bytes
Eu tentei o algoritmo euclidiano estendido, mas são necessários 98 bytes:
Se os valores forem todos primos, o ES7 poderá fazê-lo em 56 bytes:
fonte
Python + SymPy, 71 bytes
Isso usa o algoritmo da minha resposta Jelly . A E / S está na forma de listas de números SymPy.
fonte
Python 2,
8784 bytesUma implementação simples do algoritmo. Sugestões de golfe são bem-vindas.
fonte
Queijo Cheddar , 64 bytes
fonte
.product
que faz.reduce((*))
para arrays ...GAP = VÃO , 51 bytes
O GAP possui uma função que pode calcular o exemplo motivador
ChineseRem([2,5,7],[2,4,0])
, mas que ainda não facilita a obtenção dos coeficientes. Podemos obter o n-ésimo coeficiente usando a lista com um na n-ésima posição e zeros nas outras posições como segundo argumento. Portanto, precisamos criar essas listas e aplicar a função a todas elas:fonte
Lote, 148 bytes
fonte
Na verdade, 14 bytes
Isso usa o algoritmo na resposta de Dennis Jelly . Outra resposta baseada na minha resposta em Python é futura. Sugestões de golfe são bem-vindas. Experimente online!
Como funciona
Outra resposta baseada na minha resposta Python em 22 bytes. Sugestões de golfe são bem-vindas. Experimente online!
Como funciona
fonte