CINTA作业二:GCD与EGCD

1、给出Bezout定理的完整证明

求证:a、b是非零整数,存在整数r、s使得gcd(a,b)=ar+bs

设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 x, int y)
{
	if (x < y) {swap(x, y);}
	int tep = 0;
	while (y != 0)
	{
		tep = x % y;
		x = y;
		y = tep;
	}
	return x;
}

3、实现EGCD算法。输入:a、b两个整数,输出:r、s、d三个整数,满足ar + bs =d

int *egcd(int a,int b)
{
	int r0=1;
    int r1=0;
    int s0=0;
    int s1=1;
	while(b!=0)
	{
		int q=a/b;
		int r_tmp=r0;
        int s_tmp=s0;
		a=b;
		b=a%b;
		r0=r1;
		r1=r_tmp-q*r1;
		s0=s1;
		s1=s_tmp-q*s1;	
	}
	int *arr = new int[3];
 	arr[0] = a;
 	arr[1] = r0;
 	arr[2] = s0;
	return arr;
}

4、实现一种批处理版本的GCD算法,即,给定一个整数数组,输出其中所有整数的最大公因子。输入:一个整数数组a;输出:一个整数d,是a数组中所有整数的最大公因子

int gcd(int x, int y)
{
	if (x < y) {swap(x, y);}
	int tep = 0;
	while (y != 0)
	{
		tep = x % y;
		x = y;
		y = tep;
	}
	return x;
}

int bgcd(int num[], int n)
{
	int tep = num[0];
	for (int i = 0; i < n - 1; ++i)
	{
		tep = gcd(tem, num[i + 1]);
	}
	return tep;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值