1. 程式人生 > >【數學】擴充套件歐幾里得演算法

【數學】擴充套件歐幾里得演算法

歐幾里得演算法:

輾轉相除計算兩個數的最大公約數,求gcd(a,b)

證明:

a=bp+q,則gcd(b,q)|bgcd(b,q)|a,故gcd(b,q)|gcd(a,b)
同樣q=abp,則gcd(a,b)|q,故gcd(a,b)|gcd(b,q).
可得gcd(a,b)=gcd(b,a,最終得到gcd(a,b)=gcd(c,0)=c

程式碼:

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

擴充套件歐幾里得演算法

存在整數對(x,y)使得ax+by=gcd(a,
b)

證明:

a>b
b=0時,a1+b0=a=gcd(a,b),此時x=1,y=0
b!=0時,設
ax1+by1=gcd(a,b)
bx2+a%by2=gcd(b,a%b)
由於gcd(a,b)=gcd(b,a%b),所以有ax1+by1=bx2+a%by2
a%b=a(a/b)b代入,
得到 ax1+by1=ay2+bx2(a/b)by2
x1=y2,y1=x2(a/b)y2
因此可以遞迴的定義exgcd,同樣b=0時遞迴結束。返回最大公約數。

程式碼:

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

應用:

求解不定方程:

c%gcd(a,b)=0,則存在整數對(x,y)使得ax+by=c

通過上面的方法可得到一組特解x0y0使得ax+by=gcd(a,b),那麼如何在無窮多個解中求出xy最小正整數解。

證明:

首先 a

x0+akb/gcd(a,b)+by

相關推薦

數學擴充套件演算法

歐幾里得演算法: 輾轉相除計算兩個數的最大公約數,求gcd(a,b)。 證明: 設a=b∗p+q,則gcd(b,q)|b ,gcd(b,q)|a,故gcd(b,q)|gcd(a,b) 。

數論拓展演算法

寫在前面   這篇部落格是我在【數論】對 算術基本定理 的研究 中的一部分 拓展歐幾里得演算法    現在已經有了a-b == GCD(a,b) * (n1-n2),那就可以再來個直接點的   GCD(a,b) + (p*n1+q*n2) == GCD(a,b) 此處放

數論拓展演算法的多解

寫在前面   這篇部落格是我在【數論】對 算術基本定理 的研究 中的一部分 拓展歐幾里得演算法的多解   拓展歐幾里得演算法 擴充套件歐幾里德演算法是用來在已知a, b求解一組p,q,使它們滿足貝祖等式: pa+qb = gcd(a, b) =d ——bi

結論數論拓展演算法、費馬小定理

1、歐幾里得原理 (1)歐幾里得演算法 int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } (2)、拓展歐幾

擴充套件演算法輾轉相除法

其計算原理依賴於下面的定理: 定理:兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。最大公約數(Greatest Common Divisor)縮寫為GCD。 /* 歐幾里德演算法:輾轉求餘 原理: gcd(a,b)=gcd(b,a mod b) 當b為0時,兩數的最

未完成除法取模、逆元、擴充套件演算法

1.+,-,*都可以直接取模,但是除法不可以(模素數相當於換了數域,因為數域變成了有限域,有限域上沒有除法,要換成乘以逆元)。 2.除法取模要變成乘它的逆元。 a * x MOD m == 1則稱X為A關於模m的乘法逆元,其中a和m必須互素。 3.當m為素數時可以使用

乘法逆元詳解費馬小定理+擴充套件演算法

乘法逆元 何為乘法逆元? 對於兩個數a,pa,p若gcd(a,p)=1gcd(a,p)=1則一定存在另一個數bb,使得ab≡1(modp)ab≡1(modp),並稱此時的bb為aa關於11模pp的乘法逆元。我們記此時的bb為inv(a)inv(a)或a−1a

UVA - 12169 -擴充套件演算法

#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #define ll long long #define rep(i,j,k) for(int i=j;

演算法複習——擴充套件演算法擴充套件,逆元,整除)

①歐幾里得演算法 就是求gcd的有趣的輾轉相除法,不再贅述啦0v0 程式碼: int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } ②擴充套件歐幾里得演算法 需要解決這樣的問題:兩個非0整數a,b

實驗二 擴充套件演算法c++程式碼

#include<iostream> #include<stdio.h> using namespace std; int x,y,q; void extend_Eulid(int a,int b) { if(b==0) { x=1; y=0; q=a; }

擴充套件演算法+獲取特殊的解

通過擴充套件歐幾里得演算法獲取x或者y的最小整數解 template<class T> void exgcd(T a,T b,T &d,T &x,T &y){ if(!b) {d=a;x=1;y=0;} else {exgcd(b,a%b,d,y,x

POJ-1061-青蛙的約會 (擴充套件演算法

原題連結: http://poj.org/problem?id=1061 兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,於是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特徵,也沒有約定

HDU-2669-Romantic (擴充套件演算法

原題連結: http://acm.hdu.edu.cn/showproblem.php?pid=2669 The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Trees

POJ-2142-The Balance (擴充套件演算法

原題連結: Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspiri

擴充套件演算法--C語言程式

前提 擴充套件歐幾里得演算法是在歐幾里得演算法(輾轉相除法)的前提下,對已知數求係數的一種演算法。擴充套件歐幾里得演算法的公式推導我就不廢話了,基本上就是第一次推導的係數等於第二次推導的係數之間的聯絡,很多文章都引用百度對擴充套件歐幾里得的定義,但是講的不是很

擴充套件演算法python版

程式功能:             輸入兩個數m,n  (m>n)             輸出他們的最大公約數,同時輸出s,t ( m*s + n*t = 1)  #-*-coding:u

擴充套件演算法(求乘法逆元)

eg:求5關於模14的乘法逆元 15 = 5*2+1 5 = 4*1+1 說明5與14互素,存在5關於14的乘法逆元 1 = 5-4 = 5-(14-5*2)= 5*3-14 因此5關於模14的乘法逆元為3  a存在模b的乘法逆元的充要條件是gcd(a,b)= 1 互質

擴充套件演算法——exgcd

擴充套件歐幾里德演算法是用來在已知a,ba,ba,b求解一組x,yx,yx,y,使它們滿足貝祖(裴蜀)等式: ax+by=gcd(a,b)=dax+by = gcd(a, b) =dax+by=gcd(a,b)=d 試著來搞一下 ax+by=gcd(a,b

演算法學習(一)——演算法&擴充套件演算法

最大公約數/歐幾里德演算法(gcd) 歐幾里德演算法又稱輾轉相除法,證明可以度娘。 個人簡單腦部就是a和b兩個數的模還是a和b的最大公約數 int型別  int gcd(int a, int b) {return a%b==0?b:gcd(b,a%b);} long l

同餘_線性同餘方程_擴充套件演算法_CH3301

點此開啟題目頁面 思路分析:     利用擴充套件歐幾里得演算法解線性同餘方程即可, 給出如下AC程式碼: //CH3301_同餘方程 #include <iostream> using namespace std; int exgcd(int a,