数论初步——扩展欧几里得算法
Posted GGBeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论初步——扩展欧几里得算法相关的知识,希望对你有一定的参考价值。
具体内容见紫书p313-p314
一、扩展欧几里得算法
思想:找出一对整数(x,y),使得ax+by=gcd(a,b)
举例:当“a=6,b=15”时,gcd(6,15)=3,故可以得到解“x=3,y=-1”,当然还有其他解“x=-2,y=1”。
程序:
/* 扩展欧几里得算法 */ void gcd(int a, int b, int& d, int& x, int& y) { if(b == 0){ //边界,因为 a = gcd(a,0) = ax + 0y ,所以 x=1 , y=0 d = a; x = 1; y = 0; } else{ gcd(b, a%b, d, y, x); //x和y顺序变了 y -= x*(a/b); } }
下面方程中的a,b,c为任意整数。
结论1:若方程ax+by=c的一组整数解为(x0,y0),则它的任意整数解都可以写成(x0+kb‘,y0-ka‘),其中a‘ = a/gcd(a,b),b‘ = b/gcd(a,b),k取任意整数。
结论2:设g = gcd(a,b),方程 ax+by=g的一组解是(x0,y0),则当c是g的倍数时ax+by=c的一组解是(x0c/g,y0c/g);当c不是g的倍数时无整数解。
以上是关于数论初步——扩展欧几里得算法的主要内容,如果未能解决你的问题,请参考以下文章