//求a,b的最大公约数,递归方法求,利用gcd(a,b)=gcd(b,a mod b);
//不一定要参数a大于b,因为如果a小于b,那么直接调用GCD(b,a),然后继续执行
iijuu uu
int GCD(int a, int b)
{
if (b == 0)
{
return a;
}
return GCD(b, a%b);
}
----------
//扩展欧几里得算法,求
// d=gcd(a,b)=a*x+b*y
int ExtendedEuclid(int a, int b, int& x, int& y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
else
{
int res = ExtendedEuclid(b, a%b, x, y);
int temp = x;
x = y;
y = temp - a / b*y;
return res;
}
}
----------
----------
用反复平方法求数的幂
//求a^b mod n
int ModularExponentiatiao(int a, int b, int n)
{
int c = 0;
int d = 1;
vector<int> bits;
while (b != 0)
{
bits.push_back(b % 2);
b /= 2;
}
int k = bits.size() - 1;
for (; k >= 0; --k)
{
c = 2 * c;
d = (d*d)%n;
if (bits[k] == 1)
{
c = c + 1;
d = (d*a) % n;
}
}
return d;
}
----------
----------
//伪素数测试--测试一个数是否是素数
//根据费马定理,如果n为素数,那么对任意一个素数a,满足a^(n-1) mod n=1;
//如果能找出一个素数a,使得不满足a^(n-1) mod n=1,那么n就当然是合数
//对a=2,如果不满足a^(n-1) mod n=1,那么n是合数,如果满足,猜测n为素数,出错的概率非常小。
bool PseudoPrime(int n)
{
if (ModularExponentiatiao(2, n - 1, n) != 1)
{
return false;
}
else
{
return true;
}
}
最大公约数等几个算法
最新推荐文章于 2022-03-03 22:21:04 发布