CINTA 作业二:GCD与EGCD

CINTA 作业二:GCD与EGCD

1、Bezout定理的证明

设s=gcd(a,b),显然s|a且s|b
又因为r、s∈Z∗
因此s|ar、s|bs
显然要让前面的式子成立,则必然有d为a和b的公约数的倍数
又因为r、s∈Z+
因此d必定为a和b最大公约数的倍数
因此该定理成立

2、实现GCD算法的迭代版本

int gcd(int a, int b)
{
	while (b)
	{
		int temp = b;
		b = a % b;
		a = temp;
	}
	return a;
}

3、实现EGCD算法

用了数组储存返回的三个值

int* egcd(int a, int b)
{
	int arr[3] = { 0,0,0 };
	int r1 = 1;
	int r2 = 0;
	int s1 = 0;
	int s2 = 1;
	while (b)
	{
		int gcd = a % b;
		int q = a / b;
		int temp_a = a;
		a = b;
		b = temp_a % b;
		int temp_r1 = r1;
		r1 = r2;
		r2 = temp_r1-r2 * q;
		int temp_s1 = s1;
		s1 = s2;
		s2 = temp_s1 - s2 * q;
	}
	arr[0] = a;
	arr[1] = r1;
	arr[2] = s1;
	return arr;
}

4、实现GCD的批处理版本

版本一:数组实现(需要传入长度)

int arr_gcd(int *arr,int arrSize)
{
	if (arrSize == 0) return 0;//没有公因数
	if (arrSize == 1) return *arr;//公因数是自己
	if (arrSize == 2) return gcd(*arr, *(arr + 1));//两个就直接返回公因数
	int temp_gcd = gcd(*arr, *(arr + 1));
	for (int i = 2; i < arrSize; i++)
		temp_gcd = gcd(temp_gcd, arr[i]);
	return temp_gcd;
}

版本二:使用STL容器

int arr_gcd(vector<int> arr)
{
	int len = arr.size();
	if (len == 0) return 0;//没有公因数
	if (len== 1) return arr.front();//公因数是自己
	if (len == 2) return gcd(arr.front(),arr.back());//两个就直接返回公因数
	int temp_gcd = gcd(arr.front(), *(arr.begin() + 1));
	for (int i = 2; i < len; i++)
		temp_gcd = gcd(temp_gcd, arr[i]);
	return temp_gcd;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值