/****************************************************************************/
/* Exponenciación modular                                                   */
/* Entrada: x base, y exponente, n modulo                                   */
/* Salida : x elevado a y modulo n                                          */
/* Notas  : no se comprueban errores de desbordamiento, que se              */
/*          produciran con enteros "grandes".                               */
/*                                                                          */
/* Jaime Suarez <mcripto@bigfoot.com> 2003                                  */
/* en http://elparaiso.mat.uned.es                                            */
/****************************************************************************/

unsigned long exp_mod(unsigned long x, unsigned long y, unsigned long n)
{
	unsigned long s,t,u;
	int i;

	s=1; t=x; u=y;
	while(u) {
		if (u&1) s=(s*t)%n;
		u>>=1;
		t=(t*t)%n;
	}
	return s;
}