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では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の場合を示している。