Le théorème du reste chinois peut être très utile en arithmétique modulaire.
Par exemple, considérons l'ensemble de relations de congruence suivant:
Pour des ensembles de relations de congruence comme celui-ci, où toutes les bases ( 3, 5, 7
dans cet exemple) sont co-amorcées les unes avec les autres, il y aura un et un seul entier n
entre 1
et le produit des bases ( 3*5*7 = 105
dans cet exemple) inclusif qui satisfait les relations .
Dans cet exemple, le nombre serait 14
généré par cette formule:
où 2, 4, and 0
sont donnés à partir de l'exemple ci-dessus.
70, 21, 15
sont les coefficients de la formule et ils dépendent des bases, 3, 5, 7
.
Pour calculer les coefficients de la formule ( 70, 21, 15
dans notre exemple) pour un ensemble de bases, nous utilisons la procédure suivante.
Pour chaque numéro a
dans un ensemble de bases:
- Trouvez le produit de toutes les autres bases, noté
P
. - Trouvez le premier multiple
P
qui laisse un reste1
lorsqu'il est divisé para
. C'est le coefficient dea
.
Par exemple, pour calculer le coefficient qui correspond à la base 3
, nous trouvons le produit de toutes les autres bases (c.-à-d. 5*7 = 35
), Puis trouvons le premier multiple de ce produit qui laisse un reste 1
lorsqu'il est divisé par la base.
Dans ce cas, 35
laisse un reste 2
lorsqu'il est divisé par 3
, mais 35*2 = 70
laisse un reste 1
lorsqu'il est divisé par 3
, tout 70
comme le coefficient correspondant pour 3
. De même, 3*7 = 21
laisse un reste 1
lorsqu'il est divisé par 5
et 3*5 = 15
laisse un reste 1
lorsqu'il est divisé par 7
.
En un mot
Pour chaque numéro a
d'un ensemble de chiffres:
- Trouvez le produit de tous les autres nombres, notés
P
. - Trouvez le premier multiple
P
qui laisse un reste1
lorsqu'il est divisé para
. C'est le coefficient dea
.
Le défi
- Le défi est, pour un ensemble de deux bases ou plus, de trouver l'ensemble des coefficients correspondants.
- L'ensemble de bases est garanti pour être co-amorcé par paire et chaque base est garantie d'être supérieure à 1.
- Votre entrée est une liste d'entiers sous forme d'entrée
[3,4,5]
ou de chaîne séparée par des espaces"3 4 5"
ou comment vos entrées fonctionnent. - Votre sortie doit être soit une liste d'entiers, soit une chaîne séparée par des espaces qui indique l'ensemble de coefficients.
Cas de test
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]
Un grand merci à Leaky Nun pour son aide dans la rédaction de ce défi. Comme toujours, si le problème n'est pas clair, faites-le moi savoir. Bonne chance et bon golf!
Réponses:
Haskell,
615553 octetsDéfinit une fonction
f
qui prend une entrée et donne une sortie sous forme de liste d'entiers.D'abord, nous bouclons sur tous les entiers dans l'entrée (1). Ensuite, nous prenons le produit de tous les entiers (2) et divisons par n pour obtenir uniquement le produit des non-
n
entiers, qui estP
(3).Ensuite, nous utilisons le résultat (
P
) comme valeur de pas pour une plage commençant à zéro (4). Nous prenons le résultat,[0, P, 2P, 3P, ...]
et le filtrons sur des valeurs pour lesquelles le résultat d'une opération mod-n est un (5). Enfin, nous prenons le premier élément, qui fonctionne grâce à l'évaluation paresseuse (6).Merci à @xnor pour 2 octets!
la source
quot
pouvez êtrediv
ethead
pouvez l'être!!0
.Gelée ,
117 octetsEssayez-le en ligne! ou vérifiez tous les cas de test .
Contexte
Soit P et a des entiers premiers strictement positifs .
Le processus en deux étapes de la question - trouver un multiple de P qui laisse un reste de 1 lorsqu'il est divisé par a - peut être décrit par l'équation de congruence suivante.
Par le théorème d'Euler-Fermat , nous avons
où φ désigne la fonction de totient d'Euler . De ce résultat, nous déduisons ce qui suit.
Enfin, comme le défi nous oblige à calculer Px , nous observons que
où Pa peut être calculé comme le produit de tous les modules.
Comment ça fonctionne
la source
J, 13 octets
Basé sur la réponse étonnante de @Dennis .
Usage
Certains cas de test auront besoin de l'entrée sous forme d'entiers étendus qui ont un suffixe
x
.Explication
Essayez-le ici.
la source
Mathematica, 27 octets
la source
Pyth , 14 octets
Suite de tests.
Implémentation naïve de l'algorithme.
la source
Gelée,
1413 octetsUn octet enregistré grâce à @ Dennis !
Utilise le processus décrit dans la spécification de défi. L'entrée est une liste de bases et la sortie est une liste de coefficients.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication
la source
JavaScript (ES6), 80 octets
J'ai essayé l'algorithme euclidien étendu mais cela prend 98 octets:
Si les valeurs sont toutes premières, ES7 peut le faire en 56 octets:
la source
Python + SymPy, 71 octets
Cela utilise l'algorithme de ma réponse Jelly . Les E / S se présentent sous la forme de listes de numéros SymPy.
la source
Python 2,
8784 octetsUne implémentation simple de l'algorithme. Suggestions de golf bienvenues.
la source
Cheddar , 64 octets
la source
.product
qui fait.reduce((*))
pour les tableaux ...GAP , 51 octets
GAP a une fonction qui peut calculer l'exemple de motivation avec
ChineseRem([2,5,7],[2,4,0])
, mais cela ne facilite toujours pas l'obtention des coefficients. Nous pouvons obtenir le nième coefficient en utilisant la liste avec un à la nième position et des zéros aux autres positions comme deuxième argument. Nous devons donc créer ces listes et appliquer la fonction à toutes:la source
Lot, 148 octets
la source
En fait, 14 octets
Cela utilise l'algorithme de la réponse Jelly de Dennis . Une autre réponse basée sur ma réponse Python est à venir. Suggestions de golf bienvenues. Essayez-le en ligne!
Comment ça fonctionne
Une autre réponse basée sur ma réponse Python à 22 octets. Suggestions de golf bienvenues. Essayez-le en ligne!
Comment ça fonctionne
la source