zoukankan      html  css  js  c++  java
  • 扩展欧几里得算法

    扩展欧几里得算法用于:
    1.求不定方程
    2.求解模的逆元

    3.求解同余方程

    /*
     * 扩展欧几里得算法(extended Euclidean algorithm)
     * 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式:
     * ax+by = gcd(a, b) = d(解一定存在,根据数论中的相关定理)。
     * 扩展欧几里德常用在求解模线性方程及方程组中。
     *
     */
    
    #include <stdio.h>
    
    // 递归法实现扩展欧几里德算法
    long exgcd1(long a, long b, long *x, long *y)
    {
        if(b==0) {
            *x=1;
            *y=0;
            return a;
        }
    
        long r = exgcd1(b, a%b, x, y);
        long t = *x;
        *x = *y;
        *y = t - a / b * *y;
    
        return r;
    }
    
    // 递推法实现扩展欧几里德算法(正解)
    long exgcd2(long a, long b, long *x, long *y)
    {
        long x0=1, y0=0, x1=0, y1=1;
        long r, q;
        *x=0;
        *y=1;
    
        r = a % b;
        q = (a - r) / b;
        while(r)
        {
            *x = x0 - q * x1;
            *y = y0 - q * y1;
            x0 = x1;
            y0 = y1;
            x1 = *x;
            y1 = *y;
    
            a = b;
            b = r;
            r = a % b;
            q = (a - r) / b;
        }
        return b;
    }
    
    int main(void)
    {
        long x, y;
    
        printf("a=%d, b=%d, x=%ld, y=%ld exgcd=%ld
    ", 42, 70, x, y, exgcd1(42, 70, &x, &y));
    
        printf("a=%d, b=%d, x=%ld, y=%ld exgcd=%ld
    ", 42, 70, x, y, exgcd2(42, 70, &x, &y));
    
        return 0;
    }


    关键代码(正解):

    // 递推法实现扩展欧几里德算法(正解)
    long exgcd2(long a, long b, long *x, long *y)
    {
        long x0=1, y0=0, x1=0, y1=1;
        long r, q;
        *x=0;
        *y=1;
    
        r = a % b;
        q = (a - r) / b;
        while(r)
        {
            *x = x0 - q * x1;
            *y = y0 - q * y1;
            x0 = x1;
            y0 = y1;
            x1 = *x;
            y1 = *y;
    
            a = b;
            b = r;
            r = a % b;
            q = (a - r) / b;
        }
        return b;
    }



  • 相关阅读:
    12306-单
    12306-票
    12306-车
    12306-人
    12306-目录
    a+=b 是什么意思?
    开启hadoop和Hbase集群的lzo压缩功能(转)
    HBase性能优化方法总结(转)
    Spark向HDFS中存储数据
    Spark从HDFS上读取JSON数据
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564952.html
Copyright © 2011-2022 走看看