1. wotsushi

    Posted

    wotsushi
Changes in title
+数式とPython式の対応関係をまとめてみた
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,89 @@
+# はじめに
+Wikipediaの[数学記号の表](https://ja.wikipedia.org/wiki/数学記号の表)の一部をPython式で表現してみました。
+標準ライブラリのみ用いて表現しています。
+数式はよくわからんけど、Python式なら分かるって人もどうぞ。
+
+## 記号論理
+数式における $X$, $Y$ は命題、 $A$ は集合、 $P$ は述語を、
+Python式における $X$, $Y$ は `bool` 型の値、 $A$ は iterable なオブジェクト、 $P$ は `bool` 型の値を返す関数を表すとします。
+
+|意味|数式|Python式|
+|---|---|---|
+|論理積| $X \land Y$ | `X and Y` |
+|論理和| $X \lor Y$ | `X or Y` |
+|論理否定| $\lnot X$ | `not X` |
+|論理包含| $X \Rightarrow Y$ | `not X or Y` |
+|全称限量記号| $\forall a \in A, P(a)$| `all(P(a) for a in A)` |
+|存在限量記号| $\exists a \in A, P(a)$| `any(P(a) for a in A)` |
+
+`all`, `any` は組み込み関数で、結構便利です。
+
+## 集合論
+数式における $A$, $B$ は集合を、 $P$ は述語を、
+Python式における $A$, $B$ は `set` 型の値、 $P$ は `bool` 型の値を返す関数とします。
+**注意**
+
+* Markdownのテーブル記法と衝突するため、 `|` を `|` で表現しています。
+* `product`, `chain.from_iterable`, `combinations` は [itertools](https://docs.python.jp/3/library/itertools.html) で定義されている関数です。
+
+|意味|数式|Python式|
+|---|---|---|
+|内包表記| $\\{a \mid a \in A, P(a) \\}$ | `{a for a in A if P(a)}` |
+|元である| $a \in A$ | `a in A` |
+|元でない| $a \notin A$ | `a not in A` |
+|部分集合| $A \subseteq B$ | `A <= B` |
+|真部分集合| $A \subset B$ | `A < B` |
+|積集合| $A \cap B$ | `A & B` |
+|和集合| $A \cup B$ | `A | B` |
+|差集合| $A \setminus B$ | `A - B` |
+|べき集合| $2^{A}$ | `set(chain.from_iterable(combinations(A, k) for k in range(len(A) + 1)))` |
+|直積集合| $A \times B$ | `set(product(A, B))` |
+|最大値| $\max{A}$ | `max(A)`|
+|最小値| $\min{A}$ | `min(A)`|
+|濃度| $ \mid A \mid$ | `len(A)` |
+
+べき集合を扱うことはほとんどないと思いますが、Python式で表現しようとするとしんどいですね。
+`product` は `set` に限らず `iterable` なオブジェクトにも適用可能なので、結構使えます。
+
+## 定数
+`pi`, `e` は [math](https://docs.python.jp/3/library/math.html) で定義されている値です。
+
+|意味|数式|Python式|
+|---|---|---|
+|0| $0$ | $0$ |
+|1| $1$ | $1$ |
+|円周率| $\pi$ | `pi` |
+|ネイピア数| $e$ | `e` |
+|虚数単位| $i$ | `1j` |
+
+Pythonでは、複素数を `4+2j` のように表せます。
+
+## 代数学
+数式における $n$ は自然数、 $A$ は集合, $f$ は $\mathbb{N} \rightarrow \mathbb{R}$ なる写像, $g$ は $A \rightarrow \mathbb{R}$ なる写像、
+$m$ は非負の整数、 $x$, $y$ は実数、 $z$ は複素数、
+Python式における `n` は1以上の `int` 型の値、 $A$ はiterableなオブジェクト、 `f`, `g` は `float` 型の値を返す関数、 `m` は0以上の `int` 型の値、 `x`, `y` は `float` 型の値、 `z` は `complex` 型の値を表すとします。
+**注意**
+
+* `reduce` は [functools](https://docs.python.jp/3/library/functools.html) で定義されている関数です。
+* `mul` は [operator](https://docs.python.jp/3/library/operator.html) で定義されている関数です。
+* `factorial`, `ceil`, `floor` は [math](https://docs.python.jp/3/library/math.html) で定義されている関数です。
+
+|意味|数式|Python式|
+|---|---|---|
+|総和| $\sum_{i=1}^{n} f(i)$ | `sum(f(i) for i in range(1, n + 1))` |
+|総和| $\sum_{a \in A} g(a)$ | `sum(g(a) for a in A)` |
+|総乗| $\prod_{i=1}^{n} f(i)$ | `reduce(mul, (f(i) for i in range(1, n + 1))` |
+|総乗| $\prod_{a \in A} g(a)$ | `reduce(mul, (g(a) for x in A))` |
+|階乗| $m!$ | `factorial(m)` |
+|天井関数| $\lceil x \rceil $ | `ceil(x)` |
+|床関数| $\lfloor x \rfloor $ | `floor(x)` |
+|絶対値| $\mid x \mid $| `abs(x)`|
+|実部| $\Re{z}$ | `z.real` |
+|虚部| $\Im{z}$ | `z.img` |
+|指数| $x^y$ | `x**y` |
+|冪根| $\sqrt[m]{x}$ | `x**(1/m)` |
+
+`reduce(二項演算子, iterableなオブジェクト)` は総乗に限らず、二項演算を繰り返し適用する際に便利です。
+
+## おわりに
+標準ライブラリだけでも、多くの数式をきれいなPython式で表現できますね。