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

    裴蜀定理

    对任何整数 (a)(b) 关于未知数 (x)(y) 的线性不定方程(称为裴蜀等式):(ax+by=c)

    方程有整数解(当且仅当 (c)(gcd(a,b)) 的倍数),裴蜀等式有解时必然有无穷多个解

    (ax+by=c) 有解的充要条件为 (gcd(a,b)|c)

    原方程的解即为(ax+by=gcd(a,b))的解乘上(frac{c}{gcd(a,b)})

    扩欧解出的(x)(ax+by=gcd(a,b)),中的(x),若要求(ax+by=c)中的(x),两边还要乘上(frac{c}{gcd(a,b)})

    推论:(a)(b) 互素等价于 (ax+by=1) 有解

    计算其中整数 (x) 和整数 (y) 的计算方法被称为扩展欧几里得算法

    (code :)

    int exgcd(int a,int b)
    {
    	if(!b)
    	{
    		x=1,y=0;//x,y设为全局变量
    		return a;//若为void,此处直接return
    	}
    	int ans=exgcd(b,a%b),tmp=x;
    	x=y,y=tmp-a/b*y;
    	return ans;//得到的为gcd(a,b)
    }
    

    由欧几里得算法,得

    [ax+by=gcd(a,b)=gcd(b,a mod b)=bx^prime+(a mod b)y^prime ]

    代入,整理得

    [x=y^prime, y=x^prime-lfloorfrac{a}{b} floor y^prime ]

    边界情况分析,(ax^prime+by^prime=gcd(a,b)),当 (b=0) 时,(a)(gcd(a,b)),当且仅当 (x^prime=1)时等式成立,(y^prime) 可以为任意值,为方便起见,设(y^prime=0)

    根据上边的式子,即可推出多组解

    通解为(x=x_0+kb, y=y_0-ka (k∈Z))

    同余方程

    线性同余方程:

    [ax≡b (mod m) ]

    其等价于(ax-b)(m)的倍数,不妨设为(-y)倍,其就改写为

    [ax+my=b ]

    根据裴蜀定理得,线性同余方程有解当且仅当(gcd(a,m)|b)

    有解时,先求出(ax_0+my_0=gcd(a,m)),的一组解,(x_0)(y_0),原线性同余方程的一个解即为(x=bx_0/gcd(a,m))

    方程的通解就是所有模 (m/gcd(a,m))(x)同余的整数

  • 相关阅读:
    Leetcode 109
    Leetcode 118
    js时间操作
    DWR搭建以及使用教程
    Ant 概念
    Eclipse 快捷键
    [eclipse] 三个操作技巧
    js call方法
    js验证密码强弱
    request getParameter getAttribute
  • 原文地址:https://www.cnblogs.com/lhm-/p/12229495.html
Copyright © 2011-2022 走看看