算法数学基础

Greatest Common Divisor最大公约数

一、辗转相除法
欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。
定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
设两数为a,b(a>b),用gcd(a,b)表示a,b的最大公约数,r=a mod b ------为a除以b以后的余数,k为a除以b的商,即a÷b=k…r。
辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc(m与n互质)
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互质
【否则,可设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd
而非c,与前面结论矛盾】,因此c也是b和r的最大公约数。
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

//递归处理
	int gcd(int a, int b)
	{
		return b ? gcd(b, a % b) : a;
	}
//辗转相除法
	int gcd(int a, int b)
	{
		int temp;
		while (b != 0)
		{
			temp = a % b;
			a = b;
			b = temp;
		}
		return a;
	}
//更相减损法
	int gcd(int a, int b)
	{
		if (a != b)
		{
			a > b ? a -= b : b -= a;
		}
		return a;
	}

最小公倍数

lcm(x, y) = x * y / gcd(x, y);

你可能感兴趣的:(算法)