第2回 可換環の定義
第1回では、環を定義し、その簡単な具体例として、整数環や多項式環を挙げました。
実は、これらは両方とも"可換環"と呼ばれる特殊な環になっています。
第2回では、可換環と非可換環について取り上げたいと思います。
復習
「環」とは、"足し算"と"掛け算"の演算ができて、次の8つの条件を満たす集合のことでした。
定義1
$R$ を集合とし,2つの演算 "$+$" と "$*$" が入っているとする.この時,$R$ が次の8つの条件を満たすならば,$R$ は環であると呼ばれる.
- 任意の $R$ の元 $a,b,c$ に対し,$(a+b)+c=a+(b+c)$. (和の結合律)
- $R$ の元 $0$ が存在して,任意の $R$ の元 $a$ に対し,$a+0=a$. (0の存在)
- 任意の $R$ の元 $a$ に対し,ある $R$ の元 $b$ が存在して,$a+b=0$. ($-a$の存在)
- 任意の $R$ の元 $a,b$ に対し,$a+b=b+a$. (和の交換律)
- 任意の $R$ の元 $a,b,c$ に対し,$a*(b*c)=(a*b)*c$. (積の結合律)
- $R$ の元 $1$ が存在して,任意の $R$ の元 $a$ に対し,$a*1=1*a=a$. (1の存在)
- 任意の $R$ の元 $a,b,c$ に対し,$a*(b+c)=a*b+a*c$. (分配法則1)
- 任意の $R$ の元 $a,b,c$ に対し,$(a+b)*c=a*c+b*c$. (分配法則2)
ちなみに、整数の集合や多項式の条件はすべてこの条件を満たしていました。
可換環
さっそく、このブログのタイトルにも入っている可換環について説明したいと思います。
可換環の定義
可換環とは、上の条件に加え、積の可換性が成り立つ環のことです。
定義2
$R$ を2つの演算 "$+$" と "$*$" が入っている環とする.この時,次の条件を満たすならば,$R$は可換環と呼ばれる.
- 任意の $R$ の元 $a,b$ に対し,$a*b=b*a$. (積の交換律)
可換環とは、名の通り積が交換可能、つまり"可換"な環のことです。
(ちなみに、環の定義から、和の演算はすでに可換 ($a+b=b+a$) です。)
可換環の具体例
整数環 $\mathbb{Z}$、多項式環 $\mathbb{Q}[x]$ は共に可換環です。
実際にPythonで計算してみましょう。環であることは前回確認したので、積の可換性(=交換律)だけを調べます。
>>> 3*5 15 >>> 5*3 15
当然ですが、整数の掛け算に順序は関係ありません。
同様に多項式についても、積の可換性は成り立ちます。
>>> from sympy import * >>> x=Symbol('x') >>> f=x+1 >>> g=2*x**2+3 >>> f*g (x + 1)*(2*x**2 + 3) >>> g*f (x + 1)*(2*x**2 + 3)
非可換環
非可換環の定義
定義3
$R$ を2つの演算 "$+$" と "$*$" が入っている環とする.$R$が可換環ではない時,すなわち,次の条件が成り立つ時,$R$ は非可換環と呼ばれる.
- ある $R$ の元 $a,b$ が存在して,$a*b\neq b*a$.
ここで、注意なのは、非可換環 $R$ のすべての元に対して、$a*b\neq b*a$ が成り立つわけではないということです。これを具体的な例で確認してみます。
非可換環の例
典型的な非可換環として、行列の集合があります。
ここでは、$2\times 2$ の有理数行列*1について、これが非可換環になっていることを確認します。
行列の演算
行列には、次のような和と積の演算が入っています。
\begin{align}
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}
+
\begin{pmatrix}
e & f \\
g & h
\end{pmatrix}
&=
\begin{pmatrix}
a+e & b+f \\
c+g & d+h
\end{pmatrix}
\\ \\ \\
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
*
\begin{pmatrix}
e & f \\
g & h
\end{pmatrix}
& =
\begin{pmatrix}
ae+bg & af+bh \\
ce+dg & cf+dh
\end{pmatrix}
\end{align}
(ここで、$a,b,c,d,e,f,g,h$ はすべて有理数)
まず、この和と積の演算で、$2\times 2$ の有理数行列が環になっていることを、Python の計算で実感してみましょう。
Python での行列の計算は、NumPy module でもできますが、前回使った Sympy でも計算することができます。Matrices — SymPy 1.1.1 documentation
>>> from sympy import * >>> A=Matrix(2,2,[1,2,3,4])
"Matrix($m,n,[a_{11},a_{12},\ldots,a_{mn}$])" は $m\times n$ 行列で $ij$ 成分が $a_{ij}$である行列を意味しています。すなわち、"A=Matrix(2,2,[1,2,3,4])" は
\[
\begin{pmatrix}
1 & 2 \\
3 & 4 \\
\end{pmatrix}
\]
のことです。実際、Python での表示も
>>> A Matrix([ [1, 2], [3, 4]])
のようになっています。同様に、"B=Matrix(2,2,[5,6,7,8])"は
>>> B=Matrix(2,2,[5,6,7,8]) >>> B Matrix([ [5, 6], [7, 8]])
"C=Matrix(2,2,[9,10,11,12])"は
>>> C Matrix([ [ 9, 10], [11, 12]])
です。では、この3つの行列$A,B,C$に対し、環の8つの条件を満たすかどうか確認してみましょう。
行列の集合において、$0$にあたるものは、零行列 $\begin{pmatrix}
0 & 0 \\
0 & 0 \\
\end{pmatrix}$ 、$1$にあたるものは、単位行列 $\begin{pmatrix}
1 & 0 \\
0 & 1 \\
\end{pmatrix}$ です。
それぞれ、
>>> O=Matrix(2,2,[0,0,0,0]) >>> O Matrix([ [0, 0], [0, 0]])
(大文字のO)
>>> E=Matrix(2,2,[1,0,0,1]) >>> E Matrix([ [1, 0], [0, 1]])
(大文字のE)と定義しておきます。整数や多項式の時は、整数の$0$や$1$がそのまま、環の定義における $0$ と $1$ の役割を果たしていましたが、今回は$\begin{pmatrix}
0 & 0 \\
0 & 0 \\
\end{pmatrix}$と $\begin{pmatrix}
1 & 0 \\
0 & 1 \\
\end{pmatrix}$ がその役割を果たします。(環の定義においての $0$ と $1$ はあくまで記号的な $0$ と $1$ であり、必ずしも整数の $0$ と $1$ を意味しているわけはないことに注意です。よく分からない人は気にしなくて大丈夫です。)
まず、和の結合律については、
$(A+B)+C=A+(B+C)$
>>> (A+B)+C Matrix([ [15, 18], [21, 24]]) >>> A+(B+C) Matrix([ [15, 18], [21, 24]])
同じ $\begin{pmatrix}
15 & 18 \\
21 & 24 \\
\end{pmatrix}$ になっているので成り立っています。次に、$0$ の存在については、
$A+O=A$
>>> A+O Matrix([ [1, 2], [3, 4]])
零行列を加えても変わらないので、$A$のままです。残りの6つの条件についても成り立っています。
$A+(-A)=O$
>>> A+(-A) Matrix([ [0, 0], [0, 0]])
$A+B=B+A$
>>> A+B Matrix([ [ 6, 8], [10, 12]]) >>> B+A Matrix([ [ 6, 8], [10, 12]])
$(A*B)*C=A*(B*C)$
>>> (A*B)*C Matrix([ [413, 454], [937, 1030]]) >>> A*(B*C) Matrix([ [413, 454], [937, 1030]])
$A*E=E*A=A$
>>> A*E Matrix([ [1, 2], [3, 4]]) >>> E*A Matrix([ [1, 2], [3, 4]])
$A*(B+C)=A*B+A*C$
>>> A*(B+C) Matrix([ [ 50, 56], [114, 128]]) >>> A*B+A*C Matrix([ [ 50, 56], [114, 128]])
$(A+B)*C=A*C+B*C$
>>> (A+B)*C Matrix([ [142, 156], [222, 244]]) >>> A*C+B*C Matrix([ [142, 156], [222, 244]])
このように、行列の集合は、環となります*2。 行列環と呼ぶことにしましょう。
しかし、整数や多項式の場合と違い、積の交換律は成り立ちません。$A*B$ と $B*A$ を比較してみましょう。
>>> A*B Matrix([ [19, 22], [43, 50]]) >>> B*A Matrix([ [23, 34], [31, 46]])
このように、
\[
\begin{pmatrix}
1 & 2 \\
3 & 4 \\
\end{pmatrix}*
\begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix}
=
\begin{pmatrix}
19 & 22 \\
43 & 50
\end{pmatrix}
\]
\[
\begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix}*
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
=
\begin{pmatrix}
23 & 34 \\
31 & 46
\end{pmatrix}
\]
で、
\[
A*B\neq B*A
\]
になっています。したがって、行列の集合は環ですが、可換環ではなく、非可換環であることが確認できました。
ここで、注意ですが、非可換の元の中には、積が可換になるものも存在します。例えば、
\[
\begin{pmatrix}
2 & 0 \\
0 & 2
\end{pmatrix}*
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
=
\begin{pmatrix}
2 & 4 \\
6 & 8
\end{pmatrix}
\]
\[
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}*
\begin{pmatrix}
2 & 0 \\
0 & 2
\end{pmatrix}
=
\begin{pmatrix}
2 & 4 \\
6 & 8
\end{pmatrix}
\]
というように、$ \begin{pmatrix}
2 & 0 \\
0 & 2
\end{pmatrix}$ と $ \begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}$ の積は可換です。非可換環とは、"すべての元が非可換"なのではなく、"積が可換ではないものが1組でも存在するような環"のことです。
可換環と非可換環の違い
可換環と非可換環の違いは、当たり前ですが、積が可換であるかどうかです。
この1つの小さな違いが、理論的には大きな分かれ道になります。
可換環は、環の特殊な場合ですが、それだけで可換環論という1つの大きな分野となります。
可換環のメリットの1つは、右と左を考える必要がないことです。例えば、
\[
abc
\]
という式があった時に*3、可換環では、
\[
bac,cba,acb,cab,bca
\]
のうちのどれでも同じになります。また、可換環では、一般の環では成り立たないような様々な定理が成り立ちます。
私たちは、これから可換環について、理論と実装の両方の側面で考えていきます。
次回の予告
次回は、既存の環から、剰余環という新しい環を作ります。
今回は実装はできませんでしたが、次回は特定の剰余環の演算について実装していきたいと思います。
第1回 環の定義
はじめに
どうも初めまして、グレブナー基底大好きbot (Twitter:@groebner_basis) です。
最近、プログラマ向けの数学のセミナーや勉強会*1が開催されるなど、コンピュータを専門にする人が純粋数学に興味を持つ機会が増えてきました。
そこで、この記事では、計算科学とも関わりの深い「可換環論」について、プログラミングの側面から解説していきたいと思います。
可換環論とは
可換環論は、代数学に含まれる分野で、140年以上の歴史があります。名前の通り、「可換環」と呼ばれる数学的対象を研究する分野です。この可換環については、後々詳しく説明したいと思います。
かつての数学者は、計算といえば紙に書く「手計算」が主な手法でした。しかし、近年では、コンピュータの発達に伴い、可換環論の色々な計算が数式処理システム(Computer Algebra System) で実現できるようになりました。これにより、多くの定理の発見に数式処理システムが役に立っています。
可換環論は、純粋数学にとっても非常に有用ですが、同時に、幅広い実用的な応用があります。1つの例として、「グレブナー基底」と呼ばれる概念は、可換環論とコンピュータを結びつけるような役割を果たすものなのですが、連立方程式(非線形含む)や微分方程式を解くのに役に立ったり、他にも統計学や最適化問題などに応用できたりします。
解説のポイント
さて解説するにあたり、この記事では、次の3つのポイントを意識します。
このブログの対象としては、「プログラミングに慣れているが、数学には不慣れ」な人に向けて書いていこうと思います。しかし、数学に興味のある高校生・大学生、もう一度可換環論を復習したい人に対しても、プログラミングという新しい側面から見ることで新しい発見があるのではないかと思っています。
環とは何か
では早速、「環」を定義していきます。
「環」とは一言でいうと「2つの演算が上手く定義された集合の総称」です。「環」というものがただ1つ存在するのではなく、ある条件を満たす集合を「環」と呼ぶということです。厳密な定義は次の通りです。
定義1
$R$ を集合とし,2つの演算 "$+$" と "$*$" が入っているとする.この時,$R$ が次の8つの条件を満たすならば,$R$ は環であると呼ばれる.
- 任意の $R$ の元 $a,b,c$ に対し,$(a+b)+c=a+(b+c)$. (和の結合律)
- $R$ の元 $0$ が存在して,任意の $R$ の元 $a$ に対し,$a+0=a$. (0の存在)
- 任意の $R$ の元 $a$ に対し,ある $R$ の元 $b$ が存在して,$a+b=0$. ($-a$の存在)
- 任意の $R$ の元 $a,b$ に対し,$a+b=b+a$. (和の交換律)
- 任意の $R$ の元 $a,b,c$ に対し,$a*(b*c)=(a*b)*c$. (積の結合律)
- $R$ の元 $1$ が存在して,任意の $R$ の元 $a$ に対し,$a*1=1*a=a$. (1の存在)
- 任意の $R$ の元 $a,b,c$ に対し,$a*(b+c)=a*b+a*c$. (分配法則1)
- 任意の $R$ の元 $a,b,c$ に対し,$(a+b)*c=a*c+b*c$. (分配法則2)
ここで、"元"とは、"げん"と読み、要素と同じ意味です。つまり、"$R$ の元"とは"$R$ の要素"のことであり、例えば、$3$は"整数の集合"の元です。
おそらく、定義1を見てもピンと来ないというのが、正直なところではないでしょうか。この定義を理解をするために、一度、いくつかの具体的な例を見ていきたいと思います。
環の例
代表的な環の例の1つは、「整数の集合」です。
整数は
\[\ldots,-3,-2,-1,0,1,2,3,\ldots\]
というように、正の数、0、負の数から構成される数の集まりです。整数の集合は,通常 $\mathbb{Z}$ という記号で表されます。
そしてこの中には、「足す"$+$"」と「掛ける"$*$"」という2つの演算が定義されています。整数では次のような8つの条件が満たされています。
- 任意の整数 $a,b,c$ に対し,$(a+b)+c=a+(b+c)$. (和の結合律)
- 任意の整数 $a$ に対し,$a+0=a$. (0の存在)
- 任意の整数 $a$ に対し,ある整数 $b$ が存在して,$a+b=0$. ($-a$の存在)
- 任意の整数 $a,b$ に対し,$a+b=b+a$. (和の交換律)
- 任意の整数 $a,b,c$ に対し,$a*(b*c)=(a*b)*c$. (積の結合律)
- 任意の整数 $a$ に対し,$a*1=1*a=a$. (1の存在)
- 任意の整数 $a,b,c$ に対し,$a*(b+c)=a*b+a*c$. (分配法則1)
- 任意の整数 $a,b,c$ に対し,$(a+b)*c=a*c+b*c$. (分配法則2)
これは、先ほどの環の条件を,$R=\mathbb{Z}$ として置き換えたものです。これらの条件について、Pythonで計算しながら確認していきましょう。まず、1番目の条件について考えます。
当然といえば当然ですが、Pythonでは整数の計算ができます。まずは、"(1+2)+3"を計算して見ます。
>>> (1+2)+3 6
上では、"(1+2)+3"を"1+2"から先に計算すると"1+2=3"、それに"+3"をすると、答えは"6"が出てきています。次に、"()"の場所を変えると、
>>> 1+(2+3) 6
今度は、"2+3"を先に計算して、"2+3=5"、それに"1"を足して、答えは"6"が出てきました。当たり前ですが、先ほどと同じ結果になっています。つまり、
\[
(1+2)+3=1+(2+3)
\]
が成り立つというわけです。これを任意の整数に一般化したのが、先ほどの1番目の条件
- 任意の整数 $a,b,c$ に対し,$(a+b)+c=a+(b+c)$.(和の結合律)
のことです。同様に、2番目の条件について考えてみましょう。"4+0"を計算すると、
>>> 4+0 4
当然、4 のままです。これを、任意の整数に一般化したのが、2番目の条件
2. 任意の整数 $a$ に対し,$a+0=a$.(0の存在)
になります。他の条件についても、具体的に計算してみます。
>>> 5+(-5) 0 >>> 6+7 13 >>> 7+6 13 >>> 2*(3*4) 24 >>> (2*3)*4 24 >>> 1*7 7 >>> 7*1 7 >>> (2+3)*4 20 >>> 2*4+3*4 20 >>> 5*(6+7) 65 >>> 5*6+5*7 65
確かに、今計算した例だと、残り6つの条件もすべて成り立っています。
今確認したことは、至極当たり前の性質かもしれません。 しかし、この「当たり前の性質」というのが、私たちがこれから可換環論を学ぶ上でとても重要な役割を果たします。
整数以外にも、同じような性質を満たす集合はあります。有理数を係数に持つ1変数多項式の集合 $\mathbb{Q}[x]$ です。簡単には"多項式の集合"と思ってください。
- 任意の多項式 $f,g,h$ に対し,$(f+g)+h=f+(g+h)$. (和の結合律)
- 任意の多項式 $f$ に対し,$f+0=f$. (0の存在)
- 任意の多項式 $f$ に対し,ある多項式 $g$ が存在して,$f+g=0$. ( $-f$ の存在)
- 任意の多項式 $f,g$ に対し,$f+g=g+f$. (和の交換律)
- 任意の多項式 $f,g,h$ に対し,$f*(g*h)=(f*g)*h$. (積の結合律)
- 任意の多項式 $f$ に対し,$f*1=1*f=f$. (1の存在)
- 任意の多項式 $f,g,h$ に対し,$f*(g+h)=f*g+f*h$. (分配法則1)
- 任意の多項式 $f,g,h$ に対し,$(f+g)*h=f*h+g*h$. (分配法則2)
これは、定義1の $R$ を $R=\mathbb{Q}[x]$ に置き換えた条件になっています。*2
実際に、Pythonで計算してみて確認してみましょう。
今回は、SymPy module を使用します。事前に
$pip install sympy
などでmoduleをインストールしてください。SymPyでは、多項式の計算を簡単に行うことができます。まず、
>>> from sympy import *
sympy を import します。次に、使う変数として'x'を宣言します。例えば、
>>> x=Symbol('x') >>> x+1 x + 1
とすると変数として "x" が宣言され、"x+1" と入力すると、そのまま "x+1" が出てきます。ここで、"x=Symbol('x')" の左側の"x"と右側の "x" の違いは、左側は計算する時に用いる"変数"で、右側は実際に表示される"文字"です。例えば、"x=Symbol('X')" に変えてみます。
>>> x=Symbol('X') >>> x+1 X + 1
すると、入力する時は、小文字の "x" を使っていますが、表示されているのは、大文字の "X" です。では、先ほどの8つの条件が成立することを具体例で確認してみましょう。$f,g,h$をそれぞれ、$f=x+1$, $g=x^2+3$, $h=x^3+4$とします。
>>> f=x+1 >>> g=2*x**2+3 >>> h=x**3+4
Python で入力する時は、指数は、"**"のように2個のアスタリスクで表します。ちなみに、アスタリスク1個"*"は、普通の積です。性質の1から6を計算してみると、
>>> (f+g)+h x**3 + 2*x**2 + x + 8 >>> f+(g+h) x**3 + 2*x**2 + x + 8 >>> f+0 x + 1 >>> f+(-x-1) 0 >>> f+g 2*x**2 + x + 4 >>> g+f 2*x**2 + x + 4 >>> (f*g)*h (x + 1)*(2*x**2 + 3)*(x**3 + 4) >>> f*(g*h) (x + 1)*(2*x**2 + 3)*(x**3 + 4) >>> f*1 x + 1 >>> 1*f x + 1
確かに成り立っています。7については、
>>> f*(g+h) (x + 1)*(x**3 + 2*x**2 + 7) >>> f*g+f*h (x + 1)*(2*x**2 + 3) + (x + 1)*(x**3 + 4)
となり、見た目は違う結果が出ていますが、"expand"で式を展開すれば、
>>> expand(f*(g+h)) x**4 + 3*x**3 + 2*x**2 + 7*x + 7 >>> expand(f*g+f*h) x**4 + 3*x**3 + 2*x**2 + 7*x + 7
確かに同じ結果になっています。8番目の性質についてもexpandすれば同じ結果が出ます。
>>> expand((f+g)*h) 2*x**5 + x**4 + 4*x**3 + 8*x**2 + 4*x + 16 >>> expand(f*h+g*h) 2*x**5 + x**4 + 4*x**3 + 8*x**2 + 4*x + 16
ということで、多項式の集合についても、整数と同じような性質が成り立つことが実感できました。すなわち、多項式の集合 $\mathbb{Q}[x]$ も環であることが言えました。
結局、環とは?
先ほど確認したことは、整数の集合 $\mathbb{Z}$、多項式の集合 $\mathbb{Q}[x]$ はどちらも「環」であることを意味しています。
プログラムの用語で例えるならば、"環"とは"クラス"であり、"$\mathbb{Z}$"や"$\mathbb{Q}[x]$"は"インスタンス"になります。*3
つまり、同じような性質を持つ $\mathbb{Z}$ や $\mathbb{Q}[x]$ を一般化・抽象化したのが「環」になります。もちろん、環は$\mathbb{Z}$ や $\mathbb{Q}[x]$ 以外にも数多く存在します。
また、環では、結合律や分配法則など普段私たちが計算をする上で、「当たり前」のことが保証されています。環とは、一言でいえば、「"+" や "*" などを計算をする上で最低限の規則が保証された集合」と言ってもいいかもしれません。
環を考えるメリット
これから私たちは、環 $R$ について、定義の条件から派生する色々な条件を見ていきます。定義を読んでよく分からなかった人も、環から導かれる結果を眺めることで、逆説的に定義を理解できると思います。
一旦、環で一般的に証明されたことは、もちろん具体例である $\mathbb{Z}$ や $\mathbb{Q}[x]$ にも適用できます。これが、環を考えることの大きなメリットでしょう。わざわざ、各々の集合について個別に議論しないことで、証明が短くなったり、考え方が分かりやすくなります。また、自分で新たに環を考えた際も、既存の環の理論をそれに適用することもできます。
まとめ
- 可換環の色々な計算は、コンピュータで計算することができる
- 環とは2つの演算が定義され、結合律や分配法則などの条件を満たす集合である
- 環を考えることで、$\mathbb{Z}$や$\mathbb{Q}[x]$などの多くの集合について、一括して議論することができる
次回の予告
次回は、環の特殊な場合である"可換環"について定義していきたいと思います。また、別の具体的な環を考え、その演算を実装していく予定です。
*1:例えば、人工知能&数学セミナー ~東ロボ君が機械学習に興味を持ち始めたのだが~ や プログラマのための数学勉強会 など
*2:厳密には、"任意の有理数を係数に持つ1変数多項式 $f,g,h$" などと書くべきですが、長くなるので簡単に"多項式"と表現しました。
*3:あくまで例えなので厳密な意味では異なるかもしれません