10.裴蜀定理和歐幾裡得算法快速求解倒水問題

2021-01-14 和孩子一起學Python

接上題:3升、5升的無刻度水杯是否可以倒出正好4升水?

或者問:a升、b升的無刻度水杯是否可以倒出正好c升水?

根據題目的要求,我們只需要判斷是否可行,而不需要給出倒水的步驟。怎麼求倒水的步驟,在介紹BFS(廣度優先搜索)算法的時候再講。

雖然水杯沒有刻度, 但我們總是可以倒入整杯的水 +a,+b,或者倒出整杯的水 -a,-b。 那麼我們可以把問題簡化為一個表達式。

x * a + y * b = c

也就是說,倒入或倒出x次a杯,倒入或倒出y次b杯,是否可以得到c升水。我們要求解的是,是否存在這樣的整數 x, y 使得等式成立。(注意,x,y可以是負數)

比如3升,5升倒出4升,就是求解

x * 3 + y * 5 = 4

是否成立。

顯然, x = -2 , y = 2 時

-2 * 3 + 2 * 5 = 4

所以,3升,5升可以倒出4升。

那麼怎麼判斷,x,y 是否有解呢?

法國數學家艾蒂安·裴蜀已經給出了答案。

裴蜀定理(或貝祖定理,Bézout's identity)

註:通俗簡化的描述

整數a、b和它們的最大公約數c。

一定存在整數x,y,使ax+by=c成立。

若d是c的倍數,顯然也一定存在整數x,y,使得 ax+by=d成立。

3和5的最大公約數是1,所以一定存在 x,y 使得如下等式成立。

x * 3 + y * 5 = 1 * 4

實際上,兩個容量互質的水杯,可以倒出任意容量的水。

雖然聽上去有些不可思議,但的確如此。

比如說13 和 61互質,所以這樣的兩個水杯可以倒出任意容量的水。

所以,求解如下等式,x,y是否有整數解

x * a + y * b = c

就是先算 a,b 的最大公約數,然後判斷 c 是不是 a,b最大公約數的正整數倍。

而數學上,求兩個數的最大公約數,有一個非常古老、著名的算法:歐幾裡得算法。

歐幾裡得算法

歐幾裡得算法是特別有意思的一個算法。因為它

特別古老,可以說是最古老的算法之一。

特別能唬人,直接用歐幾裡得的名字命名。

特別重要和廣泛的應用。擴展歐幾裡得算法是RSA加密算法的基石。如果沒有RSA加密算法,網際網路世界將毫無安全可言,網上交易將不復存在。後面在講字符串的時候會介紹RSA加密算法。

但是它又特別簡單。它有一個通俗的名字:輾轉相除法。

歐幾裡得算法來自於歐幾裡得定理。

歐幾裡得定理:

兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。

比如說,求465和69的最大公約數。

根據定理 465和69的最大公約數等於69(兩者較小的一個) 和 51(兩者相除餘數)的最大公約數。就如下圖。通過輾轉相除,最後得到465和69的最大公約數是3。

Python實現歐幾裡得算法

輾轉相除法顯然更適合用while循環來做,因為我們事先不清楚需要循環多少次。

m = 465

n = 69

while m % n != 0:

temp = n

n = m % n

m = temp

print(n)

注意temp的作用。

如果沒有temp,寫成下面這樣。

n = m % n

m = n

此時m = n 的那個n已經不是原來那個n啦!

Python中,有一種更簡潔的寫法。

多變量同時賦值。

m = 465

n = 69

while m % n != 0:

n , m = m % n , n

print(n)

n , m = m%n , n

對兩個變量同時賦值,Python總會先完成右邊的計算,再統一進行賦值。

Python最最基本的內容到這裡就介紹完了。

下篇將是小結和精選的幾道階段練習題。

不過完成這些習題,還要補充2個小知識點。

Python的鍵盤輸入

Python提供了 內置函數 input() 從標準輸入讀入一行文本,默認的標準輸入是鍵盤。

如上圖,當執行 a = input() 時,會出現一個輸入框一直等待你的輸入。

用 print(a) 把 a 列印出來,正是你在鍵盤上輸入的內容。

a = input()

print(a)

要注意的是,鍵盤上輸入的內容默認都會當成字符串。

如果你想要的是數字,別忘記通過 int() 函數轉換為數字。

a = input()

b = input()

c = int(a) + int(b)

print(c)

print()的更多用法

print()列印多個變量,多個變量用逗號分隔

print()不換行。 print()函數默認是換行的。如果想讓它不換行,可以通過end 參數。

print()格式化。 如下程序,用%d,%d,%d先佔據了3個位置,然後在%符號後面用括號內的(i,j,i*j)分別對應前面的3個位置。

注意:

%d 表示格式化為整數,會把對應的變量當做整數處理。

常用的還有

%f 格式化為浮點數。

%s 格式化為字符串。

猜數字的遊戲

隨機生成一個0~100之間的數字。

讓別人通過鍵盤輸入數字來猜。如果猜對了,列印「猜對了」。

否則,列印「小了!」 或者 「大了!」

微信公眾號同名

相關焦點

  • 著寫流傳2300年數學經典,被世人稱為「幾何學之父」——歐幾裡得
    插圖和第2卷的命題5相同幾何原本對於幾何學、數學和科學的未來發展,對於西方人的整個思維方法都有極大的影響。《幾何原本》的主要對象是幾何學,但它還處理了數論、無理數理論等其他課題,例如著名的歐幾裡得引理和求最大公因數的歐幾裡得算法。
  • 了解算法的前世今生
    一、中國算法的前世中國古代數學是以創造算法特別是各種解方程的算法為主線。從線性方程組到高次多項式方程,乃至不定方程,中國古代數學家創造了一系列先進的算法(中國數學家稱之為「術」),他們用這些算法去求解相應類型的代數方程,從而解決導致這些方程的各種各樣的科學和實際問題。
  • 偉大的數學家歐幾裡得
    在歐幾裡得以前,人們已經積累了許多幾何學的知識,然而這些知識當中,存在一個很大的缺點和不足,就是缺乏系統性。大多數是片斷、零碎的知識,公理與公理之間、證明與證明之間並沒有什麼很強的聯繫性,更不要說對公式和定理進行嚴格的邏輯論證和說明。
  • 戴維寧定理是什麼?如何證明?_戴維寧定理等效電路求解_戴維寧定理...
    _戴維寧定理等效電路求解_戴維寧定理習題 發表於 2017-08-25 10:20:20   戴維寧定理(也稱為戴維南定理):任何一個線性含源一埠網絡,對外電路來說,總可以用一個電壓源和電阻的串聯組合來等效置換
  • ...寧定理是什麼?如何證明?_戴維寧定理等效電路求解_戴維寧定理習題
    _戴維寧定理等效電路求解_戴維寧定理習題 發表於 2017-08-25 10:20:20   戴維寧定理(也稱為戴維南定理):任何一個線性含源一埠網絡,對外電路來說,總可以用一個電壓源和電阻的串聯組合來等效置換;此電壓源的電壓等於外電路斷開時埠處的開路電壓
  • 編程世界中的18個重要的算法
    這種搜索算法每一次比較都使搜索範圍縮小一半。Branch and bound分支定界(branch and bound)算法是一種在問題的解空間樹上搜索問題的解的方法。但與回溯算法不同,分支定界算法採用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界算法中,每一個活結點只有一次機會成為擴展結點。
  • 歐幾裡得和他的《幾何原本》
    該派對數學領域貢獻眾多,比如提出了完全數,質數和合數的概念,而最著名的是畢達哥拉斯定理:a^2+ b^2 = c^2——在中國的教科書上稱之為「勾股定理」,出自《周髀算經》。勾股定理有了畢達哥拉斯定理,問題就來了:如果直角三角形兩個直角邊的長度都為1,則斜邊的長度的平方等於2,是一個什麼樣的數滿足其平方等於2?
  • 全國數學聯賽一試AB卷試題及詳細解析(附知識範圍和參賽步驟)
    2020年全國高中數學聯賽一試A卷和B卷試題及詳細解析評分標準!(附有全國數學聯賽知識範圍和參加全國奧林匹克數學競賽步驟)全國數學聯賽知識範圍:全國高中數學聯賽(加試)在知識方面有所擴展,適當增加一些教學大綱之外的內容,所增加內容是:1.平面幾何西姆松定理;三角形旁心、費馬點、歐拉線;幾何不等式;幾何極值問題;幾何中的變換:對稱、平移、旋轉;圓的冪和根軸面積方法,複數方法,向量方法,解析幾何方法。
  • 射影定理創始人,幾何學之父是何人物?
    相信大家在初中就學過射影定理,在考試中也是頻頻使用,方便了我們很多題目的計算過程。直角三角形射影定理,是在直角三角形中,斜邊上的高是兩直角邊在斜邊上射影的比例中項,每一條直角邊是這條直角邊在斜邊上的射影和斜邊的比例中項。
  • 比較直觀地歐幾裡得算法與更相減損術證明
    歐幾裡得算法,也叫做輾轉相除法。是偉大的歐幾裡得在《幾何原本》中描述的一種求兩個整數最大公約數的高效算法。是最古老的算法之一。相對應的,中國古代《九章算術》中記載的更相減損術也是求兩個整數最大公約數的方法。但是更相減損術的效率卻沒有歐幾裡得算法的高。
  • python快速求解不定積分和定積分
    本文首發於微信公眾號:"算法與編程之美",歡迎關注,及時了解更多此系列博客。python求解不定積分接下來,我們將介紹上述的不定積分的求解。首先導入sympy庫中的所有類和函數。2)求解的結果中省略了常數C,需要自己加上。
  • 戴維寧定理:概念介紹及其求解過程
    二端網絡根據其內部是否含有電源,可分為有源二端網絡和無源二端網絡。任一個無源二端網絡都可以用一個等效電阻來代替,這個電阻叫做該二端網絡的輸入電阻,即從兩個端點看進去的總電阻,如下圖:就像有源濾波器和無源濾波器是一樣的,無源濾波器就是用電阻,電容,電感搭建起來的,不需要外加電源,而有源的就是用運放加電阻電容構成的,而運放是需要電源的,所以叫有源濾波器。二、求解步驟應用戴維寧定理簡化複雜電路,求解某一支路電流的一般步驟如下:(1)將電路分為有源二端網絡和待求支路。
  • 【算法系列】凸優化的應用——Python求解優化問題(附代碼)
    :無約束優化問題和約束優化問題,約束優化問題又可分為含等式約束優化問題和含不等式約束優化問題。無約束優化問題含等式約束的優化問題含不等式約束的優化問題針對以上三種情形,各有不同的處理策略:無約束的優化問題:可直接對其求導,並使其為0,這樣便能得到最終的最優解;含等式約束的優化問題:主要通過拉格朗日乘數法將含等式約束的優化問題轉換成為無約束優化問題求解;含有不等式約束的優化問題:主要通過KKT條件(Karush-Kuhn-Tucker Condition
  • 常見的距離算法和相似度計算方法
    關注 極市平臺 公眾號 ,回復 加群,立刻申請入群~來源|https://zhuanlan.zhihu.com/p/138107999本文整理了常見的距離算法和相似度(係數)算法,並比較了歐氏距離和餘弦距離間的不同之處。
  • 基於蟻群算法求解函數的最大最小值的Matlab源碼「肥波貓」
    基於蟻群算法求解函數的最大最小值的Matlab源碼「肥波貓」上一篇基於遺傳算法求解函數的最大最小值的Matlab源碼「肥波貓」,本次用蟻群算法同樣可以解決。蟻群算法最早是由Marco Dorigo等人在1991年提出,他們在研究新型算法的過程中,發現蟻群在尋找食物時,通過分泌一種稱為信息素的生物激素交流覓食信息從而能快速的找到目標,據此提出了基於信息正反饋原理的蟻群算法。
  • 八年級數學,直角三角形,勾股定理考點及知識點
    知識·規律·方法①勾股定理的應用用於直角三角形中,斜邊的平方等於兩條直角邊的平方和。② 包勾股定理的逆定理:有一條邊的平方等於其他兩邊的平方和的三角形是直角三角形。勾股定理最早的文字記載見於歐幾裡得(公元前三世紀)的《幾何原本》第一卷命題47,「直角三角形斜邊上的正方形面積等於兩直角邊上正方形面積之和」。
  • [算法系列]最優化問題綜述
    次的話就需要遍歷訓練樣本10次。Powell證實了這種新的算法遠比其他方法快速和可靠,使得非線性優化這門學科在一夜之間突飛猛進。擬牛頓法的本質思想是改善牛頓法每次需要求解複雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的複雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函數的梯度。通過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。
  • 100 個最偉大的數學定理,你知多少?
    )18674勾股定理畢達哥拉斯和他的學派公元前 500 年‍關注和樂數學p‍5素數定理阿達瑪(Jacques Hadamard三分角與倍立方體尺規作圖的不可能旺策爾(Pierre Wantzel)18379圓的面積阿基米德(Archimedes)公元前 22510費馬小定理的歐拉推廣歐拉(Leonhard Euler),1760
  • 入門| 機器學習新手必看10大算法
    在機器學習中,有一種叫做「沒有免費的午餐」的定理。簡而言之,它指出沒有任何一種算法對所有問題都有效,在監督學習(即預測建模)中尤其如此。 例如,你不能說神經網絡總是比決策樹好,反之亦然。有很多因素在起作用,例如數據集的大小和結構。
  • 20世紀最偉大的10大算法
    而Dantzig提出的單純形法便是求解類似線性規劃問題的一個極其有效的方法。Francis,找到了一種穩定的特徵值的計算方法,這就是著名的QR算法。這也是一個和線性代數有關的算法,學過線性代數的應該記得「矩陣的特徵值」,計算特徵值是矩陣計算的最核心內容之一,傳統的求解方案涉及到高次方程求根,當問題規模大的時候十分困難。QR算法把矩陣分解成一個正交矩陣(希望讀此文的你,知道什麼是正交矩陣。:D。)