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

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

第1回 環の定義

はじめに

 どうも初めまして、グレブナー基底大好きbot (Twitter:@groebner_basis) です。
最近、プログラマ向けの数学のセミナーや勉強会*1が開催されるなど、コンピュータを専門にする人が純粋数学に興味を持つ機会が増えてきました。

そこで、この記事では、計算科学とも関わりの深い「可換環論」について、プログラミングの側面から解説していきたいと思います。

可換環論とは

可換環論は、代数学に含まれる分野で、140年以上の歴史があります。名前の通り、「可換環」と呼ばれる数学的対象を研究する分野です。この可換環については、後々詳しく説明したいと思います。

かつての数学者は、計算といえば紙に書く「手計算」が主な手法でした。しかし、近年では、コンピュータの発達に伴い、可換環論の色々な計算が数式処理システム(Computer Algebra System) で実現できるようになりました。これにより、多くの定理の発見に数式処理システムが役に立っています。

可換環論は、純粋数学にとっても非常に有用ですが、同時に、幅広い実用的な応用があります。1つの例として、「グレブナー基底」と呼ばれる概念は、可換環論とコンピュータを結びつけるような役割を果たすものなのですが、連立方程式非線形含む)や微分方程式を解くのに役に立ったり、他にも統計学最適化問題などに応用できたりします。

解説のポイント

さて解説するにあたり、この記事では、次の3つのポイントを意識します。 

  • 整数や多項式環など、豊富な具体例と一緒に可換環論の用語を定義していく
  • 定義した概念が計算できるか、アルゴリズムを考察していく
  • Python のモジュールを使って実際に計算し、可換環論を実感していく 

 このブログの対象としては、「プログラミングに慣れているが、数学には不慣れ」な人に向けて書いていこうと思います。しかし、数学に興味のある高校生・大学生、もう一度可換環論を復習したい人に対しても、プログラミングという新しい側面から見ることで新しい発見があるのではないかと思っています。

使用するプログラミング言語、バージョン

実装は、Python3 の最新バージョン3.6.3 (2017年10月時点)でやっていきます。 Pythonを選んだ理由は、主に

という点からです。もちろん、Python以外にも、MathematicaMaple などの数式処理システムを用いても、同様の計算はすることはできます(言語はPythonではないですが)。

この記事では Python をインストールしていることを前提に書いていきたいと思います。また、moduleをインストールするため、pip などもインストールされているといいです。

環とは何か

では早速、「環」を定義していきます。

「環」とは一言でいうと「2つの演算が上手く定義された集合の総称」です。「環」というものがただ1つ存在するのではなく、ある条件を満たす集合を「環」と呼ぶということです。厳密な定義は次の通りです。

定義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)

ここで、"元"とは、"げん"と読み、要素と同じ意味です。つまり、"$R$ の元"とは"$R$ の要素"のことであり、例えば、$3$は"整数の集合"の元です。

おそらく、定義1を見てもピンと来ないというのが、正直なところではないでしょうか。この定義を理解をするために、一度、いくつかの具体的な例を見ていきたいと思います。

環の例

代表的な環の例の1つは、「整数の集合」です。
整数は
\[\ldots,-3,-2,-1,0,1,2,3,\ldots\]
というように、正の数、0、負の数から構成される数の集まりです。整数の集合は,通常 $\mathbb{Z}$ という記号で表されます。

そしてこの中には、「足す"$+$"」と「掛ける"$*$"」という2つの演算が定義されています。整数では次のような8つの条件が満たされています。

  1. 任意の整数 $a,b,c$ に対し,$(a+b)+c=a+(b+c)$. (和の結合律)
  2. 任意の整数 $a$ に対し,$a+0=a$. (0の存在)
  3. 任意の整数 $a$ に対し,ある整数 $b$ が存在して,$a+b=0$. ($-a$の存在)
  4. 任意の整数 $a,b$ に対し,$a+b=b+a$. (和の交換律)
  5. 任意の整数 $a,b,c$ に対し,$a*(b*c)=(a*b)*c$. (積の結合律)
  6. 任意の整数 $a$ に対し,$a*1=1*a=a$. (1の存在)
  7. 任意の整数 $a,b,c$ に対し,$a*(b+c)=a*b+a*c$. (分配法則1)
  8. 任意の整数 $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番目の条件

  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]$ です。簡単には"多項式の集合"と思ってください。

  1. 任意の多項式 $f,g,h$ に対し,$(f+g)+h=f+(g+h)$. (和の結合律)
  2. 任意の多項式 $f$ に対し,$f+0=f$. (0の存在)
  3. 任意の多項式 $f$ に対し,ある多項式 $g$ が存在して,$f+g=0$. ( $-f$ の存在)
  4. 任意の多項式 $f,g$ に対し,$f+g=g+f$. (和の交換律)
  5. 任意の多項式 $f,g,h$ に対し,$f*(g*h)=(f*g)*h$. (積の結合律)
  6. 任意の多項式 $f$ に対し,$f*1=1*f=f$. (1の存在)
  7. 任意の多項式 $f,g,h$ に対し,$f*(g+h)=f*g+f*h$. (分配法則1)
  8. 任意の多項式 $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]$などの多くの集合について、一括して議論することができる

次回の予告

次回は、環の特殊な場合である"可換環"について定義していきたいと思います。また、別の具体的な環を考え、その演算を実装していく予定です。

終わりに

この記事について、感想、疑問などありましたらぜひコメントください*4Twitter でもつぶやいて頂けると嬉しいです。

*1:例えば、人工知能&数学セミナー ~東ロボ君が機械学習に興味を持ち始めたのだが~プログラマのための数学勉強会  など

*2:厳密には、"任意の有理数を係数に持つ1変数多項式 $f,g,h$" などと書くべきですが、長くなるので簡単に"多項式"と表現しました。

*3:あくまで例えなので厳密な意味では異なるかもしれません

*4:特に、筆者はプログラミングに関しては素人なのでプログラマの方にご指摘いただけると有り難いです。