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, 7en este ejemplo) son primas entre sí, habrá un y solo un número entero nentre 1y el producto de las bases ( 3*5*7 = 105en este ejemplo) inclusivo que satisfaga las relaciones .
En este ejemplo, el número sería 14generado por esta fórmula:
donde 2, 4, and 0se dan del ejemplo anterior.
70, 21, 15son 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, 15en nuestro ejemplo) para un conjunto de bases, utilizamos el siguiente procedimiento.
Para cada número aen un conjunto de bases:
- Encuentre el producto de todas las otras bases, denotado como
P. - Encuentra el primer múltiplo de
Peso deja un resto de1cuando 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 1cuando se divide por la base.
En este caso, 35deja un resto de 2cuando se divide por 3, pero 35*2 = 70deja un resto de 1cuando se divide por 3, así 70es el coeficiente correspondiente para 3. Del mismo modo, 3*7 = 21deja un resto de 1cuando se divide por 5y 3*5 = 15deja un resto de 1cuando se divide por 7.
En una palabra
Para cada número aen un conjunto de números:
- Encuentre el producto de todos los otros números, denotados como
P. - Encuentra el primer múltiplo de
Peso deja un resto de1cuando 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
fque 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
nenteros, 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
quotpuedes serdivyheadpuedes 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
.productque 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