Number Theory 4.1 Divisibility
哈哈,第一篇,试写....
最熟悉的一个概念,最大公约数gcd,k/m 表示k能除尽m
注意“k能除尽m”和“m是k的倍数”并不完全一样,如k=0
gcd(m, n) = max{k| k/m and k/n}; ①
欧几里德算法的递归形式:
gcd(0, n) = n;
gcd(m, n) = gcd(n%m, m); m > 0 ②
还有一种扩展形式:
xm + yn = gcd(m, n);
这个x,y得出有个很美妙的递归求法。假定 n>m≥0,x1m + y1n = gcd(m, n);
1)当m=0时,x1=0,y1=1是它其中的一组可能解。
2)假设 r=n%m,则有 gcd(r, m) = x2r + y2m;
根据②可知 gcd(r, m) = gcd(m, n);
则有 x1m + y1n = x2r + y2m; ③
因为 r = n%m = n - [n/m]*m;
③可得 x1m + y1n = x2(n - [n/m]*m) + y2m = x2n + (y2 - [n/m]*x2)m;
则有解 y1 = x2; x1 = y2 - [n/m]*x2;
可以看出x2, y2交叉赋值给y1, x1。
这样就得到了扩展欧几里德算法。
//
extended_euclid(m, n) = mx + ny
int extended_euclid( int m, int n, int & x, int & y)
... {
if(m == 0) ...{
x = 0;
y = 1;
return n;
}
int gcd = extended_euclid(n%m ,m ,y ,x);
x -= n/m * y;
return gcd;
}
int extended_euclid( int m, int n, int & x, int & y)
... {
if(m == 0) ...{
x = 0;
y = 1;
return n;
}
int gcd = extended_euclid(n%m ,m ,y ,x);
x -= n/m * y;
return gcd;
}
还有个公式就是
∑am = ∑an/m (n > 0, m/n)
还不大清楚它的用途,下次碰到了再看下吧。