/****************************************************************************/
/* 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;
}