| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1214 人关注过本帖
标题:[求助]中国剩余定理问题
只看楼主 加入收藏
喝茶的小k
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-7-27
收藏
 问题点数:0 回复次数:3 
[求助]中国剩余定理问题

题目:
1)欧几里德算法求a,b的最大公约数;
2)扩展的欧几里德算法,求出gcd(a,b)和满足gcd(a,b)=ax+by的整数x和y;
3)求解模线性方程 ax ≡ b (mod n) 其中n>0;
4)求解模线性方程组(中国余数定理);
5)模取幂运算,计算ab mod n (a,b>1032);
6)Miller-Rabin随机性素数测试算法(要求判定n>1016);
#include<iostream.h>
#define num 3 //中国剩余定理中应用
#define w 1000 //中国剩余定理中应用
//-------------------------------目录函数------------------------------
void menu()
{
cout<<"请选择:"<<endl
<<"------------------------------------------------------------------------"<<endl
<<"(1) 欧几里德算法求a,b的最大公倍数:"<<endl
<<"(2) 扩展的欧几里德算法,求出gcd(m,n)和满足gcd(m,n)=am+bn的整数a和b"<<endl
<<"(3) 求解模线性方程 ax ≡ b (mod n) 其中n>0"<<endl
<<"(4) 求解模线性方程组(中国余数定理)"<<endl
<<"(5) 模取幂运算,计算ab mod n (a,b>1032)"<<endl
<<"(6) Miller-Rabin随机性素数测试算法(要求判定n>1016"<<endl
<<"------------------------------------------------------------------------"<<endl;
}

void swap(int *a, int *b)
{
int c=*a;
*a=*b;
*b=c;
}

//--------------------------欧几里德算法-----------------------------------
void GCD(int a,int b)
{
int c;
if(a<b)
swap(&a,&b);
{
if(b==0)
cout<<"GCD(a,b)="<<b<<endl;
else
{
for(c=a%b; c>0;c=a%b)
{
a=b;
b=c;
}
cout<<"GCD(a,b)="<<b<<endl
<<"------------------------------------------------------------------------"<<endl;
}
}
}


//--------------------------扩展欧几里德算法---------------------------------
void ex_GCD(int m,int n)
{
int c,d,a,b;
int a1=b=1;
int b1=a=0;

if(m<n)
{
int temp=m;m=n;n=temp;
}
c=m;d=n;
int q=c/d;
int r=c%d;
while(r!=0)
{
c=d; d=r;
int temp=a1;
a1=a; a=temp-q*a; temp=b1;
b1=b; b=temp-q*b;
q=c/d; r=c%d;
}
cout<<"ex-GCD(m,n)="<<d<<endl;
cout<<a<<"*m"<<" + "<<b<<"*n"<<" ="<<d<<endl
<<"------------------------------------------------------------------------"<<endl;
}


//----------------------中国剩余定理-------------------------------

void chinese_remainder(int m[],int u[])
{
int k,ch_va,count=0,x;
cout<<"X"<<"≡"<<"m[i]"<<"(mod"<<"u[i])"<<endl;
for(ch_va=0;ch_va<w;ch_va++)
{
k=0;
while(k!=0)
{
x=(ch_va%u[k++]==m[k++]&&ch_va%u[k++]==m[k++]);
}
if(x==1)
{
cout<<ch_va<<" "; count++;
if(count==5)
cout<<endl;
}
}
cout<<"------------------------------------------------------------------------"<<endl;
}


//--------------------主函数应用--------------------------------

void main()
{
int n,a,b;
char k='y';
menu();
while(k=='y')
{
cin>>n;
switch(n)
{
case 1:
cout<<"请输入a, b的值:";
cin>>a>>b;
GCD(a,b);
break;
case 2:
int m,n;
cout<<"输入m,n两个数字"<<endl;
cin>>m>>n;
ex_GCD(m,n);
break;
case 4:
int i,M[num],U[num];
cout<<"X"<<"≡"<<"m[i]"<<"(mod"<<"u[i])"<<endl
<<"请输入m[i]的值:"<<endl;
for(i=0;i<num;i++)
cin>>M[i];
cout<<"请输入u[i]的值:"<<endl;
for(i=0;i<num;i++)
cin>>U[i];
chinese_remainder(M,U);
break;

}
cout<<"是否继续 y or n?";
cin>>k;
cout<<"------------------------------------------------------------------------"<<endl;
}
}


问中国剩余定理部分出了什么错?在问一下5)模取幂运算,计算ab mod n (a,b>1032);
6)Miller-Rabin随机性素数测试算法(要求判定n>1016);的做法?
谢谢!

搜索更多相关主题的帖子: 中国剩余 定理 欧几里德 素数 算法 
2006-12-26 15:29
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 

k=0;
while(k!=0)

先让k=0,然后while当然是不会执行了……

[此贴子已经被作者于2006-12-27 8:55:28编辑过]


2006-12-27 08:54
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 
另外,中国剩余定理不是你这样算的。。。

2006-12-27 08:56
喝茶的小k
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-7-27
收藏
得分:0 
那要怎么解决啊?

2006-12-27 16:20
快速回复:[求助]中国剩余定理问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058702 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved