Su tarea es dar dos números enteros a
y b
calcular el inverso multiplicativo modular de un módulo b, si existe.
El inverso modular del a
módulo b
es un número c
tal que ac ≡ 1 (mod b)
. Este número es un módulo único b
para cualquier par de a
y b
. Existe solo si el máximo común divisor de a
y b
es 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 < b
o 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 (
a
yb
), 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
false
si 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 lafunction
palabra clave. Una función de flecha anónima, por otro lado, se declara como(x,y)=>something
yf=(x,y)=>something
asigna la función a laf
variable.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
True
porprint 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
NA
para aquellosa
sin inversos modb
.R-Fiddle para probarlo!
R , 33 bytes (no competitivos)
Esto fallará en muy grande
b
ya que en realidad crea un vector de32*b
bits de tamaño .Pruébalo en línea!
Devuelve
integer(0)
(una lista vacía) para aquellosa
sin 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
0
cuando no hay solución.fuente
0
fora=1
andb=2
; from the test cases, it should output1
.2, 1
31,73714876143
.Japt,
98 bytesTakes the inputs in reverse order. Outputs
-1
for no match. Craps out as the bigger integer gets larger.Test it
fuente
73714876143,31
seems 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 range
in case there is no modular multiplicative inverse, as it is allowed by the rules.fuente
31,73714876143
in 60 seconds (on TIO).8 , 6 bytes
Código
Explicación
invmod
es una octava palabra que calcula el valor de la inversa dea
, módulob
. Vuelvenull
en 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
-1
para 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%*QdKK1
xm%*szdQQ1
C (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
n
variable, 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
False
sin solución y errores a medida queb
aumenta.TIO integrado
Solo estoy probando iframes en Stack Snippets y funcionan absolutamente fantástico.
Mostrar fragmento de código
fuente
i*a%b
ser0
?(31,73714876143)
.JavaScript (ES6),
42413938 bytesSalidas
false
para 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