Macauly2 Memo

文献について

Macaulay2に関する日本語の文献は、Macaulay2の作者の一人である Dan Graysonへのインタビューが "数学のたのしみ No.11,多項式環の視点:グレブナー基底" (日本評論社,1999年)の"グレブナエンジンのプログラマ達"に掲載され ている程度である。

英語の文献では以下の二冊がある。先ず、Eisenbud et al.(Eds) Computations in Algebraic Geometry with Macaulay 2, ISBN 3-540-42230-7はMacaulay2の入門から応用迄が収録されている。 こちらは代数学、代数幾何に詳しい方には良いだろう。

それに対し、Hal Schenck Computational Algebraic Geometry, ISBN 0-521-53650-2はMacaulay2を用いた代数幾何、代数的位相幾何学の 事が手堅く纏められた良いテキストで、お勉強には最適だろう。

具体的な使い方

起動方法

Macaulay2の起動方法はパスが通っていれば、M2と入力すれば立ち上がる。 但し、MuPADの様な立派なフロントエンドの類は無い。行の編集も行え ないので、emacsやTeXmax等と云った外部のプログラムと併用する事を勧める。 特にTeXmacsと併用した場合、出力もレンダリングされた結果になるので、 見た目も美しいので良い。

入力

Macaulay2では、命令行末尾に";"を入れるとエコーバックが無効になる。 それ以外では、入力に対して値やデータ型のエコーバックを行う。 又、関数ではf(x)の様な記述の他に、f xと云った記述も許容する。 但し、引数が複数になるとこの記述が出来ないので注意が必要である。

Macaulay2言語について

データ型

Macaulay2ではSingularと同様に最初に環を定義し、その環上で様々な 対象を構築して行く。環を定義しなければ、多項式や写像は定義出来ない。 但し、Symbol,Sequence,文字列や数値(整数、有理数、実数)と云った 基本データ型の入力や処理は可能であり、それらを処理する関数も定義可能 である。

最初に数値の入力例を以下に示す:

i1 : 1

o1 = 1

i2 : 1+2

o2 = 3

i3 : 2*3

o3 = 6

i4 : 3/5

     3
o4 = -
     5

o4 : QQ

i5 : 2.9+10

o5 = 12.9

o5 : RR
	    

次に、表象(Symbol)と文字列(String)の例を示す。因に、表象は数値以外 の文字の羅列である。文字列は""で括られたもので、表象とは別である。

i20 : x

o20 = x

o20 : Symbol

i21 : XYZ

o21 = XYZ

o21 : Symbol

i22 : w1 = "mike"

o22 = mike

i23 : w2 = "neko"

o23 = neko

i24 : w1 | w2

o24 = mikeneko

i25 : w1 || w2

o25 = mike
      neko
	    

上の例では文字列の結合を"|"と"||"で行なっている。尚、"|"の場合は 単純に結合するが、"||"の場合は改行が入る。

その他の基本的なデータ型に列、リスト、配列、行列がある。

i28 : (1,2,3)

o28 = (1, 2, 3)

o28 : Sequence

i29 : (1,2.4,5/7)

               5
o29 = (1, 2.4, -)
               7

o29 : Sequence

i30 : {1,2,3,54}

o30 = {1, 2, 3, 54}

o30 : List

i31 : [1,2,3,4,5]

o31 = [1, 2, 3, 4, 5]

o31 : Array

i32 : A=matrix { {1,2,3,4},{5,4,3,2}}

o32 = | 1 2 3 4 |
      | 5 4 3 2 |

              2        4
o32 : Matrix ZZ  <--- ZZ

i33 :  B=matrix( {{1,1},{-1,2}} )

o32 = | 1  1 |
      | -1 2 |

              2        2
o33 : Matrix ZZ  <--- ZZ
	    

上記のmatrix命令の様に、Macaulay2では関数の括弧を省略する事が可能で ある。

リストに対しては四則演算も出来なくはない。

i26 : a={{1,2,3,4},{5,6}}

o26 = {{1, 2, 3, 4}, {5, 6}}

o26 : List

i27 : b={{3,1,2,4},{10,9}}

o27 = {{3, 1, 2, 4}, {10, 9}}

o27 : List

i28 : 2*a+b/5

        13  21  32  44        69
o28 = {{--, --, --, --}, {12, --}}
         5   5   5   5         5

o28 : List

	    

但し、Matlabやoctaveと比べると、Macaulay2はリストの処理が強いとは 言えない。その一例として、積の順番の問題を示す。

i30 : b*2
stdio:30:2: expected pair to have a method for '*'

i31 : 2*b

o31 = {{6, 2, 4, 8}, {20, 18}}

	    

上のb*2と2*bでは前者は失敗するが、後者では問題が無い。 この様に掛け算や羃乗に関しては注意が必要である。 MATLABの様な処理が行えるとは限らない尤も、その様な処理を Macaulay2で行う事は考え難いが…。

リストに対してはapply関数を用いて、関数を作用させる事が可能である。

i43 : apply({1,2,3,4,5},i->i^2)

o43 = {1, 4, 9, 16, 25}

o43 : List

i44 : apply({1,2,3,4,5},i->i^2*sin(i))

o44 = {0.841471, 3.63719, 1.27008, -12.1088, -23.9731}

o44 : List


    

次に、関数定義の一例を示す。尚、関数の定義方法はMaple風でもある。

i32 : f:=(x,y,z) -> x^2+y/z

o32 = f

o32 : Function

i33 : f(1,2,3)

      5
o33 = -
      3

o33 : QQ
	    

Macaulay2にはif文、for文やwhile文と云った制御文もある。

以下の章では具体的な例を示しながら、Macaulay2の説明を行う。

環の定義

前述の様に、まともな計算を行う為には、対象が含まれる環等を定義しな ければならない。Macaulay2では環の定義を次の方法で行う。

i1 : R=QQ[x,y,z]

o1 = R

o1 : PolynomialRing

i2 : R'=ZZ[x,y,z]

o2 = R'

o2 : PolynomialRing

i3 : poly1=x^2+2*y^2+3*z^2-1

      2     2     2
o3 = x  + 2y  + 3z  - 1

o3 : R'

	    

この例では環Rとして係数環として有理数体QQを指定し、変数をx,y,zの 3個を指定している。この指定を行うと、逆辞書式順序で環が生成され、 以下の処理では新たに加群や環を定義するまでは環R上で処理を行う。 環の定義では変数の順序の指定等も行える。勿論、ZZ/7の様な環も定義可能 である。

尚、係数環によっては使えない命令が存在するので注意が必要である。 例えば、与えられたイデアルのGroebner基底を求める際に、命令gbを 用いるが、このgbは整数環ZZでは使えない。

尚、係数環には、整数環ZZ、有理数環QQ、実数環RRや上記の方法で定義した 環等がある。

環を定義すると、環が生成され自動的にその生成した環に移る。複数の環が ある環境で、別の環へと環を切り替える場合はuse命令を用いる。

i5 : R=ZZ[x,y,z]

o5 = R

o5 : PolynomialRing

i6 : R2=QQ[x,y]

o6 = R2

o6 : PolynomialRing

i7 : use R

o7 = R

o7 : PolynomialRing
	    

ある環で構築した対象を別の環に代入する命令がsubstituteである。 引数は要素と複写先の環を指定する。

i4 : R=ZZ[x,y,z]

o4 = R

o4 : PolynomialRing

i5 : poly2=substitute(poly1,R)

      2     2     2
o5 = x  + 2y  + 3z  - 1

o5 : R

i6 : poly1

      2     2     2
o6 = x  + 2y  + 3z  - 1

o6 : R'

i7 : poly2

      2     2     2
o7 = x  + 2y  + 3z  - 1

o7 : R
	    

定義した対象の詳細はdescribeで確認可能である。

i1 : R=ZZ/5[x,y]

o1 = R

o1 : PolynomialRing

i2 : describe R

     ZZ
o2 = -- [x, y]
      5

i3 : f=(x+2*y+3)^5  

      5     5
o3 = x  + 2y  - 2

o3 : R

i4 : g=(x,y)->x*y+2

o4 = g

o4 : Function

i5 : describe R

     ZZ
o5 = -- [x, y]
      5

i6 : describe f


      5     5
o6 = x  + 2y  - 2

	    

特異点遊戯

曲線や曲面上のある点が、その点での偏微分が全て0になる場合に特異点 と呼ばれる。ここではMacaulay2を使って特異点を探して遊ぶ事にする。

最初に、平面曲線x^3-y^2=0を考えよう。この曲線のX,Y方向の法偏微分は 各々、3*X^2と-2*yである。従って、この平面曲線の特異点は(0,0)である。 次の図にsurfを用いて描いたこの曲線のグラフを示す。

上のグラフに示す様に原点付近が縊れている。

この特異点の計算をMacaulay2で行う。この場合、与えられた曲線fの定義 多項式とその偏微分から構成されるイデアルIを定義し、そのイデアルの零点 集合V(I)が特異点の集合となる。ここで、V(I)を零点に持つイデアルはIの 根基(radical)となる。Hilbeltの零点定理では、イデアルIの零点集合は、 イデアルIの根基イデアルに等しい。その事から、根基イデアルを計算し、 その性質を調べれば良い事になる。以下に実例を示す。

i1 : R=QQ[x,y];

i2 : f=x^3-y^2;

i3 : neko=ideal {f, diff(x,f), diff(y,f)}
             3    2    2
o3 = ideal (x  - y , 3x , -2y)

o3 : Ideal of R

i4 : radical neko

o4 = ideal (y, x)
	    

この例では、最初に有理係数体Qを係数環に持つ環Rを定義し、 多項式fを次に定義している。それから、多項式fとその偏微分から生成 されるイデアルnekoを定義している。尚、ここで示す様に、 微分はdiff(変数,多項式)で行う。イデアルの根基はradical命令で 計算出来る。その結果、根基は(y,x)で生成される事が分る。この根基の 零点集合はx=0,y=0のみである。以上から、(0,0)がこの曲線の特異点である 事が分る。

次に、任意の実数tに対して、x^3-y^2+tを考えよう。 ここでも上と同様の方法で根基イデアルを計算する。

i6 : R=QQ[x,y,t]

o6 = R

o6 : PolynomialRing

i7 : f=x^3-y^2+t;

i8 : neko = ideal { f, diff(x,f), diff(y,f) }

             3    2        2
o8 = ideal (x  - y  + t, 3x , -2y)

o8 : Ideal of R

i9 : radical neko

o9 = ideal (t, y, x)

o9 : Ideal of R
	    

上記の結果から、tが零でなければx^3-y^2+tには特異点が無い事が分る。 以下の図ではt=1の場合を示している。


Hiroshi Yokota
Last modified: Tue Apr 26 23:40:17 JST 2005