扩展欧几里得算法

资料

  • 欧几里得算法
  • 扩展欧几里得算法
  • 扩展欧几里得算法应用

欧几里得算法

欧几里得算法用于求两个数的最大公约数

证明
设 a > b, a = kb + r;
只需证明gcd( a, b ) = gcd( b, r );
设 gcd( a, b ) = c;
a = m * c, b = n * c;
r = a - kb
  = ( m - nk ) * c;
要证gcd( b, r ) = c;只需证明 ( m - nk ) 与 n 互素,即gcd( m - nk, n ) = 1;
假设gcd( m - nk , n ) = d ( d > 1 );
那么 ( m - n k ) = xd, n = yd;
a = m * c
  = ( xd + nk )c 
  = ( x + ny )cd 
b = ycd;
如果d > 1 那么 gcd( a, b ) >= cd > c; 矛盾
所以 d = 1;
gcd( b, r ) = gcd( a, b );即证
算法
递归版:
int gcd(int a, int b)
{
 return (b == 0 ? a : gcd(b, a % b));
}

非递归版
int gcd( int a, int b )
{
    int t;
    while( b != 0 )
    {
        t = a % b;
        a = b;
        b = t;
    }
    return a;
}

扩展欧几里得算法

在求得a,b 的最大公约数的同时,还能求出一组解x,y,使其满足贝祖等式
ax + by = gcd( a, b )

证明
设 a > b, a = kb + r;
1. b = 0 时,
    gcd( a, b ) = a,x = 1,y = 0;
2. b != 0 时,
   设 ax1 + by1 = gcd( a, b );
       bx2  + ( a % b )y2 = gcd( b, a % b );
   由欧几里得算法得
   ax1 + by1 = bx2 + ( a % b )y2;
   化简得
   x1 = y2;
   y1 = x2 -( a / b )y2;
   上述表明x1, y1 可由 x2, y2表示,以此递归下去,直到b = 0;可知必有解,
   即证.
算法
递归版
int exgcd(int a,int b,int & x,int & y){
    if(b == 0){
        //根据上面的推理1,基本情况
        x = 1;
        y = 0;
        return a;
    }
    //根据推理2
    int r = exgcd(b, a%b, x, y);
    int t = y;
    y = x - (a/b)*y;
    x = t;
    return r;
}

非递归版
int exgcd(int a,int b,int &x,int &y)
{
    int r = a % b;
    int x0, y0, x1, y1;
    x0 = 1; y0 = 0;
    x1 = 0; y1 = 1;
    x  = x1; y  = y1;
    while( r )
    {
        x = x0 -  a/b * x1;
        y = y0 -  a/b * y1;
        x0 = x1;
        y0 = y1;
        x1 = x;
        y1 = y;
        a = b;
        b = r;
        r = a % b;
    }
    return b;
}
非递归算法证明
根据欧几里得算法
a = bq1 + r1; (1)
b = r1q2 + r2;(2)
r1 = r2q3 + r3;
....
ri-2 = ri-1*qi + r i;
....
rn-2 = rn-1*qn + rn; 
rn-1 = rn*qn+1 + 0;
因为对于ri>0,ri均是gcd(a, b)的倍数
所以每一步均存在 xi, yi, 使得 a xi + b yi = ri成立
ri = ri-2 - ri-1*qi
   = ( a*xi-2 + b*yi-2 ) - ( a*xi-1 + b*yi-1 )*qi
   = a*( xi-2 - qi*xi-1 ) + b( yi-2 - qi*yi-1 )
因为 ri = a xi + b yi;
xi = xi-2 - qi*xi-1;
yi = yi-2 - qi*yi-1;
直到求xn, yn;
因为 (1)和(2)式,
初始化 x0 = 1,y0 =0,x1=0,y1=1;

扩展欧几里得算法应用

  • 求解不定方程
  • 求解模线性方程
  • 求解模的逆元
求解不定方程

不定方程指ax + by = c,
a,b,c是整数,证明ax+by=c在整数范围内有解的充要条件是 gcd( a, b )整除c.

证明:
设gcd( a,b )= d,则 d|c ,c = kd;
充分性:
ax0 + by0 = d,左右乘k,即可证明
必要性:
ax0 + by0 = c; d|a, b|a,那么 d|ax0 + by0,则 d|c即证  
算法
bool linear_equation(int a,int b,int c,int &x,int &y)
{
    int d=exgcd(a,b,x,y);
    if(c%d)
        return false;
    int k=c/d;
    x*=k; y*=k;    //求得的只是其中一组解
    return true;
}
求解模线性方程

模线性方程是指 ax≡b (mod n)

求解:
ax≡b(mod n)  等价于 ax = b + nk;
等价于 ax + ny = b;
当b|gcd( a, n )时,有解
设 gcd( a,n ) = d, ax0 + ny0 = d,
那么存在解 x = x0 * ( b/d ); 对模n有特解 x = x0*(b/d)( mod n );
易知,x, y有多解  
由x = ( b/a ) + ( n / a ) * y知,x的相邻解的间隔时相同的
设间隔为dx
ax≡b(mod n) 
a(x+ dx) ≡b(mod n) 
相减  adx ≡ 0 ( mod n )  即 n | adx,且 a | adx.
那么最小的dx满足 
adx = lcm( a, n )
       = a n / gcd( a, n )  
 dx = n / d;
可知,该方程对模n恰有d个不同的解(这个很显然,但不会理论证明)
算法
bool modular_linear_equation(int a,int b,int n)
{
    int x,y,x0,i;
    int d=exgcd(a,n,x,y);
    if(b%d)
        return false;
    x0=x*(b/d)%n;   //特解
    for(i=1;i<d;i++)
        printf("%d\n",(x0+i*(n/d))%n);
    return true;
}
求解模的逆元

ax≡ 1 (mod n), gcd( a, n ) = 1, 只有唯一解,该解称为 x 为 a 的对模 n 乘法的逆元。

byene.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容