Python
数学

数式とPython式の対応関係をまとめてみた

はじめに

Wikipediaの数学記号の表の一部を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$ は frozenset 型の値、 $P$ は bool 型の値を返す関数とします。
注意

  • Markdownのテーブル記法と衝突するため、 | で表現しています。
  • product, chain.from_iterable, combinationsitertools で定義されている関数です。
意味 数式 Python式
内包表記 $\{a \mid a \in A, P(a) \}$ frozenset(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}$ frozenset(frozenset(s for s in S if s) for S in product(*((None, a) for a in A)))
直積集合 $A \times B$ frozenset(product(A, B))
最大値 $\max{A}$ max(A)
最小値 $\min{A}$ min(A)
濃度 $ \mid A \mid$ len(A)

べき集合を扱うことはほとんどないと思いますが、Python式で表現しようとするとしんどいですね。
productfrozenset に限らず iterable なオブジェクトにも適用可能なので、結構使えます。

定数

pi, emath で定義されている値です。

意味 数式 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, gfloat 型の値を返す関数、 m は0以上の int 型の値、 x, yfloat 型の値、 zcomplex 型の値を表すとします。
注意

  • reducefunctools で定義されている関数です。
  • muloperator で定義されている関数です。
  • factorial, ceil, floormath で定義されている関数です。
意味 数式 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.imag
指数 $x^y$ x**y
冪根 $\sqrt[m]{x}$ x**(1/m)

reduce(二項演算子, iterableなオブジェクト) は総乗に限らず、二項演算を繰り返し適用する際に便利です。

おわりに

標準ライブラリだけでも、多くの数式をきれいなPython式で表現できますね。