OneCompiler

Atividade 2 MD2

Questão 9 - Teorema Chines

#include <stdio.h>
#include <stdlib.h>

int mdc(int a, int b) {
if (b == 0)
return a;
return mdc(b, a % b);
}

int inverso_modular(int a, int m) {
int m0 = m, t, q;
int x0 = 0, x1 = 1;

if (m == 1)
    return 0;

while (a > 1) {
    q = a / m;
    t = m;

    m = a % m;
    a = t;

    t = x0;

    x0 = x1 - q * x0;
    x1 = t;
}

if (x1 < 0)
    x1 += m0;

return x1;

}

int teorema_chines_do_rest(int a[], int n[], int tamanho) {

// Passo 1: Calcular os mdc 
if (mdc(a[0], n[0]) != 1 || mdc(a[1], n[1]) != 1 || mdc(a[2], n[2]) != 1 || mdc(a[3], n[3]) != 1 || 
    mdc(n[0], n[1]) != 1 || mdc(n[0], n[2]) != 1 || mdc(n[0], n[3]) != 1 || mdc(n[1], n[2]) != 1 || mdc(n[1], n[3]) != 1 || mdc(n[2], n[3]) != 1) {
    printf("Não foi possivel calcular devido ao MDC ser diferente de 1 em algum caso.\n");
    exit(1); 
}

// Passo 2: Calcular N
int N = 1;
for (int i = 0; i < tamanho; i++) {
    N *= n[i];
}

int x = 0;

// Passo 3: Calcular Ni
for (int i = 0; i < tamanho; i++) {
    int Ni = N / n[i];
    int yi = inverso_modular(Ni, n[i]);
    x += a[i] * Ni * yi; //Passo 4: Calcular X
}

return x % N; // Passo 5: Retornar X mod N

}

int main() {
int a[4], n[4];
int tamanho = 4;

printf("Informe as equacoes no formato (a[i] mod n[i]):\n");
for (int i = 0; i < tamanho; i++) {
    printf("a[%d]: ", i + 1);
    scanf("%d", &a[i]);
    printf("n[%d]: ", i + 1);
    scanf("%d", &n[i]);
}

int resultado = teorema_chines_do_rest(a, n, tamanho);

printf("A solucao para o sistema de congruencias e: x = %d\n", resultado);

return 0;

}

#Questão 10 - RSA

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

long long potencia_modular(long long base, long long exp, long long mod) {
long long resultado = 1;
base = base % mod;

while (exp > 0) {
    if (exp % 2 == 1) {
        resultado = (resultado * base) % mod;
    }
    exp = exp >> 1;
    base = (base * base) % mod;
}

return resultado;

}

void criptografar(char *mensagem, int e, int n, int bloco) {
printf("Mensagem criptografada: ");

for (int i = 0; mensagem[i] != '\0'; i++) {
    int codigo = mensagem[i] - 'A'+1;

    long long criptografado = potencia_modular(codigo, e, n);

    char letra_criptografada = 'A' + (criptografado % 26);

    printf("%c", letra_criptografada);
}

printf("\n");

}

int main() {
int p, q, e, bloco;

printf("Digite p e q: ");
scanf("%d %d", &p, &q);

int n = p * q;  

printf("Digite um numero E: ");
scanf("%d", &e);

printf("Digite o tamanho do bloco: ");
scanf("%d", &bloco);

char mensagem[256];
printf("Digite a mensagem (somente letras maiusculas): ");
scanf("%s", mensagem);

criptografar(mensagem, e, n, bloco);

return 0;

}

#Questão 11 - ISBN e CPF

#include <stdio.h>

int calcular_digito_cpf(int cpf[], int peso_inicial) {
int soma = 0;
for (int i = 0; i < peso_inicial - 1; i++) {
soma += cpf[i] * (peso_inicial - i);
}
int resto = soma % 11;
return (resto < 2) ? 0 : 11 - resto;
}

int calcular_digito_isbn(int isbn[]) {
int soma = 0;
for (int i = 0; i < 9; i++) {
soma += isbn[i] * (i + 1);
}
int resto = soma % 11;
return (resto == 10) ? 'X' : resto;
}

int main() {
int opcao;

printf("1. Calcular CPF completo\n2. Calcular ISBN completo\n");
printf("Opcao: ");
scanf("%d", &opcao);

if (opcao == 1) {
    int cpf[11];

    printf("Digite os 9 primeiros digitos do CPF (sem pontos ou tracos): ");
    for (int i = 0; i < 9; i++) {
        scanf("%1d", &cpf[i]);
    }

    cpf[9] = calcular_digito_cpf(cpf, 10);
    cpf[10] = calcular_digito_cpf(cpf, 11);

    printf("CPF completo: ");
    for (int i = 0; i < 11; i++) {
        printf("%d", cpf[i]);
    }
    printf("\n");

} else if (opcao == 2) {
    int isbn[10];

    printf("Digite os 9 primeiros digitos do ISBN (sem tracos): ");
    for (int i = 0; i < 9; i++) {
        scanf("%1d", &isbn[i]);
    }

    int digito_verificador = calcular_digito_isbn(isbn);

    printf("ISBN completo: ");
    for (int i = 0; i < 9; i++) {
        printf("%d", isbn[i]);
    }
    if (digito_verificador == 'X') {
        printf("X");
    } else {
        printf("%d", digito_verificador);
    }
    printf("\n");

} else {
    printf("Opcao invalida.\n");
}

return 0;

}