擴充套件歐幾里得(extgcd)
相信大家對歐幾里得演算法,即輾轉相除法不陌生吧。
程式碼如下:
123 | int 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);我們設解為
我們令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 + by1 = gcd(a, b) 聯立,我們很容易得:
x1 = y2, y1 = x2 - (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為整數。
附上虛擬碼:
1234567891011 | int a, b, x, y; 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; } //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