zoukankan      html  css  js  c++  java
  • 算法笔记——拓展欧几里得定理

    ax1+by1=gcd(a,b)ax_1+by_1=gcd(a,b)

    bx2+(amodb)y2=gcd(b,amodb)bx_2+(amod b)y_2=gcd(b,a mod b)

    gcd(a,b)=gcd(b,amodb) herefore gcd(a,b)=gcd(b,a mod b)

    ax1+by1=bx2+(amodb)y2ecause ax_1+by_1=bx_2+(amod b)y_2

    amodb=aab×b herefore a mod b=a-lfloorfrac{a}{b} floor imes b

    ax1+by1=bx2+(aab×b)y2ecause ax_1+by_1=bx_2+(a-lfloorfrac{a}{b} floor imes b)y_2

    我们利用乘法分配律,把这个式子展开

    bx2+(aab×b)y2=bx2+ay2ab×by2bx_2+(a-lfloorfrac{a}{b} floor imes b)y_2=bx_2+ay_2-lfloorfrac{a}{b} floor imes by_2

    然后,我们把 bb 提出来

    bx2+ay2ab×by2=ay2b(x2ab×y2)bx_2+ay_2-lfloorfrac{a}{b} floor imes by_2=ay_2-b(x_2-lfloorfrac{a}{b} floor imes y_2)

    然后,我们发现 x1=y2,y1=x2ab×y2x_1=y_2,y_1=x_2-lfloorfrac{a}{b} floor imes y_2

    这样,代码就好写了。

    int exgcd(int a,int b,int &x,int &y){
        if(!b){
            x=1;
            y=0;
            return a;
        }
        int d=exgcd(b,a%b,x,y);
        int t=x;
        x=y;
        y=t-a/b*y;
        return d;
    }
    
  • 相关阅读:
    Java多线程初学者指南(5):join方法的使用
    Java多线程初学者指南(4):线程的生命周期
    使用Runnable接口创建线程-3
    用Thread类创建线程-2
    线程简介-1
    Struts, Namespace用法
    多线程编程
    算法实例
    java 堆与栈的区别
    Spring AOP EXPRESSION
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12817029.html
Copyright © 2011-2022 走看看