Su tarea es dar dos números enteros ay bcalcular el inverso multiplicativo modular de un módulo b, si existe.
El inverso modular del amódulo bes un número ctal que ac ≡ 1 (mod b). Este número es un módulo único bpara cualquier par de ay b. Existe solo si el máximo común divisor de ay bes 1.
La página de Wikipedia para el inverso multiplicativo modular se puede consultar si necesita más información sobre el tema.
Entrada y salida
La entrada se da como dos enteros o como una lista de dos enteros. Su programa debe generar un solo número, el inverso multiplicativo modular que se encuentra en el intervalo 0 < c < bo un valor que indique que no hay inverso. El valor puede ser cualquier cosa, excepto un número en el rango (0,b), y también puede ser una excepción. Sin embargo, el valor debe ser el mismo para los casos en los que no hay inversa.
0 < a < b se puede suponer
Reglas
- El programa debe finalizar en algún momento y debe resolver cada caso de prueba en menos de 60 segundos.
- Se aplican lagunas estándar
Casos de prueba
Los casos de prueba a continuación se dan en el formato, 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
Tanteo
Este es el código de golf, por lo que gana el código más corto para cada idioma.
Esta y esta son preguntas similares, pero ambas solicitan situaciones específicas.
fuente

Respuestas:
Mathematica, 14 bytes
Obligatorio Mathematica incorporado :
Es una función que toma dos argumentos (
ayb), y devuelve el inverso de un mod b si existe. Si no, devuelve el errorModularInverse: a is not invertible modulo b..fuente
JavaScript (ES6),
79736261 bytesDevuelve
falsesi el inverso no existe.Utiliza el algoritmo Euclidiano extendido y resuelve todos los casos de prueba casi al instante.
Casos de prueba
Mostrar fragmento de código
fuente
f(x,y)siempre se analiza como una llamada de función, excepto si está precedido explícitamente por lafunctionpalabra clave. Una función de flecha anónima, por otro lado, se declara como(x,y)=>somethingyf=(x,y)=>somethingasigna la función a lafvariable.Jalea , 2 bytes
Pruébalo en línea!
Esto utiliza un builtin para el inverso modular, y devuelve 0 para ningún inverso modular.
Jalea , 7 bytes
Pruébalo en línea!
Emite un conjunto vacío (representado como una cadena vacía) en ningún inverso modular. Se queda sin memoria en TIO para los casos de prueba más grandes, pero debería funcionar con suficiente memoria.
Cómo funciona
Si desea trabajar para casos de prueba más grandes, intente esta versión (relativamente sin golf), que requiere mucho tiempo en lugar de memoria:
Jalea, 9 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python 2 , 34 bytes
Pruébalo en línea!
Función recursiva que da
Trueporprint f(1,2)que yo creo que es aceptable, y los errores de entradas no válidas.Estamos tratando de encontrarx en a⋅x≡1(modb) .
Tomandomoda −1≡k⋅b(moda) −k⋅b≡1(moda) k
fuente
Números R + , 15 bytes
vuelve
NApara aquellosasin inversos modb.R-Fiddle para probarlo!
R , 33 bytes (no competitivos)
Esto fallará en muy grande
bya que en realidad crea un vector de32*bbits de tamaño .Pruébalo en línea!
Devuelve
integer(0)(una lista vacía) para aquellosasin mod inversob.fuente
Mathematica, 18 bytes
input
fuente
Python 2 ,
514954535149 bytes-1 byte gracias a officialaimm
-1 byte gracias a Shaggy
Pruébalo en línea!
Imprime
0cuando no hay solución.fuente
0fora=1andb=2; from the test cases, it should output1.2, 131,73714876143.Japt,
98 bytesTakes the inputs in reverse order. Outputs
-1for no match. Craps out as the bigger integer gets larger.Test it
fuente
73714876143,31seems to produce an out-of-memory error on Firefox (and to crash Chromium). I don't think this is a valid answer.Python 3 + gmpy, 23 bytes
I don't think it can get any shorter in Python.
Try it online! (won't work if you do not have gmpy installed)
fuente
Python 3, 49 bytes
Try it online!
Python 3, 50 bytes
Try it online!
This throws
IndexError: list index out of rangein case there is no modular multiplicative inverse, as it is allowed by the rules.fuente
31,73714876143in 60 seconds (on TIO).8 , 6 bytes
Código
Explicación
invmodes una octava palabra que calcula el valor de la inversa dea, módulob. Vuelvenullen desbordamiento u otros errores.Uso y casos de prueba
fuente
Pari / GP , 22 bytes
Lanza un error cuando no hay inverso.
Pruébalo en línea!
fuente
J , 28 bytes
Pruébalo en línea!
Utiliza el teorema de Euler . Devuelve 0 si el inverso no existe.
Explicación
fuente
Pyth , 10 bytes
3 bytes guardados gracias a @Jakube .
Pruébalo aquí!
Devoluciones
-1para no inversa multiplicativa.Desglose de código
Pyth ,
1513 bytesLanza una excepción en caso de que no exista inverso multiplicativo.
Pruébalo aquí!
Pyth , 15 bytes
Esto agrega muchos bytes para manejar el caso donde no existe dicho número. El programa puede acortarse significativamente si no fuera necesario manejar ese caso:
Pruébalo aquí!
fuente
KExm%*QdKK1xm%*szdQQ1C (gcc) , 115 bytes
Pruébalo en línea!
Algoritmo euclidiano extendido, versión recursiva
C (gcc) , 119 bytes
Pruébalo en línea!
Algoritmo euclidiano extendido, versión iterativa
fuente
C (gcc) ,
48 110104 bytesPruébalo en línea!
Esto debería funcionar con todas las entradas (que caben dentro de un largo) en 60 segundos.
Editar. Ya estoy abusando de la
nvariable, así que podría suponer que gcc pone la primera asignación%rax.fuente
f(3,1000001)devuelve 717, lo que obviamente no tiene sentido (la respuesta correcta es 333334). Además, incluso si este error se solucionó utilizando un tipo entero más amplio, este enfoque de fuerza bruta sin duda agotaría el tiempo para algunos de los casos de prueba más grandes dados en el desafío.Python 2 + sympy, 74 bytes
Pruébalo en línea!
Tomado del código fuente de Jelly.
fuente
Axioma, 45 bytes
0 por error, de lo contrario, devuelva z con x * z Mod y = 1
fuente
Python 2 , 52 bytes
-3 bytes gracias al Sr. Xcoder.
Pruébalo en línea!
Salidas
Falsesin solución y errores a medida quebaumenta.TIO integrado
Solo estoy probando iframes en Stack Snippets y funcionan absolutamente fantástico.
Mostrar fragmento de código
fuente
i*a%bser0?(31,73714876143).JavaScript (ES6),
42413938 bytesSalidas
falsepara ninguna coincidencia. Lanzará un error de desbordamiento cuando el segundo número sea demasiado grande.fuente
Jalea , 27 bytes
Pruébalo en línea!
Utiliza el teorema de Euler con exponenciación modular. Como Jelly no tiene un generador incorporado para realizar la exponenciación modular, tuvo que implementarse y tomó la mayoría de los bytes.
fuente
Axioma, 99 bytes
usa la función h (); h (a, b) devuelve 0 si el error [no existe inverso] de lo contrario, devuelve la z tal que a * z mod b = 1 Esto estaría bien incluso si los argumentos son negativos ...
esta sería la función general egcd () que retunr una lista de int (por lo que también pueden ser negativos)
así es como lo usas
Encuentro la base algo en internet desde https://pastebin.com/A13ybryc
fuente