Opção para permitir que o usuário digite a mensagem codificada. O programa deverá executar o processo de decodificação e mostrar na tela a mensagem gerada. Caso a matriz decodificadora
ainda não tenha sido armazenada, o programa deverá imprimir uma mensagem de erro, informando ao usuário que a matriz
deve ser cadastrada.
Passo 1
O enunciado pede uma opção do programa que permita ao usuário digitar uma mensagem codificada e que o programa faça a decodificação mostrando a mensagem resultante na tela. Se a matriz decodificadora
ainda não tiver sido armazenada, o programa deve imprimir uma mensagem de erro informando que a matriz
deve ser cadastrada.
Informações relevantes (explicitamente dadas ou necessárias para implementar a opção):
- Existe uma matriz decodificadora chamada
que, se cadastrada, será usada para transformar blocos da mensagem codificada em blocos da mensagem decodificada. - O programa deve detectar se
está cadastrada; se não estiver, exibir mensagem de erro clara: a matriz deve ser cadastrada. - O usuário irá “digitar a mensagem codificada” — o enunciado não especifica o formato exato dessa mensagem (sequência de números, sequência de caracteres já mapeados, presença de separadores, uso de aritmética modular etc.). Isso é relevante porque o programa precisa interpretar corretamente a entrada.
- É necessário que o programa verifique compatibilidade entre o tamanho dos blocos esperados por
e o tamanho da mensagem codificada (p. ex. comprimento múltiplo do tamanho do bloco) ou aplique um esquema de padding. - O enunciado não exige uma linguagem específica; deve-se apresentar procedimento/algoritmo (pseudocódigo) que implemente essa opção.
Passo 2
Entendimento teórico mínimo necessário (conceito-chave que o programa usa).
A ideia geral usada por esquemas de codificação por matrizes é a seguinte:
- A mensagem original é dividida em blocos de dimensão
e cada bloco de texto é transformado em um vetor numérico , (cada componente corresponde a um caractere segundo um mapeamento acordado). - A codificação normalmente produz um vetor cifrado
a partir de um vetor usando uma matriz de codificação :
- A decodificação usa uma matriz decodificadora
tal que, quando aplicada ao vetor cifrado, recupera o vetor original:
Isso acontece quando
é a inversa de
(no mesmo universo numérico em que
foi definida). Em notação:
O que cada símbolo significa:
-
: matriz de codificação (não necessariamente presente no momento do decode). -
: matriz de decodificação (deve estar previamente cadastrada no programa). -
: vetor coluna de componentes representando um bloco de texto claro (plaintext). -
: vetor coluna de componentes representando um bloco de texto codificado (ciphertext). -
: dimensão da matriz quadrada (então é e cada bloco tem números). - Se o esquema usa aritmética modular (por exemplo, cifra de Hill usa módulo
), as operações de multiplicação e soma são feitas módulo e deve ser a inversa de no anel .
Resumo prático: para decodificar, o programa deve pegar a sequência codificada, agrupá-la em blocos coluna
de tamanho
e calcular
(ou
se for modular). Depois mapear os números do vetor
de volta para caracteres.
Passo 3
Como representar a mensagem codificada na entrada e como o programa deve interpretar — opções e recomendação.
Possíveis formatos que o usuário pode digitar:
- Sequência de números inteiros separados por espaço/virgula: exemplo:
23 8 4 17 0 11.- Interpretação direta: cada número é uma componente do vetor
. É o formato mais direto se a codificação resultou em números.
- Interpretação direta: cada número é uma componente do vetor
- String de caracteres já “codificados” (por ex., letras que correspondem a números segundo algum mapa): exemplo:
X I E R A L.- O programa precisa aplicar o mesmo mapeamento usado na codificação (por exemplo,
ou etc.). É obrigatório que o programa saiba qual mapeamento foi usado.
- O programa precisa aplicar o mesmo mapeamento usado na codificação (por exemplo,
- Sequência em base64/hex/bytes — casos mais gerais, exigem decodificação prévia para uma sequência numérica.
Recomendação para a opção do programa na prova (simplifica implementação e é robusta):
- Exigir que o usuário digite a mensagem codificada como números inteiros separados por espaços (ou vírgulas). Isso evita ambiguidade.
- Se quiserem aceitar letras, o programa deve pedir que o usuário informe qual mapeamento foi usado ou usar um mapeamento padrão documentado.
Passo 4
Verificações que o programa deve fazer antes de tentar decodificar (lista de checagens e por que são importantes).
- Verificar se a matriz
está cadastrada/armazenada: - Se não estiver, imprimir exatamente a mensagem de erro exigida (algo como: “Erro: matriz
não cadastrada. Cadastre a matriz antes de decodificar.”) e abortar a operação.
- Se não estiver, imprimir exatamente a mensagem de erro exigida (algo como: “Erro: matriz
- Verificar se
é uma matriz quadrada e obter (número de linhas/colunas). - Se
não for quadrada, decodificação por blocos não faz sentido; tratar como erro.
- Se
- Ler a entrada da mensagem codificada e convertê-la em uma lista/array de números.
- Se a entrada não for numérica e nem existir um mapeamento conhecido, imprimir erro de formato.
- Verificar se o comprimento da lista de números é múltiplo de
. - Se não for, aplicar padding (ex.: adicionar zeros ou um símbolo de preenchimento conhecido) ou pedir ao usuário para ajustar. Para provas, explicar e usar padding com um valor claro (por exemplo, 0 ou o código de espaço).
- Em caso de aritmética modular, certificar-se do valor do módulo
e que os números estão no intervalo apropriado; caso contrário, reduzir módulo .
Passo 5
Como multiplicar a matriz
por um bloco coluna
— fórmula e explicação passo a passo para fazer à mão na prova.
Se
é
e
é vetor coluna
, a multiplicação
dá um vetor coluna
de
componentes. Para calcular a componente
-ésima de
:
Explicação detalhada:
-
é o elemento da linha e coluna da matriz . -
é o -ésimo elemento do vetor . - Multiplica-se cada elemento
pelo correspondente e soma-se todos os produtos para obter . - Repetir para
.
Se as operações forem em módulo
, calcular cada produto e soma e depois reduzir módulo
:
Quando for necessário retornar caracteres, mapear cada
para um caractere segundo o mapeamento adotado (por ex.,
ou outro).
Passo 6
Exemplo numérico completo (sem módulo) para fixar a técnica — mostra como computar passo a passo.
Suponha que a matriz
cadastrada seja
logo
. Suponha que o usuário digite a mensagem codificada como números: e
:
23 8 11 4. Interpretamos isso como dois blocos coluna
Decodificando bloco a bloco:
- Para
:
- Para
:
Se o mapeamento for
, então:
-
→ → “HI”. -
→ → “DE”.
Mensagem decodificada completa: “HIDE” (ou “HI DE” se separada por blocos). Esse exemplo mostrou passo a passo a multiplicação de linhas por colunas e o mapeamento final.]
Passo 7
Pseudocódigo robusto e didático (implementável em prova e em prática). Comentários explicativos acompanham cada etapa.
- Entrada esperada do usuário: sequência de números inteiros separados por espaço (forma recomendada).
- Pré-requisito: variável/estrutura
Barmazenada (matriz). Se não existir, imprimir erro.
Pseudocódigo:
function DecodificarMensagemEntrada():
- Se
Bnão existe então
imprimir “Erro: matriznão cadastrada. Cadastre a matriz antes de decodificar.”
retornar -
dimensão de B(número de linhas) - pedir ao usuário: “Digite a mensagem codificada (números separados por espaços):”
- ler a string de entrada
s - converter
sem lista de inteirosL(se falhar, imprimir “Formato inválido” e retornar) - se
então - perguntar se quer aplicar padding automático (ex.: adicionar zeros) ou retornar erro
- se escolher padding então adicionar números (por ex., zeros) até
ser múltiplo de - caso contrário retornar
- dividir
Lem blocos colunade tamanho , para - inicializar lista vazia
Ppara armazenar componentes decodificadas - para cada bloco
: - calcular
(para cada i dea : ) - se for esquema modular com módulo
então reduzir cada - se valores de
são reais aproximados, arredondar para o inteiro mais próximo - anexar os componentes de
à lista P
- calcular
- mapear cada número em
Ppara caractere segundo o mapeamento acordado (ex.:, …) - concatenar os caracteres resultantes numa string
mensagem_decodificada - imprimir “Mensagem decodificada:” seguido de
mensagem_decodificada - retornar
mensagem_decodificada
Complexidade: para
blocos e matriz
, o custo é
operações aritméticas (cada multiplicação de matriz por vetor leva
).
Passo 8
Casos especiais, erros comuns e dicas para a prova (para ganhar pontos e evitar pegadinhas).
- Se o enunciado especificou aritmética modular (por exemplo, cifra de Hill com módulo
), o candidato deve mencionar explicitamente que a multiplicação e soma são realizadas módulo e que deve ser a inversa de no módulo . Sem isso, os resultados estarão errados. - Validação de dimensão é obrigatória: se a matriz
é , a entrada numérica deve ser dividida em blocos de . Nunca tente multiplicar blocos de tamanho diferente sem redimensionar. - Ao lidar com números reais (se
tiver entradas não inteiras), depois da multiplicação pode ser necessário arredondar com tolerância (ex.: aceitar erro até antes de arredondar). - Use um mapeamento documentado e consistente (por exemplo, explique no programa qual mapeamento foi usado).
- Mensagens de erro devem ser claras e obedecer ao pedido do enunciado (no enunciado foi pedido: imprimir mensagem de erro informando que a matriz
deve ser cadastrada). - Para provas, é bom apresentar também um pequeno exemplo numérico (como o do Passo 6) para demonstrar que entendeu o procedimento inteiro.
Resposta
function DecodificarMensagemEntrada():
- if B não existe then
imprimir “Erro: matriznão cadastrada. Cadastre a matriz antes de decodificar.”
return -
dimensão de (número de linhas) - pedir ao usuário: “Digite a mensagem codificada (números inteiros separados por espaços):”
- ler string
s - tentar converter
sem lista de inteirosL
if falha então
imprimir “Formato inválido: entrada deve conter números inteiros separados por espaços.”
return - if
then
perguntar “Comprimento não múltiplo de. Aplicar padding com zeros? (s/n)”
if resposta = ‘s’ então
adicionar zeros emLatéser múltiplo de
else
imprimir “Operação cancelada. Ajuste o tamanho da mensagem codificada.”
return - dividir
Lem blocosde tamanho para - inicializar lista vazia
P - para k = 1 to K:
calcular vetorde tamanho por:
para i = 1 to n:
se esquema modular com móduloentão
para i = 1 to n:
senão
para i = 1 to n:arredondar( ) se necessário
anexar componentes deà lista P - mapear cada número em
Ppara caractere segundo mapeamento escolhido (ex.:) - concatenar caracteres em
mensagem_decodificada - imprimir “Mensagem decodificada:” e a
mensagem_decodificada - return
mensagem_decodificada