Solucionador de logaritmo discreto
Ao perguntar qual potência de 2 deixa 5 módulo 13, você obtém 9, porque 2^9 ≡ 5 (mod 13). Digite uma base, um alvo e um módulo primo para achar o menor expoente, com uma igualdade que você pode conferir. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- G
- 2
- H
- 5
- Potência (W)
- 13
- X
- 9
- Equação
- 2^9 ≡ 5 (mod 13)
O problema do logaritmo discreto pede um inteiro x tal que uma dada base g elevada a x seja congruente a um alvo h módulo um primo p. Ele sustenta a troca de chaves Diffie–Hellman, a cifra ElGamal e muitos exercícios de livro-texto em criptografia algébrica. Esta capacidade implementa o algoritmo clássico passo de bebê e passo de gigante: uma busca determinística de tempo raiz quadrada que recupera o menor expoente não negativo ou prova que h não é uma potência de g no grupo multiplicativo módulo p.
O que o logaritmo discreto pede
Dados inteiros g, h e um primo p, o logaritmo discreto de h na base g módulo p é qualquer inteiro x que satisfaça g elevado a x congruente a h módulo p. Quando existe solução, o menor representante não negativo na faixa de zero a p menos dois é único uma vez que você fixe essa faixa, e é o valor que esta ferramenta retorna.
Diferente dos logaritmos reais comuns, não há fórmula elementar em forma fechada que funcione para primos arbitrários; a dificuldade de recuperar x para primos grandes cuidadosamente escolhidos é exatamente por que a criptografia de log discreto é útil. No ensino e em experimentos de parâmetros pequenos, porém, você ainda precisa de um solucionador correto e inspecionável: um que valide a hipótese de primalidade, reduza as entradas ao sistema canônico de resíduos, busque sistematicamente e imprima um expoente verificável ou afirme claramente que não existe solução.
Como o passo de bebê e passo de gigante encontra x
O passo de bebê e passo de gigante reescreve o expoente desconhecido como x igual a i vezes m mais j, onde m é aproximadamente a raiz quadrada da ordem do grupo p menos um, e tanto i quanto j vão de zero até m. O algoritmo primeiro armazena cada valor de bebê g elevado a j módulo p num mapa de hash indexado pelo resíduo, depois caminha em passos de gigante multiplicando repetidamente o alvo pelo inverso modular de g elevado a m, procurando cada resíduo intermediário no mapa.
Um acerto fornece tanto i quanto j e, portanto, x. Bases e alvos fora de zero a p menos um são reduzidos módulo p, e a resposta ecoa g, h e p reduzidos para que os chamadores auditem a instância exata resolvida.
Entradas, limites, preço e quando não há solução
Os campos obrigatórios são g (base), h (resíduo alvo) e p (módulo primo). Strings de dígitos são aceitas para inteiros grandes dentro do limite do módulo. Se h não está no subgrupo cíclico gerado por g módulo p — por exemplo, quando g gera apenas um subgrupo próprio e h está fora dele — o solucionador retorna solved false com um expoente nulo e uma mensagem explicativa, em vez de fabricar um x errado.
Esse desfecho é uma computação bem-sucedida, não um erro de cliente, porque a entrada estava bem formada e a resposta matemática é que nenhum logaritmo existe. Erros de cliente cobrem campos ausentes, não inteiros, módulos fora da faixa permitida e p composto. A ferramenta no navegador roda a biblioteca idêntica de graça, sem conta.
Use o resultado para conferir exercícios, gerar testes de resposta conhecida para bibliotecas de criptografia, ou explorar a pertinência a subgrupos antes de escalar parâmetros num projeto de protocolo real.
Casos de uso
Verificação de exercícios e provas
Estudantes e professores conferem exercícios de log discreto como 2^x ≡ 5 (mod 13) e recebem tanto o expoente quanto uma congruência imprimível para o gabarito.
Testes de resposta conhecida para código de criptografia
Autores de bibliotecas alimentam instâncias de corpo primo pequeno na CI para que a exponenciação modular e os auxiliares de inverso permaneçam consistentes com uma referência BSGS independente.
Experimentos de pertinência a subgrupos
Pesquisadores testam bases e alvos candidatos módulo um primo pequeno para ver se h está no subgrupo gerado por g antes de passar a parâmetros de tamanho de produção.
Perguntas frequentes
Qual algoritmo vocês usam?
Passo de bebê e passo de gigante (Shanks). Ele encontra o menor x não negativo com g^x ≡ h (mod p) em tempo e memória de aproximadamente O(√p), após uma verificação de primalidade determinística em p.
O que acontece se p não for primo?
Esta ferramenta define o log discreto no grupo multiplicativo de um corpo primo e não vai operar em silêncio módulo um composto.
E se não existir expoente?
Você recebe solved: false e x: null com uma mensagem curta. Esse é um desfecho matemático válido (h não é potência de g mod p), não um erro de cobrança ou validação.
Como resolvo 2^x ≡ 5 (mod 13)?
Digite 2 como base, 5 como alvo e 13 como módulo primo. A resposta é 9: ao elevar 2 à nona potência e dividir por 13, sobra resto 5, e nenhum expoente menor consegue isso.
Qual o tamanho máximo do módulo primo?
Até cerca de um trilhão. Isso atende tarefas, explicações de protocolos e experimentos pequenos com resposta rápida; não foi feito para os primos enormes que protegem a criptografia real.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/numth/discrete-log \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"g":2,"h":5,"p":13}'const res = await fetch("https://api.kit.forhosting.com/numth/discrete-log", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"g": 2,
"h": 5,
"p": 13
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/numth/discrete-log",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"g": 2,
"h": 5,
"p": 13
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/numth/discrete-log", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"g":2,"h":5,"p":13}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"g":2,"h":5,"p":13}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/numth/discrete-log", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"g": 2,
"h": 5,
"p": 13
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "numth.discrete_log",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_p | 1000000000007 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Você fornece três inteiros — g, h e um módulo primo p — e recebe uma resposta JSON estruturada com a solução, os resíduos reduzidos e uma equação de verificação quando existe solução.
O que o logaritmo discreto pede
Esse é o contrato deste endpoint: aritmética modular pura, sem heurísticas e sem chamadas de rede.
Como o passo de bebê e passo de gigante encontra x
O método usa da ordem de raiz quadrada de p multiplicações e entradas de mapa, e é por isso que esta capacidade limita o módulo primo perto de um trilhão: grande o bastante para exercícios, demonstrações de protocolo e testes de estresse de subgrupos pequenos, mas limitado para que memória e latência fiquem previsíveis em um Worker. Antes de buscar, o solucionador roda um teste de primalidade determinístico de Miller–Rabin em p; se p for composto, a chamada falha com invalid_input em vez de inventar um logaritmo numa estrutura que não é o grupo multiplicativo do corpo primo.
Entradas, limites, preço e quando não há solução
O preço da API é um valor fixo de US$ 0,002 por requisição bem-sucedida na unidade item; a validação que falha não é cobrada.
Perguntas técnicas
Como resolvo um logaritmo discreto com esta API?
Faça POST dos inteiros g, h e do primo p ao endpoint de logaritmo discreto (ou use o formulário gratuito do navegador). A resposta inclui solved, o expoente x quando existe, os resíduos reduzidos e uma equação de verificação.
Quanto custa a API?
A ferramenta do navegador é gratuita. A API cobra US$ 0,002 por requisição bem-sucedida do seu saldo pré-pago do KIT; entrada inválida não é cobrada. Nenhuma assinatura é exigida.