Beispiel #1
0
void MODULAR_EXPONENTIATION(int *a,int *b,int *n)
{
	BG d,z;
	int i;
	d[0]=1;d[1]=1;
	for(i=b[0];i>=1;i--)
	{
		mulbig(d,d,z);
		modbig(z,n,d);
		if(b[i]==1)
		{
			mulbig(d,a,z);
			modbig(z,n,d);
		}
	}
	cpybig(a,d);
}
/* modbig: if seq % n == 0 return 0,
 * else return 1 */
int modbig(int *seq, int digit, int n)
{
    int q[MAXD] = { 0 };
    int qd, i;

    qd = divbig(seq, digit, q, n);
    mulbig(q, qd, digit, n);

    return equalbig(seq, q, digit);
}
Beispiel #3
0
void egcdbig(int *a,int *b,int *d,int *x,int *xf,int *y,int *yf)
{
	static BG z[2000];
	static BG t;
	int f,now;
	now=++C;
	if(iszero(b)){cpybig(d,a);x[0]=x[1]=y[0]=1;y[1]=0;*xf=*yf=0;return;}
	divmodbig(a,b,z[now]);
	egcdbig(b,a,d,x,xf,y,yf);
	mulbig(z[now],y,t);
	cpybig(z[now],y);
	f=*yf;
	if(*xf==0 && *yf==0)
	{
		if(cmpbig(x,t)>=0)
			subbig(x,t,y);
		else
		{
			subbig(t,x,y);
			*yf=1;
		}
	}
	else if(*xf==0 && *yf==1)
	{
		addbig(x,t,y);
		*yf=0;
	}
	else if(*xf==1 && *yf==0)
	{
		addbig(x,t,y);
		*yf=1;
	}
	else if(*xf==1 && *yf==1)
	{
		if(cmpbig(x,t)>0)
			subbig(x,t,y);
		else
		{
			subbig(t,x,y);
			*yf=0;
		}
	}
	cpybig(x,z[now]);
	*xf=f;
}