Pythonで学ぶ「プログラミング可換環論」

プログラミングの視点から学ぶ、新しい可換環論

第2回 可換環の定義

こんにちは。グレブナー基底大好きbotです。

第1回では、環を定義し、その簡単な具体例として、整数環や多項式環を挙げました。
実は、これらは両方とも"可換環"と呼ばれる特殊な環になっています。
第2回では、可換環と非可換環について取り上げたいと思います。

復習

「環」とは、"足し算"と"掛け算"の演算ができて、次の8つの条件を満たす集合のことでした。

定義1

$R$ を集合とし,2つの演算 "$+$" と "$*$" が入っているとする.この時,$R$ が次の8つの条件を満たすならば,$R$ はであると呼ばれる.

  1. 任意の $R$ の元 $a,b,c$ に対し,$(a+b)+c=a+(b+c)$. (和の結合律)
  2. $R$ の元 $0$ が存在して,任意の $R$ の元 $a$ に対し,$a+0=a$. (0の存在)
  3. 任意の $R$ の元 $a$ に対し,ある $R$ の元 $b$ が存在して,$a+b=0$. ($-a$の存在)
  4. 任意の $R$ の元 $a,b$ に対し,$a+b=b+a$. (和の交換律)
  5. 任意の $R$ の元 $a,b,c$ に対し,$a*(b*c)=(a*b)*c$. (積の結合律)
  6. $R$ の元 $1$ が存在して,任意の $R$ の元 $a$ に対し,$a*1=1*a=a$. (1の存在)
  7. 任意の $R$ の元 $a,b,c$ に対し,$a*(b+c)=a*b+a*c$. (分配法則1)
  8. 任意の $R$ の元 $a,b,c$ に対し,$(a+b)*c=a*c+b*c$. (分配法則2)

ちなみに、整数の集合や多項式の条件はすべてこの条件を満たしていました。

可換環

さっそく、このブログのタイトルにも入っている可換環について説明したいと思います。

可換環の定義

可換環とは、上の条件に加え、積の可換性が成り立つ環のことです。

定義2

$R$ を2つの演算 "$+$" と "$*$" が入っている環とする.この時,次の条件を満たすならば,$R$は可換環と呼ばれる.

  1. 任意の $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$ は非可換環と呼ばれる.

  1. ある $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:行が2行、列が2列あり、成分がすべて有理数の行列

*2:厳密には、一般の元について、これらが成り立つことを証明する必要があります。

*3:ここで、記号的注意として、積の記号 "$*$" は、$ab=a*b$ のように省略することがあります。