1. 程式人生 > 實用技巧 >取模運算

取模運算

模運算基本概念

  對於一個鐘錶來說,我們知道他從0點開始到12點結束(可以這麼理解),很容易知道

  5點+3點 = 8點

  那麼,9點+ 200點 的時候,時針再哪呢? 答 :

    209 -12 = 197

    197 - 12 = 185

    ....

    17 -12 = 5

    這種“回撥”叫做取模運算(modular arithmetic) 我們說 17 模 12 等於 5

    Python中模運算子是 %

    某種程度上,我們可以說:“模” 是 “餘數”

    還需要記住,計算機中模運算的結果都是正數, 有方便的計算手段 :

      209 % 12 = 5 即數學上209 mod 12 = 5

>>> 209 mod 12
  File "<stdin>", line 1   
    209 mod 12
        ^
SyntaxError: invalid syntax
>>> 209 % 12   
5   
>>> -21 % 12
3
>>> -21 % 5 
4
>>>


P.S. 多重賦值

>>> a, b = 45, 687
>>> a, b
(
45, 687) >>> a 45 >>> c, v, n, m = ['sad', 456, 'a', a] >>> v 456 >>> v 456 >>> n 'a' >>> c 'sad' >>> m 45 >>> q, w, e = [555, 888] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError:
not enough values to unpack (expected 3, got 2) >>> q, w, e = [555, 888, 999, 'dasdsd'] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 3) >>>

要求 : 賦值運算子''="左右兩邊的項要相等

  可以使用多重賦值來方便地交換值

>>> a, b = 45, 79
>>> a, b = b, a
>>> a, b
(79, 45)
>>>

歐幾里得演算法---找兩個正整數的GCD

  GCD(最大公約數 or 最大公因數)

  因子:若b整除a,則說b是a的一個因子,用b|a 表示

      • 若 a|1, 則a = ±1    
      • 若 a|b 且 b|c 則 a|c
      • 若 a|b 且 b|a, 則 a =±b
      • 任何不等於0的數整除0
      • 對於任意整數m, n,若有b|g, 且 b|h,則有b | (mg + nh)
      • 若有b|g,則存在g1, 使得g可以表示為 g = b×g1

Euclid algorithm:

  (1)假設我們要求出整數a 和 b 的最大公因子d,因為gcd(|a|, |b|) =gcd(a, b), 我們大膽假定 a≥ b > 0

  (2)使用帶餘除法,b除a表示為:      a = q1b + r1 ; 0≤ r1< b

  (3)首先靠遇到r1= 0 時,即 b整數了a , 餘數為0, 模運算 a mod b = 0, a 和 b 的公因子不可能有

    比b更大的數了,所以這時候, 最大公約數 d = gcd(a, b) = b

  (4)另一種情況是,r1≠0, 這時,由於存在 d|a, d|b, 那麼一定有d | (a - q1b) 即: d|r1, d是r1的因子!

  (5)考察gcd(b, r1) = ? 我們知道了

    d|b ,d|r1, 對於b 和 r1的任何一個公因子c來說,有c|(q1b + r1) 即 c|a, c|b,

    我們說 c ≤ d, 因為 d 已經被定義為最大的的那個公因子,

    所以 d =gcd(b, r1)

特別的,如果說gcd(a,b) = 1 ,那麼就說a 和 b互質


Euclid 演算法python實現:

>>> def mygcd(a, b):    
...     while a != 0:
...             a, b = b % a, a 
...     return b


>>>
>>> mygcd(9, 3)     
3
>>> mygcd(409119243, 87780243) 
6837
>>>