1. 程式人生 > >擴充套件歐幾里得演算法及求逆元

擴充套件歐幾里得演算法及求逆元

師父的擴充套件歐幾里得演算法詳細部落格師父喲
大神的求逆元詳細部落格大神的呢

gcd(a,b)即求a和b的最大公約。用輾轉相除法求得。

擴充套件歐幾里得演算法是歐幾里得演算法(又叫輾轉相除法)的擴充套件。除了計算a、b兩個整數的最大公約數,此演算法還能找到整數x、y(其中一個很可能是負數)。通常談到最大公因子時, 我們都會提到一個非常基本的事實: 給予二整數 a 與 b, 必存在有整數 x 與 y 使得ax + by = gcd(a,b)。有兩個數a,b,對它們進行輾轉相除法,可得它們的最大公約數–這是眾所周知的。然後,收集輾轉相除法中產生的式子,倒回去,可以得到ax+by=gcd(a,b)的整數解。

ex_gcd(a,b,x,y)
假設a>b;
1、若b=0,則gcd(a,b)=a,得到x=1,y=0;
2、若ab!=0
有ax1+by1=gcd(a,b);
bx2+(a%b)y2=gcd(b,a%b);
由歐幾里得演算法可得:gcd(a,b)=gcd(b,a%b);
即有:
ax1+by1=bx2+(a%b)y2;
即,ax1+by1=bx2+[a-(a/b)b]y2=ay2+bx2-b(a/b)y2;
由於 a和b是定值,且等式恆等,所以,
x1=y2,
y1=x2-(a/b)y2;
這樣通過求解x2,y2來得到x1,y1。
程式碼如下:

int ex_gcd(int
a,int b,int &x,int &y) //擴充套件歐幾里得 { if(b==0) { x=1; y=0; return a; } int r=ex_gcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r; }

此演算法即可求出gcd(a,b),也可求出x和y。

乘法逆元:對於縮系中的元素,每個數a均有唯一的與之對應的乘法逆元x,使得ax≡1(mod n)。一個數有逆元的充分必要條件是gcd(a,n)=1,此逆元唯一存在。
逆元的含義:模n意義下,1個數a如果有逆元x,那麼除以a相當於乘以x。
擴充套件歐幾里得演算法求乘法逆元:
給定模數n,求a的逆相當於求解ax=1(mod n),這個方程可以轉化為ax-my=1,然後套用二元一次方程的方法,用擴充套件歐幾里得演算法求得一組x0,y0和gcd;檢查gcd是否為1
gcd不為1說明逆元不存在,若為1,調整x0到0~m-1的範圍中即可。
程式碼如下:

int mod_reverse(int a,int n)//ax=1(mod n) 求a的逆元x 
{
    int d,x,y;
    d=ex_gcd(a,n,x,y);
    if(d==1)
        return (x%n+n)%n;
    else
        return -1;
}

還需要更加加深理解。

相關推薦

擴充套件演算法

師父的擴充套件歐幾里得演算法詳細部落格師父喲 大神的求逆元詳細部落格大神的呢 gcd(a,b)即求a和b的最大公約。用輾轉相除法求得。 擴充套件歐幾里得演算法是歐幾里得演算法(又叫輾轉相除法)的擴充套件。除了計算a、b兩個整數的最大公約數,此演算法還能找到

擴充套件演算法(乘法 最小正整數解 直線上的整數點)

參考資料: 本文證明過程來自百度百科和劉汝佳的演算法入門經典。 擴充套件歐幾里得演算法介紹: 前置知識:歐幾里得演算法(其實就是輾轉相除法,用於計算兩個整數a,b的最大公約數。) 歐幾里得演算法: 在開始之前,我們先說明幾個定理: gcd(a,b)=gcd(b,a

擴充套件演算法乘法

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 互質

演算法擴充套件演算法、乘法

最近看了一本書《程式設計師》裡面說的一個面試題: 求兩個數的最大公約數: SoEasy的題目看過C 的人都知道怎麼寫這個程式 1.傳統方法:窮舉 #include <math.h>int main(){int m=1970,n=1066,p=0;p=m<n?m:n;for(;p>=1

演算法最大公因子)擴充套件乘法

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

POJ 2115 for迴圈次數-數論-(同餘方程+擴充套件演算法

題意:給定for迴圈的初始值,結束值和增量,還有一個模,求最少的迴圈次數。 分析: 讀完題後應該就知道是一個同餘的概念,所以就是解一個一元一次同餘方程,像上題一樣用擴充套件歐幾里得演算法。這題的trick點是k最大為32,那麼2^32超出了int,要用long long,所

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; }

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

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

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

通過擴充套件歐幾里得演算法獲取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 兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,於是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特徵,也沒有約定

C語言輾轉相除/相減法(演算法最大公約數和最小公倍數

#include <stdio.h> #include <stdlib.h> //題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 //採用任何兩種演算法來完成上述題目,並比較2種演算法的時間複雜度和空間複雜度。 int main() { int

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

擴充套件演算法——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

【未完成】除法取模、擴充套件演算法

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

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

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