歐幾里得gcd/extend_gcd

正式敘述前還寫了一點自己的小感受。

問題:求兩個正整數a,b的最大公約數

大神看來是很簡單的問題,但是對于去年夏天剛學python的我來說,這是個很難的問題,還記得當時一晚上睡不著都在想怎么快一點的求出最大公約數,后來猜測最小公倍數的求法,還有最后想出來的欣喜若狂,我現在還記憶猶新。

?

還記得看過一個小梗:一個農民種著種著地,一排一排的種,突然陷入深思,沉思良久,回去算了很久以后,借了錢瘋了似的坐火車跑到中科院門口,等來數學系教授,向他講述了自己的重大發現。大概意思就是,自己從田地中大徹大悟,發明了一種快速計算方法,不用計數,不用加法,不用數學,還給了教授一張偉大的定律表。

教授告訴他:你真的很厲害,你的發現很偉大,能在種田中悟出來這種算法可不容易。

?

?

?

?

?

?

?

但是,你發明的這種算法叫乘法,你給我的表,完善一下以后,叫九九乘法表。

農民繼續回去種田

(這個故事告訴我們要多虛心接受知識,不要老自己想。。。。)

?

我知道了歐幾里得算法以后,感覺自己就跟這個農民一樣。。。。。。。

不過,知道了自己的想法就是歐幾里得算法時,還是挺高興的。。。

就當鍛煉思維了吧。。只能這么安慰自己。

?

好,開始正題。。。。::

?

我當時的思路是這樣的:求a,b的最大公約數,假設最大公約數是x的話,a一定可以用i*x來表示,b也一定可以用j*x來表示,我們怎么把i和j去掉,把x榨出來呢??

讓這倆數不斷互相相減就可以啦!

后來自己想到了互相取余。

?

我們來看正規的歐幾里得算法:

首先放簡介:歐幾里德算法又稱輾轉相除法,是指用于計算兩個正整數a,b的最大公約數。應用領域有數學和計算機兩個方面。計算公式gcd(a,b) = gcd(b,a mod b)。

看代碼實現:

Python

def gcd(a, b):while a != 0:a, b = b % a, areturn b

?

后來知道了歐幾里得還有拓展:

可以用來求二元一次方程的通解,還可以用來求乘法逆元。?

已知整數a、b,擴展歐幾里得算法可以在求得a、b的最大公約數的同時,能找到整數x、y(其中一個很可能是負數),使它們滿足貝祖等式ax+by=gcd(a,b)

如果a是負數,可以把問題轉化成|a|(-x)+by=gcd(|a|,b)?,然后令x'=(-x)。

//返回 d=gcd(a,b); 和對應于等式 ax+by=d 中的 x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{if(a==0&&b==0) return ?1;//無最大公約數if(b==0){x=1;y=0;return a;}long long d=extend_gcd(b,a%b,y,x);y?=a/b*x;return d;
} 

求逆元,真的不想敘述了,上個代碼算了

 //********* 求逆元 *******************
//ax = 1(mod n)
long long mod_reverse(long long a,long long n)
{long long x,y;long long d=extend_gcd(a,n,x,y);if(d==1) return (x%n+n)%n;else return ?1;
} 

逆元,利用歐拉:

mod 為素數, 而且 a 和 m 互質?

long long inv(long long a,long long mod)//為素數mod
{return pow_m(a,mod?2,mod);
}

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445651.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python基礎技巧總結(一)

最近總結一下python基礎知識,就暫時棄坑了。 本文總結只屬于python的一些騷操作。。。 后面文章自行去博客學習交流 原地交換 Python 提供了一個直觀的在一行代碼中賦值與交換(變量值)的方法 x, y 10, 20 print(x, y)x, y y, x print(x…

python基礎技巧總結(二)

一總結的鏈接: 好,我們繼續 一次性初始化多個變量 可以直接賦值: a,b,c,d1,2,3,4 可以利用列表: List [1,2,3] x,y,zList print(x, y, z) #-> 1 2 3 (元素個數應與列表長度相同) 打印模塊路徑 im…

python基礎技巧總結(三)

前兩篇文章: https://blog.csdn.net/hebtu666/article/details/81698235 https://blog.csdn.net/hebtu666/article/details/81698329 我們繼續總結: 開啟文件分享 Python 允許運行一個 HTTP 服務器來從根路徑共享文件,下面是開啟服務器的…

python基礎技巧總結(四)

前三期請到我博客里找 https://blog.csdn.net/hebtu666 我們繼續總結 except的用法和作用 try/except: 捕捉由PYTHON自身或寫程序過程中引發的異常并恢復 except: 捕捉所有其他異常 except name: 只捕捉特定的異常 except name, value: 捕捉異常及格外的數據(實例) exce…

python基礎技巧總結(五)

前四期到博客找:https://blog.csdn.net/hebtu666 我們繼續說一些好用的函數 split Python split() 通過指定分隔符對字符串進行切片,如果參數 num 有指定值,則僅分隔 num 個子字符串。 語法: str.split(str"", num…

堆的簡單實現

關于堆不做過多介紹 堆就是兒子的值一定不小于父親的值并且樹的節點都是按照從上到下,從左到右緊湊排列的樹。 (本文為二叉堆) 具體實現并不需要指針二叉樹,用數組儲存并且利用公式找到父子即可。 父:(i-1)/2 子:…

二叉搜索樹實現

本文給出二叉搜索樹介紹和實現 首先說它的性質:所有的節點都滿足,左子樹上所有的節點都比自己小,右邊的都比自己大。 那這個結構有什么有用呢? 首先可以快速二分查找。還可以中序遍歷得到升序序列,等等。。。 基本操…

python基礎小白題

題目1:有1、2、3、4四個數,能組成多少個互不相同且無重復的三位數?都是多少? list_num[1,2,3,4] all_num[] for i in list_num: for j in list_num: for k in list_num : if (i!j) and (i!k) and (j!k): numi*100j*10k all_num…

python基礎小白題2

題目11:判斷101-200之間有多少個素數,并輸出所有素數。 num[] for i in range(100,201): ji//2 for k in range(2,j): if i%k0: break else: num.append(i) print(一共有%d個素數\n這些素數是: %len(num),num ) 輸出結果&am…

python基礎小白題3

題目021:猴子吃桃問題 猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。 以后每天早上都吃了前一天剩下的一半零一個。 到第10天早上想再吃時&#x…

python基礎小白題4

題目031:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續判斷第二個字母。 def tm031(): 【個人備注】:按照題意要求實現了就行 week [monday,tuesday,wednesday,thursday,friday,saturday,sunday] inp…

python基礎小白題5

題目045:統計 1 到 100 之和。 def tm045(): 【個人備注】:簡單,但官網有人寫的更簡單 s 0 for i in range(1,101): si print(s) # 更簡潔的方法 print(sum(range(1,101))) 題目046:求輸入數字的平方,如果平方運算…

快排-荷蘭國旗

在使用partition-exchange排序算法時,如快速排序算法,我們會遇到一些問題,比如重復元素太多,降低了效率,在每次遞歸中,左邊部分是空的(沒有元素比關鍵元素小),而右邊部分只能一個一個遞減移動。…

快排-前m大元素

描述 給定一個數組包含n個元素&#xff0c;統計前m大的數并且把這m個數從大到小輸 出。 輸入 第一行包含一個整數n&#xff0c;表示數組的大小。n < 100000。 第二行包含n個整數&#xff0c;表示數組的元素&#xff0c;整數之間以一個空格分開 。每個整數的絕對值不超過…

歸并-求逆序數

考慮1,2,…,n (n < 100000)的排列i1&#xff0c;i2&#xff0c;…&#xff0c;in&#xff0c;如果其中存在j,k&#xff0c;滿足 j < k 且 ij > ik&#xff0c; 那么就稱(ij,ik)是這個排列的一個逆序。 一個排列含有逆序的個數稱為這個排列的逆序數。例如排列 26345…

動態規劃概述

注&#xff1a;第一次看不需要全理解&#xff0c;以后動態規劃做多了&#xff0c;再回來看看&#xff0c;會有更深的理解 先符上其它文章&#xff0c;看完這篇就可以開始看這些咯。 萌新&#xff1a; …

動態規劃-背包是否裝滿

很簡單但是需要特別注意的&#xff0c;一定不要錯。 背包&#xff1a; 有n 種不同的物品&#xff0c;每個物品有兩個屬性&#xff0c;v體積&#xff0c;c價值&#xff0c;現在給一個體積為 m 的背包&#xff0c;問最多可帶走多少價值的物品。 狀態轉移方程 dp[i][j]max…

dp打開思路3:HDU1069 POJ3616 POJ1088

HDU 1069 題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1069 題意&#xff1a;把給定的長方體&#xff08;不限&#xff09;疊加在一起&#xff0c;疊加的條件是&#xff0c;上面一個長方體的長和寬都比下面長方體的長 和寬短&#xff1b;求這些長方體能…

輸入輸出外掛

板子不解釋 //適用于正負整數 template <class T> inline bool scan_d(T &ret) {char c; int sgn;if(cgetchar(),cEOF) return 0; //EOFwhile(c!?&&(c<0||c>9)) cgetchar();sgn(c?)??1:1;ret(c?)?0:(c?0);while(cgetchar(),c>0&&c&…

dp打開思路4:POJ1189 UVA12511 HDU2845 HBCPC K

POJ1189 http://poj.org/problem?id1189 怎么說呢&#xff0c;不算難&#xff0c;但是容易出問題 我一開始的思路是&#xff0c;第一個釘子只有一種情況&#xff0c;然后下面每個釘子&#xff1a;左邊有釘子就加左邊的情況數&#xff0c;右邊有釘子就加右邊的情況數&#x…