取模運算
模運算基本概念
對於一個鐘錶來說,我們知道他從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 >>>