ログイン中のQiita Team
ログイン中のチームがありません

Qiita Team にログイン
コミュニティ
OrganizationイベントアドベントカレンダーQiitadon (β)
サービス
Qiita JobsQiita ZineQiita Blog
Python
数学
296
どのような問題がありますか?

この記事は最終更新日から3年以上が経過しています。

投稿日

更新日

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

はじめに

Wikipediaの数学記号の表の一部をPython式で表現してみました。
標準ライブラリのみ用いて表現しています。
数式はよくわからんけど、Python式なら分かるって人もどうぞ。

記号論理

数式における X, Y は命題、 A は集合、 P は述語を、
Python式における X, Ybool 型の値、 A は iterable なオブジェクト、 Pbool 型の値を返す関数を表すとします。

意味 数式 Python式
論理積 XY X and Y
論理和 XY X or Y
論理否定 ¬X not X
論理包含 XY not X or Y
全称限量記号 aA,P(a) all(P(a) for a in A)
存在限量記号 aA,P(a) any(P(a) for a in A)

all, any は組み込み関数で、結構便利です。

集合論

数式における A, B は集合を、 P は述語を、
Python式における A, Bfrozenset 型の値、 Pbool 型の値を返す関数とします。
注意

  • Markdownのテーブル記法と衝突するため、 | で表現しています。
  • product, chain.from_iterable, combinationsitertools で定義されている関数です。
意味 数式 Python式
内包表記 {aaA,P(a)} frozenset(a for a in A if P(a))
元である aA a in A
元でない aA a not in A
部分集合 AB A <= B
真部分集合 AB A < B
積集合 AB A & B
和集合 AB A | B
差集合 AB A - B
べき集合 2A frozenset(frozenset(s for s in S if s) for S in product(*((None, a) for a in A)))
直積集合 A×B frozenset(product(A, B))
最大値 maxA max(A)
最小値 minA min(A)
濃度 A len(A)

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

定数

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

意味 数式 Python式
0 0 0
1 1 1
円周率 π pi
ネイピア数 e e
虚数単位 i 1j

Pythonでは、複素数を 4+2j のように表せます。

代数学

数式における n は自然数、 A は集合, fNR なる写像, gAR なる写像、
m は非負の整数、 x, y は実数、 z は複素数、
Python式における n は1以上の int 型の値、 A はiterableなオブジェクト、 f, gfloat 型の値を返す関数、 m は0以上の int 型の値、 x, yfloat 型の値、 zcomplex 型の値を表すとします。
注意

  • reducefunctools で定義されている関数です。
  • muloperator で定義されている関数です。
  • factorial, ceil, floormath で定義されている関数です。
意味 数式 Python式
総和 i=1nf(i) sum(f(i) for i in range(1, n + 1))
総和 aAg(a) sum(g(a) for a in A)
総乗 i=1nf(i) reduce(mul, (f(i) for i in range(1, n + 1)))
総乗 aAg(a) reduce(mul, (g(a) for x in A))
階乗 m! factorial(m)
天井関数 x ceil(x)
床関数 x floor(x)
絶対値 x abs(x)
実部 z z.real
虚部 z z.imag
指数 xy x**y
冪根 xm x**(1/m)

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

おわりに

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

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
wotsushi
この記事は以下の記事からリンクされています

コメント

(編集済み)
リンクをコピー
このコメントを報告

べき集合 2A を外部モジュールに頼らず書くと、こうかな?
べき乗使ってそれっぽく?

>>> A = set([1, 2, 3])
>>> set(tuple(a for i, a in enumerate(A) if n & 2**i) for n in range(2**len(A)))
set([(1, 2), (1, 3), (1,), (2,), (3,), (1, 2, 3), (), (2, 3)])
1
リンクをコピー
このコメントを報告

ビット演算は頭から抜けていました。美しいですね。

0
リンクをコピー
このコメントを報告

補足です。 (P(a) for a in A)map(P, A) と書けます。

1
(編集済み)
リンクをコピー
このコメントを報告

こんなのも

A = [1, 2, 3]
[sum(s, []) for s in product(*(([], [a]) for a in A))]
[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]
1
リンクをコピー
このコメントを報告

@kzm4269 さん
私も all(map(P, A)) と書くほうが好みですね。
今回は数式と対応してる感じを表したくて内包表記にしました。

0
(編集済み)
リンクをコピー
このコメントを報告

@SaitoTsutomu さん
S=aA{,{a}} として、べき集合は
2A=SS{sSs}
と表現できるということですか、面白い。
Python式がきれいです。

0
リンクをコピー
このコメントを報告

数学的集合としては、setよりfrozensetのほうがあっていると思います。
べき集合の場合、setのメンバーとしてsetは使えませんが、frozensetは可能です。

1
リンクをコピー
このコメントを報告

@bellbind さん
ありがとうございます。たしかに、 frozenset のほうが適していますね。べき集合のPython式は、べき集合の要素が集合ではなくタプルになっていましたし...
なので、 frozenset を使う書き方に変更しました。ついでに、 @SaitoTsutomu さんの書き方を参考に、べき集合のPython式を変更しました。

0
リンクをコピー
このコメントを報告

すばらしい記事です。内包表記の書き方をいまいち気持ち悪く思っていたのですが、
数式での表現を見てストンと理解できました。そうか、確かにこういう意味合いだ。

0
リンクをコピー
このコメントを報告

@yamasaki1ma ありがとうございます。たしかに内包表記の書き方に抵抗を感じる人は多いですね。これから親しみを持って内包表記を使っていただけたら嬉しいです!

1
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
マイクロソフト認定資格を取得する際の学習方法や経験談、おすすめ学習リソースなどを紹介しよう!
~
296
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー