1. 程式人生 > >擴充套件歐幾里得(extgcd)

擴充套件歐幾里得(extgcd)

相信大家對歐幾里得演算法,即輾轉相除法不陌生吧。

程式碼如下:

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

而擴充套件歐幾里得演算法,顧名思義就是對歐幾里得演算法的擴充套件。

切入正題:

首先我們來看一個問題:

求整數x, y使得ax + by = 1, 如果gcd(a, b) != 1, 我們很容易發現原方程是無解的。則方程ax + by = 1有正整數對解(x, y)的必要條件是gcd(a, b) = 1,即a, b 互質。

此時正整數對解(x, y)可以通過擴充套件歐幾里得演算法求得。

對於方程ax + by = gcd(a, b);我們設解為

x1,  y1

我們令a = b, b = a % b;

得到方程bx + a % by = gcd(b, a % b);

由歐幾裡得演算法可以得到gcd(a, b) = gcd(b, a % b);

代入可得:bx + a % b y = gcd(a, b)

設此方程解為x2, y2

在計算機中我們知道: a % b = a - (a / b) * b;

代入方程化解得:

ay2 + b(x2 - (a / b) y2) = gcd(a, b);

與ax1 + by= gcd(a, b) 聯立,我們很容易得:

x1 = y2, y1 = x- (a / b)y2;

然後我們就這樣可以解出來了。

等等我們似乎忘記一個東西了吧?對就是遞迴的終點。也就是最後方程的解x和y。

對於方程ay2 + b(x2 - (a / b) y2) = gcd(a, b);

當b = 0時,發現a * 1 + b * 0 = gcd(a, b)

則有x = 1, y = 0。

由此我們把ax + by = 1的其中一組解解出來了, 僅僅是其中一組解。

對於已經得到的解x1, y1;我們便可以求出通解。

我們設x = x1 + kt;t為整數

帶入方程解得y = y1 - a * k / b * t;

而我們要保證y也為整數的話必須保證a * k /b也為整數,我們不妨令k = b/gcd(a, b);

所以通解為:

x = x1 + b / gcd(a, b) * t;

y = y1 -  a / gcd(a, b) * t;

其中t為整數。

附上虛擬碼:

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

 擴充套件歐幾里得演算法還可以用來解如下方程:

ax = mt + b,ax - mt = b

這種形式不就是前面的形式嗎?

相關推薦

擴充套件extgcd

相信大家對歐幾里得演算法,即輾轉相除法不陌生吧。程式碼如下:123int gcd(int a, int b){return!b ? gcd(b, a % b) : a;}而擴充套件歐幾里得演算法,顧名思義就是對歐幾里得演算法的擴充套件。切入正題:首先我們來看一個問題:求整數x

擴充套件Extended Euclid演算法求最大公約數和乘法逆元

密碼學課本里面使用到的一個十分簡單的演算法,老師佈置的作業,就寫了一下...程式碼挺腦殘的,只要知道演算法的步驟,很好實現。 程式碼: #include<iostream> using namespace std; int a[3][3]; int coun

演算法求最大公因子擴充套件求乘法逆元

一、歐幾里得演算法歐幾里得演算法又稱輾轉相除法,是指用於計算兩個正整數a,b的最大公約數。gcd(a,b)=gcd(b,a mod b)。演算法描述:1. 輸入:兩個非負整數a,b,且a≥b。2. 輸出

擴充套件應用:求解不定方程、解模線性方程、求模的逆元

歐幾里得 1.含義:歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數。 原理公式:gcd(a,b)=gcd(b,a mod b) 因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等. 2.實現: int gcd(int a

擴充套件乘法逆元

百度百科:擴充套件歐幾里得http://baike.baidu.com/link?url=wFOWllqYIDKw1sHLTeJ-MOFHr6RLwP-3RwWroNS5xFpJq-Z3dDj2WcpvyF2dzixgIEM4aRdId3vZsA78w5CkP_ 任意整數

Euclid與拓展的演算法

歐幾里得(Euclid)與拓展的歐幾里得演算法 歐幾里得(Euclid)與拓展的歐幾里得演算法 歐幾里得演算法 原理 實現 拓展的歐幾里得演算法 原理 遞迴求解 迭代求解 歐幾里得演算法 原理 歐幾里得演算法是一種快速計算最大公約數的演算法,對於任意的兩個數\((a,b)\),其最大公約數

51Nod 1119 機器人走方格 擴充套件+逆元+求組合數

M * N的方格,一個機器人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出Mod 10^9 + 7的結果。 收起 輸入 第1行,2個數M,N,中間用空格隔開。(2 <= m,n <= 1000000) 輸出 輸出走法的數量 Mo

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

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

qdu 2017級納新題擴充套件

在你面前撒個嬌 哎呦喵喵喵喵喵 Description   我們一起學貓叫 一起喵喵喵喵喵 在你面前撒個嬌 哎呦喵喵喵喵喵 我的心臟砰砰跳 迷戀上你的壞笑 你不說愛我我就喵喵喵 每當xjy和hqy一起唱起這首歌時,就會吸引好多貓群來聽歌,這天他們又吸

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

ZOJ ~ 3609 ~ Modular Inverse 擴充套件,乘法逆元

題意 求a*x ≡ 1(mod m),求最小的正整數 x ,如果沒有解輸出 “Not Exist”。 思路 求乘法逆元。a*x ≡ 1(mod m)轉化為 ,求最小的正!整數 x 。 #

ZOJ ~ 3593 ~ One Person Game 擴充套件,不定方程

題意 你要從A走到B,你每次可以走a步,b步,a+b步問最小需要走多少步?無法到達輸出 -1。 題解 先不考慮a+b步的情況,那麼我們要求解的就是:,如果,證明無解。 假設原方程一組解為x0,y0,那麼通解(x,y)為:,。 其實也就是兩條直線:, 取一條平行於

POJ ~ 1061 ~ 青蛙的約會 擴充套件

題解 假設答案為a,其實就是求解:,化為。 對應到中,a = m-n,b = L, c = y-x。x為a,y為k。要求最小的非負整數x。 假設的一組解為(x0,y0),那麼通解為 所以最小

POJ ~ 2115 ~ C Looooops 擴充套件

題解 設答案為x,由題意得,同餘方程 => 。 然後求得最小的非負整數解 x 就是答案。 //#include<bits/stdc++.h> #include<iost

poj 1061青蛙的約會擴充套件+同餘方程

兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,於是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特徵,也沒有約定見面的具體位置。不過青蛙們都是很樂觀的,它們覺得只要一直朝

Wannafly summer camp Day2  ——Utawarerumono數論擴充套件

9511: Utawarerumono 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 389  解決: 66 [提交] [狀態] [討論版] [命題人:admin] 題目描述 算術是為數不多的會讓久遠感到棘手的事情。通常她會找哈克幫忙,但是哈克已經被

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

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

前言 擴充套件歐幾里得演算法是一個很好的解決同餘問題的演算法,非常實用。 歐幾里得演算法 簡介 歐幾里得演算法,又稱輾轉相除法。 主要用途 求最大公因數gcdgcdgcd。 公式 gcd(a,b)=g