Questão 10 - Teorema Chinês
Gustavo Abrantes de Souza - 212008160
#include <stdio.h>
// Função para calcular o inverso modular de a mod m
int inversoModular(int a, int m) {
a = a % m;
for (int x = 1; x < m; x++) {
if ((a * x) % m == 1)
return x;
}
return -1; // Se não existir inverso
}
// Função para resolver o sistema de congruências usando o Teorema Chinês do Resto
int teoremaChines(int n[], int a[], int k, int *N) {
*N = 1; // Produto de todos os n_i -> N = n1.n2.n3
for (int i = 0; i < k; i++) {
*N *= n[i];
}
int X = 0;
for (int i = 0; i < k; i++) {
int Ni = *N / n[i]; // Calculo dos N1, N2, N3, na qual é dado por -> N/n_i
int Xi = inversoModular(Ni, n[i]); // Inverso de Ni módulo n_i, na qual é dado por Ni.Xi ≡ 1 (mod ni)
if (Xi == -1) {
printf("Erro: Nao existe inverso modular para %d modulo %d\n", Ni, n[i]);
return -1;
}
// Calculo do X -> X ≡ (a1.X1.N1 + a2.X2.N2 + a3.X3.N3) mod N
X += a[i] * Ni * Xi;
}
return X % (*N);
}
int main() {
int n[4], a[4];
int k, N;
// Leitura do número de equações (máximo 4)
printf("Digite o numero de equacoes (ate 4): ");
scanf("%d", &k);
if (k > 4) {
printf("Numero maximo de equacoes e 4.\n");
return 1;
}
// Leitura dos módulos (n_i) e dos restos (a_i), seguindo o formato
// X ≡ a1 (mod n1)
// X ≡ a2 (mod n2)
// X ≡ a3 (mod n3)
for (int i = 0; i < k; i++) {
printf("Digite n[%d] (modulo da equacao %d): ", i + 1, i + 1);
scanf("%d", &n[i]);
printf("Digite a[%d] (resto da equacao %d): ", i + 1, i + 1);
scanf("%d", &a[i]);
}
// Chamando a função para calcular o resultado
int result = teoremaChines(n, a, k, &N);
if (result != -1) {
printf("A solucao do sistema de congruencias e X = %d (mod %d)\n", result, N);
}
return 0;
}