zoukankan      html  css  js  c++  java
  • 同余方程(扩展欧几里得)

    #include<cstdio>
    using namespace std;
    int x,y;
    int gcd(int a,int b,int &x,int &y){
        if(!b){
            x=1,y=0;
            return a;
        }
        int ret=gcd(b,a%b,x,y);
        int t=x;
        x=y;
        y=t-a/b*y;
        return ret;
    } 
    int a,b;
    int main(){
        scanf("%d%d",&a,&b);
        gcd(a,b,x,y);
        printf("%d",(x+b)%b);
        
        
    }

    欧几里得gcd(a,b)=gcd(b,a%b)=......

    因为ax≡1(mod b) -》ax%b=1%b=1

    所以ax+by=1,因为y是整数所以加个by就相当于%b(因为%b的本质是+上y个b),所以两个式子等价

    由扩展欧几里得得 ax+by=gcd(a,b)=gcd(b,a%b)=bx+(a%b=a-a/b*b)*y=....(x,0)=x。(x是最大公约数,/是整除)

    最后bx=b,(a%b)*y=0

    所以得 x=1,y=0

    因此递归就行了

    x2=y1,y2=x1-a/b*y1(原x-整除的数*a/b=模数)

    最后得到的是无数解中的一种,有可能是负的,只需要加上模数就行了

  • 相关阅读:
    PHP静态
    PHP批量删除
    PHP增删改查
    PHP数据访问
    PHP继承和多态
    PHP封装
    PHP字符串处理和正则表达式
    PHP数组
    PHP函数
    PHP基础
  • 原文地址:https://www.cnblogs.com/wspl98765/p/6879485.html
Copyright © 2011-2022 走看看