/****************************************************************************/ /* Inverso de una matriz 2x2 modulo un numero. */ /* */ /* Jaime Suarez <mcripto@bigfoot.com> 2003 */ /* en http://elparaiso.mat.uned.es */ /****************************************************************************/ #include <stdio.h> long coef1(long,long); long coef2(long,long); long invmod(long,long); main() { long a,b,c,d,m, det,invdet; printf("Inverso modulo un numero de una matriz 2x2\n"); printf("a11= "); scanf("%ld",&a); printf("a12= "); scanf("%ld",&b); printf("a21= "); scanf("%ld",&c); printf("a31= "); scanf("%ld",&d); printf("modulo m= "); scanf("%ld",&m); det=a*d-b*c; invdet=invmod(det,m); if (invdet==0) { printf("Matriz no inversible.\n"); return 0;} else { printf("Matriz inversa: \n"); printf("/ \\ \n"); printf("| %6d %6d | \n", (d*invdet)%m, (-b*invdet)%m ); printf("| %6d %6d | \n", (-c*invdet)%m, (a*invdet)%m ); printf("\\ /\n"); } return 0; } /*--------------------------------------------------------------------- Teorema de Bezout: si c=mcd(a,b) entonces existen enteros alfa y beta tales que c= alfa*a + beta*b ----------------------------------------------------------------------*/ long coef1(long a,long b) { if (a%b==0) return (0); else return (coef2(b,a%b)); } long coef2(long a, long b) { if (a%b==0) return(1); else return (coef1(b,a%b)- a/b *coef2(b,a%b)); } /*---------------------------------------------------------------------- Calculo del inverso modulo un entero. Suponiendo que 1=mcd(m,n) entonces existen enteros a y b tales que 1=m.a+n.b y por tanto a es un inverso de a mod n Devuelve el inverso de m modulo n o 0 si no es inversible. ----------------------------------------------------------------------*/ long invmod(long m,long n) { long a,b; a=coef1(m,n); b=coef2(m,n); if (m*a+n*b!=1) return 0; else return a; }