Sua tarefa é fornecer dois números inteiros a
e b
calcular o inverso multiplicativo modular de um módulo b, se existir.
O inverso modular do a
módulo b
é um número c
tal que ac ≡ 1 (mod b)
. Este número é um módulo únicob
para qualquer par de a
e b
. Existe apenas se o maior divisor comum de a
e b
é 1
.
A página da Wikipedia para inverso multiplicativo modular pode ser consultada se você precisar de mais informações sobre o tópico.
Entrada e saída
A entrada é fornecida como dois números inteiros ou como uma lista de dois números inteiros. Seu programa deve gerar um único número, o inverso multiplicativo modular que está no intervalo0 < c < b
ou um valor indicando que não há inverso. O valor pode ser qualquer coisa, exceto um número no intervalo (0,b)
, e também pode ser uma exceção. O valor deve, no entanto, ser o mesmo para os casos em que não há inverso.
0 < a < b
pode ser assumido
Regras
- O programa deve terminar em algum momento e resolver cada caso de teste em menos de 60 segundos
- Aplicam-se brechas padrão
Casos de teste
Os casos de teste abaixo são fornecidos no 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
Pontuação
Este é o código de golfe, portanto o código mais curto para cada idioma vence.
Este e este são questões semelhantes, mas ambos pedir para situações específicas.
fonte
Respostas:
Mathematica, 14 bytes
Mathematica obrigatório incorporado :
É uma função que recebe dois argumentos (
a
eb
) e retorna o inverso de um mod b, se existir. Caso contrário, ele retornará o erroModularInverse: a is not invertible modulo b.
.fonte
JavaScript (ES6),
79736261 bytesDevoluções
false
se o inverso não existir.Ele usa o algoritmo euclidiano estendido e resolve todos os casos de teste quase instantaneamente.
Casos de teste
Mostrar snippet de código
fonte
f(x,y)
é sempre analisado como uma chamada de função, exceto se for explicitamente precedido pelafunction
palavra - chave. Uma função de seta anônima, por outro lado, é declarada como(x,y)=>something
ef=(x,y)=>something
atribui a função àf
variável.Geléia , 2 bytes
Experimente online!
Isso usa um built-in para inverso modular e retorna 0 para nenhum inverso modular.
Geléia , 7 bytes
Experimente online!
Produz um conjunto vazio (representado como sequência vazia) em nenhum inverso modular. Fica sem memória no TIO para os maiores casos de teste, mas deve funcionar com memória suficiente.
Como funciona
Se você deseja trabalhar para casos de teste maiores, tente esta versão (relativamente não-destruída), que requer muito tempo e não memória:
Geléia, 9 bytes
Experimente online!
Como funciona
fonte
Python 2 , 34 bytes
Experimente online!
Função recursiva que dá
True
paraprint f(1,2)
, que eu acredito para ser aceitável, e erros de entradas inválidas.Estamos tentando encontrarx em a ⋅x≡1(modb ) .
Isso pode ser escrito comoa ⋅ x - 1 = k ⋅ b ondek é um número inteiro.
Levandomoda isto dá−1≡k⋅b(moda) . Mover o sinal de menos dá−k⋅b≡1(moda) , onde temos que resolverk .
Vendo como ele se assemelha ao cenário inicial, permita-nos recuar para resolverk chamando a função com f(−b%a,a) (funciona porque o Python fornece valores positivos para o módulo com argumento negativo).
O programa se repete até quea se torne 1, o que só acontece se o original a e b são coprime entre si (ou seja, existe um inverso multiplicativo) ou termina em um erro causado pela divisão por 0.
Este valor dek pode ser substituído na equação a⋅x−1=k⋅b para dar x como k⋅b+1a .
fonte
Números R + , 15 bytes
retorna
NA
para aquelesa
sem inversos modb
.R-Fiddle para experimentá-lo!
R , 33 bytes (não concorrente)
Isso falhará em muito grande,
b
pois na verdade cria um vetor de32*b
bits de tamanho .Experimente online!
Retorna
integer(0)
(uma lista vazia) para aquelesa
sem inversões modb
.fonte
Mathematica, 18 bytes
entrada
fonte
Python 2 ,
514954535149 bytes-1 byte graças a officialaimm
-1 byte graças a Shaggy
Experimente online!
Imprime
0
quando não há solução.fonte
0
paraa=1
eb=2
; dos casos de teste, ele deve ser gerado1
.2, 1
31,73714876143
.Japonês ,
98 bytesToma as entradas na ordem inversa. Saídas
-1
sem correspondência. Craps como o número inteiro maior fica maior.Teste-o
fonte
73714876143,31
parece produzir um erro de falta de memória no Firefox (e travar o Chromium). Não acho que seja uma resposta válida.Python 3 + gmpy , 23 bytes
Eu não acho que pode ficar mais curto em Python.
Experimente online! (não funcionará se você não tiver o gmpy instalado)
fonte
Python 3 , 49 bytes
Experimente online!
Python 3 , 50 bytes
Experimente online!
Isso
IndexError: list index out of range
ocorre caso não haja inverso multiplicativo modular, como é permitido pelas regras.fonte
31,73714876143
em 60 segundos (no TIO).8 , 6 bytes
Código
Explicação
invmod
é uma oitava palavra que calcula o valor do inverso dea
, módulob
. Retornanull
em excesso ou em outros erros.Casos de uso e teste
fonte
Pari / GP , 22 bytes
Lança um erro quando não há inverso.
Experimente online!
fonte
J , 28 bytes
Experimente online!
Usa o teorema de Euler . Retorna 0 se o inverso não existir.
Explicação
fonte
Pitão , 10 bytes
3 bytes salvos graças ao @Jakube .
Experimente aqui!
Retorna
-1
para nenhum inverso multiplicativo.Repartição do código
Pitão ,
1513 bytesLança uma exceção caso não exista inversa multiplicativa.
Experimente aqui!
Pitão , 15 bytes
Isso adiciona muitos bytes para lidar com o caso em que esse número não existe. O programa pode ser reduzido significativamente se esse caso não precisar ser tratado:
Experimente aqui!
fonte
KExm%*QdKK1
xm%*szdQQ1
C (gcc) , 115 bytes
Experimente online!
Algoritmo euclidiano estendido, versão recursiva
C (gcc) , 119 bytes
Experimente online!
Algoritmo euclidiano estendido, versão iterativa
fonte
C (gcc) ,
48 110104 bytesExperimente online!
Isso deve funcionar com todas as entradas (que cabem em um longo) em 60 segundos.
Editar. Já estou abusando da
n
variável, portanto, posso assumir que o gcc coloca a primeira atribuição%rax
.fonte
f(3,1000001)
retorna 717, o que obviamente não faz sentido (a resposta correta é 333334). Além disso, mesmo que esse bug fosse corrigido usando um tipo inteiro mais amplo, essa abordagem de força bruta certamente atingiria o tempo limite para alguns dos casos de teste maiores apresentados no desafio.Python 2 + sympy, 74 bytes
Experimente online!
Retirado do código-fonte Jelly.
fonte
Axioma, 45 bytes
0 para outro erro, retorne z com x * z Mod y = 1
fonte
Python 2 , 52 bytes
-3 bytes graças ao Sr. Xcoder.
Experimente online!
Saídas
False
sem solução e erros à medida queb
aumenta.TIO incorporado
Estou apenas testando iframes no Stack Snippets e eles funcionam absolutamente fantásticos.
Mostrar snippet de código
fonte
i*a%b
ser0
?(31,73714876143)
.JavaScript (ES6),
42413938 bytesSaídas
false
sem correspondência. Irá gerar um erro de estouro quando o segundo número for muito grande.fonte
Gelatina , 27 bytes
Experimente online!
Usa o teorema de Euler com exponenciação modular. Como o Jelly não possui um built-in para executar exponenciação modular, ele teve que ser implementado e levou a maior parte dos bytes.
fonte
Axioma, 99 bytes
usa a função h (); h (a, b) retorna 0 se o erro [não existe inverso], caso contrário, ele retorna z de modo que a * z mod b = 1 Isso seria bom mesmo que os argumentos fossem negativos ...
essa seria a função egcd () geral que executa novamente uma lista de int (para que também possam ser negativas)
é assim que usá-lo
eu acho o algo básico na internet em https://pastebin.com/A13ybryc
fonte