%matplotlib inline
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
我們來試試看可不可以用 Python 列出兩個集合的笛卡兒乘積。
A = [1, 2, 3]
B = list('豬狗猴')
這裡用了 Python 快速做 list 的小技巧, 我們看一下 B 的內容。
B
['豬', '狗', '猴']
回憶兩個集合笛卡兒乘積的定義:
$$ A \times B = \{ (a, b) \mid a \in A, b \in B \}$$結果用 Python 還真的很像!
AB = [(a, b) for a in A for b in B]
AB
[(1, '豬'), (1, '狗'), (1, '猴'), (2, '豬'), (2, '狗'), (2, '猴'), (3, '豬'), (3, '狗'), (3, '猴')]
假設
$$ Z = \{m \in \mathbb{Z} \mid -5 \leq m \leq 5 \}$$而
$$ N = \{n \in \mathbb{Z} \mid 0 \leq n \leq 25 \}$$注意 Python 要產生 Z 和 N 的方式。
Z = range(-5, 6)
list(Z)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
N = range(26)
list(N)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
我們知道, $Z$ 和 $N$ 間的一個關係 $R$, 就是一個 $Z \times N$ 的子集合。我們定義
$$R := \{(m,n) \mid m \in Z, n \in N, \mbox{ and } m^2=n\}$$用 Python 寫真是非常像!
R = [(m, n) for m in Z for n in N if m**2 == n]
R
[(-5, 25), (-4, 16), (-3, 9), (-2, 4), (-1, 1), (0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
$R$ 是某個在 $A$ 和 $B$ 的關係 (即 $R \subset A \times B$), 它的 inverse $R^{-1} \subset B \times A$ 是這樣定義的:
$$R^{-1} = \{(b, a) \mid (a, b) \in R \}$$Rinv = [(b, a) for (a, b) in R]
Rinv
[(25, -5), (16, -4), (9, -3), (4, -2), (1, -1), (0, 0), (1, 1), (4, 2), (9, 3), (16, 4), (25, 5)]
又一次 Python 和我們的數學真的有夠像! 記得 $R$ 長這樣:
R
[(-5, 25), (-4, 16), (-3, 9), (-2, 4), (-1, 1), (0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
對一個 $a \in A$, $b \in B$, 我們可否判斷 $a$ 和 $b$ 是否有關係呢?
(1, 1) in R
True
(1, 2) in R
False
我們甚至可以選出一個元素, 列出和它有關係的所有元素!
b = 4
C = [a for a in Z if (b, a) in Rinv]
C
[-2, 2]