拓展歐幾里得算法(數論)

拓展歐幾里得是用來計算已經知道ab的時候,讓你去求a*x+b*y=GCD(a,b)的一組解(x,y)。(首先根據一些相關數論證實,這個解是必定存在的)spa

GCD(a,b)應該都知道吧,求a和b的最小公約數。blog

由於GCD(a,b)=GCD(b,a%b),因此a*x+b*y=GCD(b,a%b),也就意味着a*x+b*y=b*x-(a%b)*y,進而能夠得出x*a+y*b=y*a+(x-y*a/b)*b;遞歸

最後推到最後是當b爲0的時候,a爲最小公約數,根據第一個式子,a*x+b*y=a;(可是此時的x和y是進過屢次替換過的,並非最開始的那個x,y了)可是咱們能夠遞歸回咱們須要的那個最開始的x,y。這就是拓展歐幾里得。string

代碼實現:it

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int x,y;
int ex_gcd(int a,int b)
{
    int ret,tem;
    if(!b)
    {
        x=1;y=0;
        return a;
    }
    ret=ex_gcd(b,a%b);
    tem=x;
    x=y;
    y=tem-a/b*y;
    return ret;
}
int main()
{
    int a,b,z;
    scanf("%d%d",&a,&b);
    z=ex_gcd(a,b);
    printf("%d %d\n",x,y);
    return 0;
}
相關文章
相關標籤/搜索