歐幾里得演算法 第二十六期 歐幾里得演算法

2021-10-12 09:14:33 字數 1003 閱讀 4762

今天一同事問:輾轉相除法的數學原理是什麼呢?今天我們就一起來認識認識輾轉相除法。

輾轉相除法又稱歐幾里得演算法,是用於求兩個大數的最大公因數的一種方法。這一方法其實類似於中國的「更相減損術」,在《九章算術》有言:可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。假如需要求 1997 和 615 兩個正整數的最大公約數,用歐幾里得演算法,是這樣進行的:

1997 / 615 = 3 (餘 152)

615 / 152 = 4(餘7)

152 / 7 = 21(餘5)

7 / 5 = 1 (餘2)

5 / 2 = 2 (餘1)

2 / 1 = 2 (餘0)

至此,最大公約數為1

以除數和餘數反覆做除法運算,當餘數為 0 時,取當前算式除數為最大公約數,所以就得出了 1997 和 615 的最大公約數 1。

那麼這樣做的道理是什麼呢?

這裡面涉及到乙個整除的和差性質。比如前面案例這一步1997/615=3...152中;將求1997與615的公約數就轉化成了求615與152的公約數了。因為由1997/615=3...152可得1997=615x3+152,求1997與615的最大公約數,就是求(615x3+152)與615的最大公約數,設152與615的最大公約數x,因為x能整除152和615,根據整除的和差性,一定有x能被615x3與152的和整除,所以1997與615的公約數就轉化成了求615與152的公約數了。後面步驟同理,最終1997與615的最大公約數與2和1的最大公約數相等,所以兩數互質。

第二十六期 openEuler組合語言(2)

上一期中我們介紹了一些arm組合語言的程式設計方法,這一期我們介紹一下arm內嵌彙編器並嘗試分析一下openeuler中的一段彙編 c c 編譯器中包含了內嵌彙編器,使用這些內嵌彙編器可以在c或c 中使用大部分arm指令和thumb指令。內嵌彙編指令中,作為運算元的暫存器和常量可以是c或c 表示式,...

演算法 日更 第二十六期 非常基礎的數論

一說到基礎數論,那麼我們就從整除那套理論開始談起。整除 定義 如果a能把b整除,也就是沒有餘數,則我們稱a整除b,亦稱b被a整除,記為a b。其中的 稱為整除符號。性質 自反性 顯然,對於任意正整數n,有n n 傳遞性 若有a b,b c,則有a c 反對稱性 若a b,b a,則有a b 其中性質...

暑假第二十六測

今天又考的奇差 題解 第一題 這麼簡單一道題我想了好久,智商實在是下線了 includeusing namespace std intmain view code 第二題 我們發現e的長度很小,我們可以在上面做文章,其實每個位置對應的 strlen e 都是一樣的 我們用樹狀陣列維護rt pos l...