はじめに
Wikipediaの数学記号の表の一部をPython式で表現してみました。
標準ライブラリのみ用いて表現しています。
数式はよくわからんけど、Python式なら分かるって人もどうぞ。
記号論理
数式における , は命題、 は集合、 は述語を、
Python式における , は bool 型の値、 は iterable なオブジェクト、 は bool 型の値を返す関数を表すとします。
| 意味 | 数式 | Python式 |
|---|---|---|
| 論理積 | X and Y |
|
| 論理和 | X or Y |
|
| 論理否定 | not X |
|
| 論理包含 | not X or Y |
|
| 全称限量記号 | all(P(a) for a in A) |
|
| 存在限量記号 | any(P(a) for a in A) |
all, any は組み込み関数で、結構便利です。
集合論
数式における , は集合を、 は述語を、
Python式における , は frozenset 型の値、 は bool 型の値を返す関数とします。
注意
- Markdownのテーブル記法と衝突するため、
|を|で表現しています。 -
product,chain.from_iterable,combinationsは itertools で定義されている関数です。
| 意味 | 数式 | Python式 |
|---|---|---|
| 内包表記 | frozenset(a for a in A if P(a)) |
|
| 元である | a in A |
|
| 元でない | a not in A |
|
| 部分集合 | A <= B |
|
| 真部分集合 | A < B |
|
| 積集合 | A & B |
|
| 和集合 | A | B |
|
| 差集合 | A - B |
|
| べき集合 | frozenset(frozenset(s for s in S if s) for S in product(*((None, a) for a in A))) |
|
| 直積集合 | frozenset(product(A, B)) |
|
| 最大値 | max(A) |
|
| 最小値 | min(A) |
|
| 濃度 | len(A) |
べき集合を扱うことはほとんどないと思いますが、Python式で表現しようとするとしんどいですね。
product は frozenset に限らず iterable なオブジェクトにも適用可能なので、結構使えます。
定数
pi, e は math で定義されている値です。
| 意味 | 数式 | Python式 |
|---|---|---|
| 0 | ||
| 1 | ||
| 円周率 | pi |
|
| ネイピア数 | e |
|
| 虚数単位 | 1j |
Pythonでは、複素数を 4+2j のように表せます。
代数学
数式における は自然数、 は集合, は なる写像, は なる写像、
は非負の整数、 , は実数、 は複素数、
Python式における n は1以上の int 型の値、 はiterableなオブジェクト、 f, g は float 型の値を返す関数、 m は0以上の int 型の値、 x, y は float 型の値、 z は complex 型の値を表すとします。
注意
-
reduceは functools で定義されている関数です。 -
mulは operator で定義されている関数です。 -
factorial,ceil,floorは math で定義されている関数です。
| 意味 | 数式 | Python式 |
|---|---|---|
| 総和 | sum(f(i) for i in range(1, n + 1)) |
|
| 総和 | sum(g(a) for a in A) |
|
| 総乗 | reduce(mul, (f(i) for i in range(1, n + 1))) |
|
| 総乗 | reduce(mul, (g(a) for x in A)) |
|
| 階乗 | factorial(m) |
|
| 天井関数 | ceil(x) |
|
| 床関数 | floor(x) |
|
| 絶対値 | abs(x) |
|
| 実部 | z.real |
|
| 虚部 | z.imag |
|
| 指数 | x**y |
|
| 冪根 | x**(1/m) |
reduce(二項演算子, iterableなオブジェクト) は総乗に限らず、二項演算を繰り返し適用する際に便利です。
おわりに
標準ライブラリだけでも、多くの数式をきれいなPython式で表現できますね。
コメント
@shiracamus(編集済み) リンクをコピー このコメントを報告
1
@wotsushiリンクをコピー このコメントを報告 0
@kzm4269リンクをコピー このコメントを報告 1
@SaitoTsutomu(編集済み) リンクをコピー このコメントを報告
1
@wotsushiリンクをコピー このコメントを報告 0
@wotsushi(編集済み) リンクをコピー このコメントを報告 0
@bellbindリンクをコピー このコメントを報告 1
@wotsushiリンクをコピー このコメントを報告 0
@yamasaki1maリンクをコピー このコメントを報告 0
@wotsushiリンクをコピー このコメントを報告 1
べき集合2A を外部モジュールに頼らず書くと、こうかな?
べき乗使ってそれっぽく?
ビット演算は頭から抜けていました。美しいですね。
補足です。
(P(a) for a in A)はmap(P, A)と書けます。こんなのも
@kzm4269 さん
私も
all(map(P, A))と書くほうが好みですね。今回は数式と対応してる感じを表したくて内包表記にしました。
@SaitoTsutomu さん
S=∏a∈A{∅,{a}} として、べき集合は
2A=⋃S∈S{⋃s∈Ss}
と表現できるということですか、面白い。
Python式がきれいです。
数学的集合としては、
setよりfrozensetのほうがあっていると思います。べき集合の場合、
setのメンバーとしてsetは使えませんが、frozensetは可能です。@bellbind さん
ありがとうございます。たしかに、
frozensetのほうが適していますね。べき集合のPython式は、べき集合の要素が集合ではなくタプルになっていましたし...なので、
frozensetを使う書き方に変更しました。ついでに、 @SaitoTsutomu さんの書き方を参考に、べき集合のPython式を変更しました。すばらしい記事です。内包表記の書き方をいまいち気持ち悪く思っていたのですが、
数式での表現を見てストンと理解できました。そうか、確かにこういう意味合いだ。
@yamasaki1ma ありがとうございます。たしかに内包表記の書き方に抵抗を感じる人は多いですね。これから親しみを持って内包表記を使っていただけたら嬉しいです!