El teorema del resto chino puede ser bastante útil en aritmética modular.
Por ejemplo, considere el siguiente conjunto de relaciones de congruencia:
Para conjuntos de relaciones de congruencia como esta, donde todas las bases ( 3, 5, 7
en este ejemplo) son primas entre sí, habrá un y solo un número entero n
entre 1
y el producto de las bases ( 3*5*7 = 105
en este ejemplo) inclusivo que satisfaga las relaciones .
En este ejemplo, el número sería 14
generado por esta fórmula:
donde 2, 4, and 0
se dan del ejemplo anterior.
70, 21, 15
son los coeficientes de la fórmula y que dependen de las bases, 3, 5, 7
.
Para calcular los coeficientes de la fórmula ( 70, 21, 15
en nuestro ejemplo) para un conjunto de bases, utilizamos el siguiente procedimiento.
Para cada número a
en un conjunto de bases:
- Encuentre el producto de todas las otras bases, denotado como
P
. - Encuentra el primer múltiplo de
P
eso deja un resto de1
cuando se divide pora
. Este es el coeficiente dea
.
Por ejemplo, para calcular el coeficiente que corresponde a la base 3
, encontramos el producto de todas las demás bases (es decir 5*7 = 35
) y luego encontramos el primer múltiplo de ese producto que deja un resto 1
cuando se divide por la base.
En este caso, 35
deja un resto de 2
cuando se divide por 3
, pero 35*2 = 70
deja un resto de 1
cuando se divide por 3
, así 70
es el coeficiente correspondiente para 3
. Del mismo modo, 3*7 = 21
deja un resto de 1
cuando se divide por 5
y 3*5 = 15
deja un resto de 1
cuando se divide por 7
.
En una palabra
Para cada número a
en un conjunto de números:
- Encuentre el producto de todos los otros números, denotados como
P
. - Encuentra el primer múltiplo de
P
eso deja un resto de1
cuando se divide pora
. Este es el coeficiente dea
.
El reto
- El desafío es, para un conjunto de dos o más bases, encontrar el conjunto de coeficientes correspondientes.
- Se garantiza que el conjunto de bases será co-prime por pares y se garantiza que cada base sea mayor que 1.
- Su entrada es una lista de enteros como entrada
[3,4,5]
o cadena separada por espacios"3 4 5"
o, sin embargo, sus entradas funcionan. - Su salida debe ser una lista de enteros o una cadena separada por espacios que denota el conjunto de coeficientes.
Casos de prueba
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]
Muchas gracias a Leaky Nun por su ayuda al escribir este desafío. Como siempre, si el problema no está claro, hágamelo saber. ¡Buena suerte y buen golf!
Respuestas:
Haskell,
615553 bytesDefine una función
f
que toma entrada y da salida como una lista de enteros.Primero hacemos un bucle sobre todos los enteros en la entrada (1). Luego tomamos el producto de todos los enteros (2) y dividimos entre n para obtener solo el producto de los no
n
enteros, que esP
(3).Luego usamos el resultado (
P
) como el valor del paso para un rango que comienza en cero (4). Tomamos el resultado,[0, P, 2P, 3P, ...]
y lo filtramos en valores para los cuales el resultado de una operación mod-n es uno (5). Finalmente, tomamos el primer elemento, que funciona gracias a la evaluación diferida (6).¡Gracias a @xnor por 2 bytes!
fuente
quot
puedes serdiv
yhead
puedes ser!!0
.Jalea ,
117 bytesPruébalo en línea! o verificar todos los casos de prueba .
Antecedentes
Deje que P y a sean estrictamente positivos, enteros coprimos .
La siguiente ecuación de congruencia puede describir el proceso de dos pasos en la pregunta: encontrar un múltiplo de P que deja un resto de 1 cuando se divide entre a .
Según el teorema de Euler-Fermat , tenemos
donde φ denota la función totient de Euler . De este resultado, deducimos lo siguiente.
Finalmente, dado que el desafío requiere que calculemos Px , observamos que
donde Pa puede calcularse como el producto de todos los módulos.
Cómo funciona
fuente
J, 13 bytes
Basado en la sorprendente respuesta de @Dennis .
Uso
Algunos casos de prueba necesitarán la entrada como enteros extendidos que tienen un sufijo
x
.Explicación
Pruébalo aquí.
fuente
Mathematica, 27 bytes
fuente
Pyth , 14 bytes
Banco de pruebas.
Implementación ingenua del algoritmo.
fuente
Jalea,
1413 bytes¡Ahorré un byte gracias a @ Dennis !
Utiliza el proceso descrito en la especificación de desafío. La entrada es una lista de bases y la salida es una lista de coeficientes.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación
fuente
JavaScript (ES6), 80 bytes
Probé el algoritmo euclidiano extendido pero toma 98 bytes:
Si todos los valores son primos, ES7 puede hacerlo en 56 bytes:
fuente
Python + SymPy, 71 bytes
Esto usa el algoritmo de mi respuesta Jelly . I / O está en forma de listas de números SymPy.
fuente
Python 2,
8784 bytesUna implementación simple del algoritmo. Sugerencias de golf bienvenidas.
fuente
Cheddar , 64 bytes
fuente
.product
que lo hace.reduce((*))
para los arrays ...GAP , 51 bytes
GAP tiene una función que puede calcular el ejemplo motivador
ChineseRem([2,5,7],[2,4,0])
, pero que aún así no hace que sea tan fácil obtener los coeficientes. Podemos obtener el enésimo coeficiente usando la lista con un uno en la enésima posición y ceros en las otras posiciones como segundo argumento. Por lo tanto, debemos crear estas listas y aplicar la función a todas ellas:fuente
Lote, 148 bytes
fuente
En realidad, 14 bytes
Esto usa el algoritmo en la respuesta de Dennis's Jelly . Otra respuesta basada en mi respuesta de Python está por llegar. Sugerencias de golf bienvenidas. Pruébalo en línea!
Cómo funciona
Otra respuesta basada en mi respuesta de Python a 22 bytes. Sugerencias de golf bienvenidas. Pruébalo en línea!
Cómo funciona
fuente