【拓展欧几里得】——理解

typedef long long LL;

//一种写法(申博版):
LL exgcd(LL a,LL b,LL &x,LL &y)
{
    LL d;
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    d=exgcd(b,a%b,y,x);//一定要返回
    y=y-a/b*x;
    return d;
}
d:解得个数
关于exgcd:这个函数的返回值是三个:x,y,d;(视a,b为定值)
但是:不可能写成:return x,y,d;
于是:就用引用的办法去返回数值。

那么,这个函数是什么意思呢?
就是去找出在直线:ax+by+c=0;这条直线上的 坐标为整数的解。
即:d=gcd(a,b)=ax+by;


//另一种更加直观(统一)的写法:
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
    if(b==0)
    //这里返回的是:a=ax+by;
    {
        d=a;
        x=1;
        y=0;
    }
    
    else
    //这里计算的是:d’= gcd(b,a%b)
    //             d‘= bx’+(a%b)y‘
    //即:    d = gcd(a,b) = d’= gcd(b,a%b)
    {
        exgcd(b,a%b,d,y,x);
        y=y-a/b*x;
    }
}

两个结论:
1、    a,b,c为任意整数,
    若方程:ax+by=c 的一组整数解为(x0,y0);
    则:它的任意整数解为:(x0+kb’,y0-ka‘) (k属于Z)
        其中:a’=a/gcd(a,b) ; b‘=b/gcd(a,b) ;
        
2、    a,b,c为任意整数,
    g=gcd(a,b);
    方程:ax+by=c 的一组整数解为(x0,y0);
    则:当c是g的倍数时,ax+by=c 的一组解是;(x0c/g,y0c/g)。
        否则该方程无整数解。

 

几何意义:

考虑不定方程:ax+by=1(a,b互质)它等价于同余式ax≡1(mod b),一般来说当a,b确定求x,y的一组解时要用到拓展欧几里得,

下面尝试运用几何方法得到x y的一组解

建 立直角坐标系,原点为O,取点A坐标为(a,b)(a,b意义前面已给出),连接AO。因为a,b互质,所以线段AO除端点外肯定不经过任何一个整点 (横纵坐标都是整数的点)

现在将直线AO竖直向上平移,当遇到第一个整点时停止平移,此时整点的横纵坐标x,y即为所求x ,y的解


证明:设第一个碰上的点为P,连接AP,PO,AO,则△APO面积为0.5.

为什么呢?由于三角形内部显然没有整点,边上的整点只有A,P,O三个顶点而已,由皮克定理可得S△APO=0+3/2-1=0.5

          皮克定理:S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。

显然△APO还要和x,y,a,b扯上关系才行,知道叉乘公式的童鞋可能已经想到了,向量OP=(x,y)向量OA=(a,b)则三角形的面积等于(OP×OA)/2=(ax+by)/2=0.5
所以ax+by=1满足上式

 补充博客:http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html

posted @ 2016-06-01 14:34  琥珀川||雨露晨曦  阅读(98)  评论(0)    收藏  举报