Votre tâche consiste à donner deux nombres entiers a
et à b
calculer l'inverse multiplicatif modulaire d'un modulo b, s'il existe.
L'inverse modulaire de a
modulo b
est un nombre c
tel que ac ≡ 1 (mod b)
. Ce numéro est un modulo unique b
pour toute paire de a
et b
. Il n'existe que si le plus grand diviseur commun de a
et b
est 1
.
La page Wikipedia pour l'inverse multiplicatif modulaire peut être consultée si vous avez besoin de plus d'informations sur le sujet.
Entrée et sortie
L'entrée est donnée sous la forme de deux entiers ou d'une liste de deux entiers. Votre programme doit produire soit un nombre unique, l'inverse multiplicatif modulaire qui se trouve dans l'intervalle 0 < c < b
, soit une valeur indiquant qu'il n'y a pas d'inverse. La valeur peut être n'importe quoi, sauf un nombre dans la plage (0,b)
, et peut également être une exception. La valeur doit cependant être la même pour les cas où il n'y a pas d'inverse.
0 < a < b
peut être supposé
Règles
- Le programme devrait se terminer à un moment donné et devrait résoudre chaque cas de test en moins de 60 secondes
- Des échappatoires standard s'appliquent
Cas de test
Les cas de test ci-dessous sont donnés dans le format, a, b -> output
1, 2 -> 1
3, 6 -> Does not exist
7, 87 -> 25
25, 87 -> 7
2, 91 -> 46
13, 91 -> Does not exist
19, 1212393831 -> 701912218
31, 73714876143 -> 45180085378
3, 73714876143 -> Does not exist
Notation
C'est le golf de code, donc le code le plus court pour chaque langue gagne.
Ceci et ceci sont des questions similaires, mais les deux demandent des situations spécifiques.
la source
Réponses:
Mathematica, 14 octets
Mathematica obligatoire intégré :
C'est une fonction qui prend deux arguments (
a
etb
), et retourne l'inverse d'un mod b s'il existe. Sinon, il renvoie l'erreurModularInverse: a is not invertible modulo b.
.la source
JavaScript (ES6),
79736261 octetsRenvoie
false
si l'inverse n'existe pas.Il utilise l'algorithme euclidien étendu et résout tous les cas de test presque instantanément.
Cas de test
Afficher l'extrait de code
la source
f(x,y)
est toujours analysé comme un appel de fonction, sauf s'il est explicitement précédé dufunction
mot - clé. Une fonction de flèche anonyme, en revanche, est déclarée comme(x,y)=>something
etf=(x,y)=>something
affecte la fonction à laf
variable.Gelée , 2 octets
Essayez-le en ligne!
Cela utilise une fonction intégrée pour l'inverse modulaire et renvoie 0 pour aucune inverse modulaire.
Gelée , 7 octets
Essayez-le en ligne!
Produit un ensemble vide (représenté comme une chaîne vide) sur aucun inverse modulaire. Manque de mémoire sur TIO pour les plus grands cas de test, mais devrait fonctionner avec suffisamment de mémoire.
Comment ça marche
Si vous souhaitez travailler pour des cas de test plus importants, essayez cette version (relativement non gérée), qui nécessite beaucoup de temps plutôt que de mémoire:
Gelée, 9 octets
Essayez-le en ligne!
Comment ça marche
la source
Python 2 , 34 octets
Essayez-le en ligne!
Fonction récursive qui donne
True
pourprint f(1,2)
, que je pense être acceptable, et des erreurs pour les entrées invalides.Nous essayons de trouverx dans a⋅x≡1(modb) .
Cela peut être écrit commea⋅x−1=k⋅b où k est un entier.
Prisemoda de ceci donne−1≡k⋅b(moda) . Déplacer le moins donne−k⋅b≡1(moda) , où nous devons résoudre pourk .
Voyant comment il ressemble au scénario initial, permettez-nous de recurse pour résoudre pourk en appelant la fonction avec f(−b%a,a) (fonctionne parce que Python donne des valeurs positives pour modulo avec un argument négatif).
Le programme se répète jusqu'à cea devienne 1, ce qui ne se produit que si l'original a et b sont premiers entre eux (c'est-à-dire qu'il existe un inverse multiplicatif), ou se termine par une erreur causée par la division par 0.
Cette valeur dek peut être substituée dans l'équation a⋅x−1=k⋅b pour donner x comme k⋅b+1a .
la source
Numéros R + , 15 octets
renvoie
NA
pour ceuxa
sans inverses modb
.R-Fiddle pour l'essayer!
R , 33 octets (non concurrent)
Cela échouera sur de très gros volumes
b
car il crée en fait un vecteur de32*b
bits de taille .Essayez-le en ligne!
Renvoie
integer(0)
(une liste vide) pour ceuxa
sans inverses modb
.la source
Mathematica, 18 octets
contribution
la source
Python 2 ,
514954535149 octets-1 octet grâce à officialaimm
-1 octet grâce à Shaggy
Essayez-le en ligne!
Imprime
0
lorsqu'il n'y a pas de solution.la source
0
poura=1
etb=2
; à partir des cas de test, il devrait sortir1
.2, 1
31,73714876143
.Japt ,
98 octetsPrend les entrées dans l'ordre inverse. Sorties
-1
pour aucune correspondance. Craps lorsque le plus grand entier devient plus grand.Essaye-le
la source
73714876143,31
semble produire une erreur de mémoire insuffisante sur Firefox (et planter Chromium). Je ne pense pas que ce soit une réponse valable.Python 3 + gmpy , 23 octets
Je ne pense pas que cela puisse devenir plus court en Python.
Essayez-le en ligne! (ne fonctionnera pas si vous n'avez pas installé gmpy)
la source
Python 3 , 49 octets
Essayez-le en ligne!
Python 3 , 50 octets
Essayez-le en ligne!
Cela jette
IndexError: list index out of range
dans le cas où il n'y a pas d'inverse multiplicatif modulaire, comme cela est autorisé par les règles.la source
31,73714876143
en 60 secondes (sur TIO).8e , 6 octets
Code
Explication
invmod
est un 8ème mot qui calcule la valeur de l'inverse dea
, modulob
. Il revientnull
en cas de débordement ou d'autres erreurs.Cas d'utilisation et de test
la source
Pari / GP , 22 octets
Lance une erreur lorsqu'il n'y a pas d'inverse.
Essayez-le en ligne!
la source
J , 28 octets
Essayez-le en ligne!
Utilise le théorème d'Euler . Renvoie 0 si l'inverse n'existe pas.
Explication
la source
Pyth , 10 octets
3 octets enregistrés grâce à @Jakube .
Essayez-le ici!
Résultats
-1
pour aucun inverse multiplicatif.Répartition du code
Pyth ,
1513 octetsLève une exception dans le cas où aucun inverse multiplicatif n'existe.
Essayez-le ici!
Pyth , 15 octets
Cela ajoute beaucoup d'octets pour gérer le cas où un tel nombre n'existe pas. Le programme peut être considérablement raccourci si ce cas n'a pas besoin d'être traité:
Essayez-le ici!
la source
KExm%*QdKK1
xm%*szdQQ1
C (gcc) , 115 octets
Essayez-le en ligne!
Algorithme euclidien étendu, version récursive
C (gcc) , 119 octets
Essayez-le en ligne!
Algorithme euclidien étendu, version itérative
la source
C (gcc) ,
48 110104 octetsEssayez-le en ligne!
Cela devrait fonctionner avec toutes les entrées (qui tiennent dans une longue) dans les 60 secondes.
Modifier. J'abuse déjà de la
n
variable, donc je pourrais aussi bien supposer que gcc place la première affectation%rax
.la source
f(3,1000001)
renvoie 717, ce qui est évidemment un non-sens (la bonne réponse est 333334). De plus, même si ce bogue a été corrigé en utilisant un type entier plus large, cette approche par force brute expirerait certainement pour certains des cas de test les plus importants donnés dans le défi.Python 2 + sympy, 74 octets
Essayez-le en ligne!
Tiré du code source de Jelly.
la source
Axiome, 45 octets
0 pour erreur sinon retourner z avec x * z Mod y = 1
la source
Python 2 , 52 octets
-3 octets grâce à M. Xcoder.
Essayez-le en ligne!
Sorties
False
sur aucune solution et erreurs surb
volume augmente.TIO intégré
Je teste simplement les iframes dans les extraits de pile et ils fonctionnent absolument fantastique.
Afficher l'extrait de code
la source
i*a%b
être0
?(31,73714876143)
.JavaScript (ES6),
42413938 octetsSorties
false
pour aucune correspondance. Lance une erreur de débordement lorsque le deuxième nombre devient trop grand.la source
Gelée , 27 octets
Essayez-le en ligne!
Utilise le théorème d'Euler avec une exponentiation modulaire. Étant donné que Jelly n'a pas de fonction intégrée pour effectuer l'exponentiation modulaire, il a dû être implémenté et a pris la plupart des octets.
la source
Axiome, 99 octets
il utilise la fonction h (); h (a, b) retourne 0 si erreur [n'existe pas inverse] sinon il retourne le z tel que a * z mod b = 1 Ce serait ok même si les arguments sont négatifs ...
ce serait la fonction générale egcd () qui retournera une liste d'int (donc ils peuvent aussi être négatifs)
voici comment l'utiliser
je trouve l'algo de base dans Internet à partir de https://pastebin.com/A13ybryc
la source