• 欧几里得算法


    一、欧几里得算法(辗转相除法)

    ll gcd(ll a, ll b){
        if(b==0)    return a;
        else return gcd(b,a%b);
    }

    二、扩展欧几里得算法

    在求a,b的gcd的同时求出一组特解 x,y满足方程  ax + by = gcd(a,b)

    void extgcd(ll a,ll b,ll& d,ll& x,ll& y){
        if(!b){ d=a; x=1; y=0;}
        else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); }
    }

    三、关于方程 ax + by = c

    若gcd(a,b) | c,则方程有解,否则无解。

    【解法】先运用扩展欧几里得算法求出ax + by = gcd(a,b) 一组特解x0,y0

    则通解:

    x = x0 + b/gcd(a,b) * t

    y = y0 - a/gcd(a,b) * t

    对应方程 ax + by = c只需要在通解基础上乘以一个比例系数:c/gcd(a,b)

    【求最小正整数解】

     使用拓展欧几里德找到ax+by=c的一组整数解(x0,y0)之后,

    令k=b/gcd(a,b),x'=(x0%k+k)%k,y'=(c-ax)/b,就可以得到x的最小正整数解。

    同理,令k=a/gcd(a,b),y'=(y0%k+k)%k,x'=(c-by)/a,就可以得到y的最小正整数解。

    四、解模线性方程 ax ≡ b (mod p)

    先对方程进行转换  (ax - b) = -y*p 根据同余的性质ax与b的差是模数的倍数

    移项可知: ax + py = b

    显然,这个方程有解的条件是gcd(a,p) | b

    用扩欧先求出ax + py = gcd(a,p)的一个解x0

    则ax + py = b的一个特解是 x = b/gcd(a,p) * x0

    然后把x处理成最小的正整数,x = (x%p + p) % p即可

    ll linearCong(ll a, ll b, ll p){
        ll d,x,y;
        extgcd(a,p,d,x,y);
        if(b % d != 0)    return -1;
        x = x*b/d;
        x = (x%p + p) % p;
        return x;
    }

    五、求逆元

    六、解模线性方程组

    这两节见另一篇博客:中国剩余定理

  • 相关阅读:
    线程+IO流
    jiava trim()
    statement 的延伸 ----》PreparedStatement
    java中math的用法
    java中获取所有文件--(递归调用)
    编写一个JAVA类,用于计算两个日期之间的周数。
    java中数组排序.知识点
    javascript 常用功能总结
    jquery
    创建 HTML内容
  • 原文地址:https://www.cnblogs.com/czsharecode/p/9768732.html
Copyright © 2020-2023  润新知