はじめに
どうも初めまして、グレブナー基底大好き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)
ここで、"元"とは、"げん"と読み、要素と同じ意味です。つまり、"
おそらく、定義1を見てもピンと来ないというのが、正直なところではないでしょうか。この定義を理解をするために、一度、いくつかの具体的な例を見ていきたいと思います。
環の例
代表的な環の例の1つは、「整数の集合」です。
整数は
というように、正の数、0、負の数から構成される数の集まりです。整数の集合は,通常
そしてこの中には、「足す"
- 任意の整数
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)
これは、先ほどの環の条件を,
当然といえば当然ですが、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番目の条件
- 任意の整数
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変数多項式の集合
- 任意の多項式
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の
実際に、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=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
ということで、多項式の集合についても、整数と同じような性質が成り立つことが実感できました。すなわち、多項式の集合
結局、環とは?
先ほど確認したことは、整数の集合
プログラムの用語で例えるならば、"環"とは"クラス"であり、"
つまり、同じような性質を持つ
また、環では、結合律や分配法則など普段私たちが計算をする上で、「当たり前」のことが保証されています。環とは、一言でいえば、「"+" や "*" などを計算をする上で最低限の規則が保証された集合」と言ってもいいかもしれません。
環を考えるメリット
これから私たちは、環
一旦、環で一般的に証明されたことは、もちろん具体例である
まとめ
- 可換環の色々な計算は、コンピュータで計算することができる
- 環とは2つの演算が定義され、結合律や分配法則などの条件を満たす集合である
- 環を考えることで、
Z やQ[x] などの多くの集合について、一括して議論することができる
次回の予告
次回は、環の特殊な場合である"可換環"について定義していきたいと思います。また、別の具体的な環を考え、その演算を実装していく予定です。
*1:例えば、人工知能&数学セミナー ~東ロボ君が機械学習に興味を持ち始めたのだが~ や プログラマのための数学勉強会 など
*2:厳密には、"任意の有理数を係数に持つ1変数多項式
*3:あくまで例えなので厳密な意味では異なるかもしれません