整除性(divisible):
引入了代表整除性。 m\n (m|n) 表示m整除n。注意这里的整除。表示的是n = km(k为整数)。
在整除性这里。m必须是个正数。也许你可以描述n 是 m 的k倍。这种描述中m完全可以是任何数。而在整除性中的表达m整除n,规定了m必须是个正数。而0没有限制。
那么回答以下问题:
1:什么是0的倍数?
2:什么能被0整除?
3:什么能被-1整除?
4:什么能被1整除?
5:2Pi能被Pi整除吗?
6: 2Pi能被2整除吗?
答案分别是:
1:0
2:没有任何数能被0整除。(因为m>0而在这里m=0)
3:同上没有任何数能被-1整除。也就是-1不能整除任何数(严格意义上来讲)
4:任何整数。
5:可以。根据整除性的定义 m>0 n/m 是一个整数即可。n m 是任何实数(m>0)
6:不可以。Pi是3.14... 是个无限不循环小数非整数。
最大公因子(greatest common divisor):
用符号 gcd(n,m)表示。也就是所谓的最大公约数了。
首要的就是解决求两个数的最大公约数的问题了。
http://www.cnblogs.com/Milkor/p4379621.html
根据上面的链接里的方法 基本上可以完美解决最大公约数的问题。
接下来探讨扩展欧几里德的使用和原理
扩展欧几里德(extended Euclidean):
描述:必然存在n',m'使得 n'n+m'm=gcd(n,m) 成立。
证明这个定理有关乎贝祖定理(即裴蜀定理)。要搜的话,最好搜裴蜀定理,有更多的资料。
裴蜀定理(Bézout's identity):
描述:对于nn'+mm'=d 这个方程有整数对解n',m',那么d一定是gcd(n,m)的倍数。(并且有解时,整数解对有无限对)
证明:
分三步证明:
证明1:证明有正整数对解n'm'的时候d一定是最小d(简称d0)的倍数。(这个d0我们还不能说是gcd(n.m)).
证明2: 证明nn'+mm'=gcd(n,m)有正整数解对n'm'.
证明3: 证明d0(最小d,之后不赘述)即位gcd(n,m).
我尽量详细描述。后有图版的。感谢贴出此图的吧主(吧主名字忘记了,抱歉,惭愧)。找了很久很久。
声明:能够满足nn'+mm'=d有正整数对解的值,这个d值是好值。
证明1:证明有正整数对解n'm'的时候d一定是最小d(简称d0)的倍数。(这个d0我们还不能说是gcd(n.m)).
设d0 = nn'+mm' ,d0是最小好值。 ①
d = nn'+mm' , d是任意好值。 ②
要证明1,即证明d=kd0(k是正整数) 即d是d0的倍数
带余除法 d/d0 -> d = kd0+r ③
即要证明r = 0
如果r>0 (r不可能<0)
r = d-kd0 = nn'+mm' - k(nn''+mm'') 由于 式子①和式子②中的m'n'是不同的 所以前者改用n'' m''来标记
= (n'-kn'')n + (m'-m'')m
整理得 r = (n'-kn'')n + (m'-m'')m
其中n'-kn'' 和 (m'-m'')均为整数,所以r应该是一个好值。但是如果r是一个好值,然而根据③有r<d0。所以这和d0是最小好值是矛盾的。
所以r = 0.
所以d = kd0 证毕。
证明2:nn'+mm'=gcd(n,m)有正整数解对n'm'.
利用带余除法: (把余数当做除数,原因后有,符合欧几里得。)
r1 = n - k1 m ①
r2 = m - k2 r1 ②
r3 = r1 - k3 r2 ③
r4 = r2 - k4 r3 ④
r5 = r3 - k5 r4 ⑤
......
r(n-1) = r(n-3) - k(n) r(n-2) ⑥
r(n) = r(n-2) - k(n) r(n-1) ⑦
图上利用数学归纳法证明对于所有的n的不同取值,存在u,v。使得r(n) = up+vq(图上的比较全,严谨)。 回忆作者(似乎是他的学生)在旁边的注解。数学归纳法就是先打好地板。然后确立好你能从n层走上n+1层。那么你就能从地板上走到天际。
我在这里就不用数学归纳法了。我直接从头推到尾。(个人见解。)
那么复合①②式子:
r1 = n - k1 m ①
r2 = m - k2 r1 ②
① 代入 ②
r2 = (1+k1) m - k2 n (形式上和原来的式子一样) 所以可以设该式为 r2 = s m - tn。
所以成立。
那么继续 r2 = s m - tn。复合 r3 = r1 - k3 r2 ③
r3 = r1 - k3 (s m - tn) 代入式 ①
r3 = n - k1m - k3(s m - t n)
r3 = (1 + k3t) n - (k1+k3s) m (形式上和原来的式子一样) 所以可以设该式为 r3 = s m - tn。 (顺序无所谓 只要符合贝组等式,即原等式的形式)
由此一直递推。可以有
r(n-1)= sm+tn
之后你可以手写一下或者思考一下证明欧几里得的过程 到最后一定会有余数 r = 0 (欧几里得的最后终点是gcd(0,n) = n)
假设 ⑦ 达到这种情况。即r(n) = 0.
gcd(n,m) = gcd(m,r1) = gcd(r1,r2) = gcd(r2,r3)... = gcd(r(n-1),r(n)) = gcd(r(n-1),0) = r(n-1).
所以 gcd(n,m) = r(n-1) = sm + tn = nn'+mm'.证毕。
证明3:证明d0(最小d,之后不赘述)即为gcd(n,m).
根据证明2。gcd(n,m) = nn'+mm' 其中 gcd(n,m)是好值
d0是最小好值。根据证明1 gcd(n,m)|d0。
设 c = gcd(n,m) / d0 (我们目的要证明c = 1)
对于 d0 = nn'+mm'
有 1 = n' (n/d0) + m' (m/d0)
其中 c|(n/d0) 把c = gcd(n,m) / d0 代入就可得。 c|(m/d0) .
那么 c|1
那么 c = 1.证毕
求解m',n'
现在让我们求nn'+mm'=gcd(n,m)的一组特解n',m'.
求解过程:
设n>m
n%m = r -> n = km+r -> r = n-km.
另有 rr'' + mm'' = gcd(r,m) (这个m还是原来的m 对应的m''不是m',注意这个'另'字)
由欧几里得定理得:
rr'' + mm'' = gcd(r,m) = gcd(n,m)
(n-km) r'' + mm'' = gcd(n,m)
nr'' - kmr'' + mm'' = gcd(n,m)
nr'' + m(m''-kr'') = gcd(n,m)
所以 n' = r'' m' = m''- kr''
那么我们只要求出r'' 和 m'' 就可以得到 n' m'
那么对 rr'' + mm'' = gcd(n,m) 做同上的处理。 就能形成递推关系。 你可以这样考虑 n' m‘ 需要 r'' 和 m'' 而 r'' 和 m'' 需要 r''' 和 m'''......
假如我们知道最终结果的 r''''''''''' 和 m'''''''''' (标点数不知多少,但是是有限的)那么我们可以一直向上推出 n' m' 交给计算机处理吧。递推关系。
最后 r''''''''''' = 1 m''''''''''' = 0
可以有证明:
一直取模。最后余数会=0,且另外一个参数的值 = gcd(n,m)(因为gcd(0,a) = a) 所以另外一个解值为1 这个已经在证明裴蜀定理得第2条证明的时候 已经使用过了。所以不再赘述。
递推关系有了。结尾判断有了。code.
int x,y; void EXGCD(int n,int m) { if(m==0) { x = 1; y = 0; return; } EXGCD(m,n%m); int t = x; x = y; y = t - n/m*y; } // nx + my = gcd(n.m) // 所以要控制一下输出!