//欧几里得算法求最大公约数
int gcd(int m,int n)
{
int u0=m,u1=n,t;
if( u0<u1 )// 保证u0>=u1
u0^=u1,u1^=u0,u0^=u1;
while(u0%u1)
{
t=u1;
u1=u0%u1;
u0=t;
}
return u1;
}
//递归版本
int gcd(int m, int n)
{
return n==0?m:gcd(n,m%n);
}
//扩展欧几里得算法求ax+by==gcd(a,b)的解,其中g是最大公约数,此算法根据结论gcd(a,b)是a和b的最小的正线性组合得出(特殊情况,当gcd(a,b)为1时候,解x为a的逆元)
void gcdex(int m,int n, int& g,int & x,int& y)
{
if(n==0)
{
//gcd(m,0)=1*m-0*0=m
g=m; x=1; y=0;
}
else
{
gcdex(n,m%n,g,y,x);
y-=x*(m/n);
}
}
//求最小公倍数
//求n个数最小公倍数,(除去所有的公约数,就成了最小公倍)
int lcm(int val[],int n)
{
int res=1;
for (int i = 0;i < n;i ++)
for (int j = i + 1;j <= n;j++)
if (val[j] % val[i] == 0)
val[j] /= val[i];
for(int j=0; j<n; j++)
res*=val[j];
return res;
}
//以下介绍来自网络
RSA算法中利用欧几里得算法求d详细过程
RSA是第一个也是使用的最广泛的公钥加密算法,在1978年由R.Rivest、AdiShamir和Adleman三人发明,并以他们的名字命名。RSA算法的安全性基于大数因子分解的困难性,下面介绍一下它的基本原理:
1、生成公钥和私钥
(1)选取两个大素数:p和q;
(2)计算n=p*q;
(3)计算小于n并且与n互质的整数的个数,即欧拉函数Ø(n)=(p-1)*(q-1);
(4)随机选择加密密钥e,