⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crt.cpp

📁 RSA加密中的大整数运算
💻 CPP
字号:


int euclid(int d,int f)  //欧几里得算法(最大公约数)
{
 int m = d;
 int y = f;
 int r;
 while(1){
  if(y==0) return m;
  r = m % y;
  m = y;
  y = r;
 }
}


int extended_euclid(int d,int f)//扩展欧几里得算法(求逆元)
{
	int x1,x2,x3,y1,y2,y3,gcd,ni;
	x1=1;
	x2=0;
	x3=f;
	y1=0;
	y2=1;
	y3=d;
	int q,t1,t2,t3;
	while(1)
	{
/*		if(y3==0)
		{
			gcd=x3;
			ni=0;
			break;
		}*/
		if (y3==1)
		{
			gcd=y3;
			ni=y2;
			if(ni<0) ni+=f;
			return ni;
		}
		q=x3/y3;
		t1=x1-q*y1;
		t2=x2-q*y2;
		t3=x3-q*y3;

		x1=y1;
		x2=y2;
		x3=y3;

		y1=t1;
		y2=t2;
		y3=t3;
	}
	
/*	if (ni==0)
	{
		cout<<"gcd("<<d<<","<<f<<")="<<gcd<<endl;
		cout<<"无逆元"<<endl;
	}
	if (ni!=0)
	{
		cout<<"gcd("<<d<<","<<f<<")="<<gcd<<endl;
		cout<<d<<"^-1mod"<<f<<"="<<ni<<endl;
	}*/
}

string crtmain(char *p)
{
	int n=30,i,k,j;
	int *b=new int[n];
	int *m=new int[n];
	int *y=new int[n];
/*
	cout<<"输入方程的个数:";
	cin>>n;

	cout<<"请分别输入方程的b值和模m"<<endl;
	for(i=0;i<n;i++)
	{
		cin>>b[i];
		cin>>m[i];
	}*/
    
        int num=0;
		char temp[10];
		i=0,k=0;
		n=0;
        while(1)
        {
			while(p[i]<'0'||p[i]>'9')i++;
			j=0;
			while(p[i]>='0'&&p[i]<='9')temp[j++]=p[i++];
			temp[j]='\0';
            b[k]=atoi(temp);

			i+=3;
			j=0;
			while(p[i]>='0'&&p[i]<='9')temp[j++]=p[i++];
			temp[j]='\0';
            m[k++]=atoi(temp);
			n++;
			if(p[i]=='=')break;
         
        }   

	int M=1;
	for(i=0;i<n;i++)
	{
		M=M*m[i];
		for(int j=i+1;j<n;j++)
		{
			if(euclid(m[i],m[j])!=1)
			{
				cout<<"输入的m不是两两互素"<<endl;
				exit(0);
			}
		}
	}
	int x=0;
	for(i=0;i<n;i++)
	{
		y[i]=extended_euclid(M/m[i],m[i]);
		x=x+(b[i]*M*y[i]/m[i])%M;
	}
	x=x%M;
//	cout<<"方程组的结果为:x="<<x<<endl;
	delete []b;
	delete []m;
	delete []y;
	_itoa(x,temp,10);
      string result=temp;
	_itoa(M,temp,10);
	result+="mod";
	result+=temp;
	return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -