どうも、木村(@kimu3_slime)です。
今回は、Julia(SymPy)で数の集合関係の計算をする方法紹介します。
準備
SymPyを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("SymPy") |
準備として、以下のコードを実行しておきます。
1 | using SymPy |
数の集合関係の計算をする方法
有限集合、集合演算
「sympy.FiniteSet(要素)」で、指定した要素をもつ有限集合が構成できます。
1 | A1 = sympy.FiniteSet(1,2,3,4,5) |
\[ \begin{aligned}\left\{1, 2, 3, 4, 5\right\}\end{aligned} \]
「要素 in 集合」または「集合.contains(要素)」で、その要素が集合に含まれる\(a\in A\)かがチェックできます。
1 2 | 3 in A1 A1.contains(3) |
1 | true |
\[ \begin{aligned}\text{True}\end{aligned} \]
集合同士の共通部分は「A.intersect(B)」、和集合は「A+B」、差集合(補集合)は「A-B」で求められます。
1 2 3 4 | A2 = sympy.FiniteSet(2,6) A1.intersect(A2) A1 + A2 A1 - A2 |
\[ \begin{aligned}\left\{2, 6\right\}\end{aligned} \]
\[ \begin{aligned}\left\{2\right\}\end{aligned} \]
\[ \begin{aligned}\left\{1, 2, 3, 4, 5, 6\right\}\end{aligned} \]
\[ \begin{aligned}\left\{1, 3, 4, 5\right\}\end{aligned} \]
部分集合であるかどうか、\(B\subset A\)の判定は、「B.is_subset(A)」です。
1 | A2.is_subset(A1) |
1 | false |
空集合は「sympy.EmptySet」です。
1 2 | sympy.EmptySet (sympy.EmptySet).is_subset(A1) |
\[ \begin{aligned}\emptyset\end{aligned} \]
1 | true |
数の集合と内包記法
数の集合として、SymPyにはあらかじめ用意されているものがあります。例えば
1 2 | sympy.Integers sympy.Reals |
\[ \begin{aligned}\mathbb{Z}\end{aligned} \]
\[ \begin{aligned}\mathbb{R}\end{aligned} \]
などです。他にも自然数や複素数が用意されています。
詳しくは:Special Sets – SymPy 1.9 documentation
整数の部分集合として、偶数全体の集合を作りたいとしましょう。
「sympy.ConditionSet(x, xに関する関係式, 全体集合)」で、全体集合のうちxに関する条件を満たす要素の集合が作れます。
1 2 | @syms x y A3 = sympy.ConditionSet(x,Eq(sympy.Mod(x,2),0), sympy.Integers) |
\[ \begin{aligned}\left\{x\; \middle|\; x \in \mathbb{Z} \wedge x\bmod{2} = 0 \right\}\end{aligned} \]
「sympy.Mod(x,2)」は\(x\)を2で割ったあまりで、それが0に等しい=偶数の集合です。
1 2 | 6 in A3 -1 in A3 |
1 2 | true false |
条件の部分を「sympy.Mod(x,2)==0 」と直接的に指定すると、数学的には正しいように見えますが、うまくいきません。
1 | A3 = sympy.ConditionSet(x,sympy.Mod(x,2)==0 , sympy.Integers) |
\[ \begin{aligned}\emptyset\end{aligned} \]
これは「sympy.Mod(x,2) == 0」が\(x\)によらず常にfalseの文
1 | sympy.Mod(x,2) == 0 |
として解釈されているためですね。「Eq」を使って等式として表せば、\(x\)を含んだ条件文として扱ってくれます。
像集合「sympy.imageset(変数,関数, 変数の範囲)」を使うと、より簡単に同じ集合を表せますね。
1 | sympy.imageset(x,2*x, sympy.Integers) |
\[ \begin{aligned}\left\{2 x\; \middle|\; x \in \mathbb{Z}\right\}\end{aligned} \]
実数の部分集合としては、区間の集合を表す関数が用意されています。
閉区間\([a,b]\)は「sympy.Interval(a,b)」で、開区間\((a,b)\)は「sympy.Interval.open(a,b)」です。
1 2 | A4 = sympy.Interval(0,1) A5 = sympy.Interval.open(0,1) |
\[ \begin{aligned}\left[0, 1\right]\end{aligned} \]
\[ \begin{aligned}\left(0, 1\right)\end{aligned} \]
1 2 | 1 in A4 1 in A5 |
1 2 | true false |
端点に無限大を表す2つのオー「oo」を使うことで、無限区間も表せます。
1 | sympy.Interval(0,oo) |
\[ \begin{aligned}\left[0, \infty\right)\end{aligned} \]
直積集合
集合の直積(デカルト積)\(A_1 \times A_2\)は、「A1 *A2」で表せます。
1 2 | A6 = A1 *A2 Sym((1,2)) in A6 |
\[ \begin{aligned}\left\{1, 2, 3, 4, 5\right\} \times \left\{2, 6\right\}\end{aligned} \]
1 | true |
ユークリッド平面\(\mathbb{R}^2\)は、次のように2乗として表せます。
1 | sympy.Reals^2 |
\[ \begin{aligned}\mathbb{R}^{2}\end{aligned} \]
平面の単位円周、単位円盤は次のように内包記法で表せます。
1 2 | A7 = sympy.ConditionSet((x,y),Eq(x^2+y^2,1), sympy.Reals^2) Sym((0,-1)) in A7 |
\[ \begin{aligned}\left\{\left( x, \ y\right)\; \middle|\; \left( x, \ y\right) \in \mathbb{R}^{2} \wedge x^{2} + y^{2} = 1 \right\}\end{aligned} \]
1 | true |
不等式は関係式「rel」の一種として表せます。
1 2 3 | sympy.Rel(x^2+y^2 ,1 ,"<=") A8 = sympy.ConditionSet((x,y),sympy.Rel(x^2+y^2 ,1 ,"<="), sympy.Reals^2) Sym((0,0)) in A8 |
\[ \begin{aligned}x^{2} + y^{2} \leq 1\end{aligned} \]
\[ \begin{aligned}\left\{\left( x, \ y\right)\; \middle|\; \left( x, \ y\right) \in \mathbb{R}^{2} \wedge x^{2} + y^{2} \leq 1 \right\}\end{aligned} \]
1 | true |
以上、Julia(SymPy)で数の集合関係の計算をする方法を紹介してきました。
有限集合だけでなく、数の集合も代数的に表せるのは便利ですね。
木村すらいむ(@kimu3_slime)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)