|
| (3.1) |
メンバシップテスト
>
|
G:={x+y+z, x*y+y*z+z*x, x*y*z-1};
|
| (3.2) |
>
|
B:=Basis(G,tdeg(x,y,z));
|
| (3.3) |
>
|
NormalForm(x^3-1,B,tdeg(x,y,z));
|
| (3.4) |
>
|
NormalForm(x^2,B,tdeg(x,y,z));
|
| (3.5) |
以上より x^3-1 は G によって生成されるイデアルに入っており、 x^2 は入っていないことがわかります。
単項式順序
全次数順序 tdeg は比較的計算が速く、正規形の計算に適しており、辞書式順序 plex は三角化であり、一般に計算は遅い。また、消去順序 lexdeg は変数消去により適している。単項式順序を一般的に扱うために Groebner パッケージでは重みつき順序 wdeg や行列を用いて定義する順序も実装してあります。積順序やユーザが独自に定義した単項式順序も用いる事ができます。
最初の例として、曲線のパラメータ表示の陰関数化の例を示します。
>
|
param:={x=(1-t^2)/(1+t^2),y=2*t/(1+t^2)};
|
| (3.6) |
>
|
Basis(map(eq->numer(lhs(eq)-rhs(eq)),param),lexdeg([t],[x,y]));
|
| (3.7) |
| (3.8) |
次の例は、lexdeg による計算が plex を用いた計算より遥かに速い事の例です。次の曲面
| (3.9) |
における次の極値を求めるとします。
| (3.10) |
Lagrange の乗数法を用いて、次を計算します。
>
|
G:={seq(diff(phi,v)-diff(const,v)*t,v=[x,y,z]),const};
|
| (3.11) |
乗数 t を適切な単項式順序を用いて消去します。
>
|
GB:=Basis(G,lexdeg([t],[x,y,z]));
|
| (3.12) |
| (3.13) |
一般の場合、数値の見積りや phi への代入が必要となります。ここでは x と y を消去する事によって z の全ての取り得る値を求める事ができます。
>
|
GB2:=Basis(%,lexdeg([x,y],[z]));
|
| (3.14) |
>
|
op(remove(has,GB2,{x,y}));
|
| (3.15) |
| (3.16) |
これらの値を代入する事によって、極値を取る点を求める事ができます。
>
|
map(op,[seq(map(`union`,[solve(convert(subs(z=i,GB2),set),{x,y})],{z=i}),i=sol_z)]);
|
| (3.17) |
最終的に最小値および最大値を求める事ができました。
>
|
min(op(map(subs,%,phi))),max(op(map(subs,%,phi)));
|
| (3.18) |
同様の計算を plex を用いて行うと、かなり長い時間がかかります。
イデアルの不変量
多様体の次元 ( 0 だと独立した点集合、 1 は直線、 2 は平面となる ) は対応した零化イデアルの Hilbert 次元と一致します。Groebner パッケージを用いると Hilbert 次元とともに、 Hilbert 多項式、 Hilbert 級数を計算する事ができます。
最初の例は 0 次元イデアルの例です。対応した多様体は有限個の点集合です。
>
|
G:=[3*y^2-8*z^3,x^2-2*z*x+5,3*y^3+8*x*y^2]:
HilbertDimension(G,tdeg(y,x,z));
|
| (3.19) |
>
|
HilbertSeries(G,tdeg(y,x,z),s);
|
| (3.20) |
| (3.21) |
>
|
HilbertPolynomial(G,tdeg(y,x,z),s);
|
| (3.22) |
他の例として、正の次元を持つイデアルの例を挙げます。
>
|
G:=[x^3*y^2+3*x^2*y^2+y^3+1]:
HilbertDimension(G,tdeg(x,y));
|
| (3.23) |
>
|
HilbertSeries(G,tdeg(x,y),s);
|
| (3.24) |
| (3.25) |
>
|
HilbertPolynomial(G,tdeg(y,x),s);
|
| (3.26) |
基礎体
Groebner パッケージは、有理数体や有限体に対する、超越あるいは代数拡大をサポートしています。これには代数的数体が含まれます。例として Q[I,sqrt(2)][x,y] における複素数の計算を挙げます。
>
|
G:=[x^2+y^2-I,sqrt(2)*y+sqrt(2)*(x-sqrt(2))-1];
|
| (3.27) |
>
|
GB:=Basis(G,tdeg(x,y));
|
| (3.28) |
オプションとして指定する事で、整数のモジュラー計算もできます。
>
|
G:=[x^2-2*x*z+5,x*y^2+y*z^3,3*y^2-8*z^3]:
G mod 5;
|
| (3.29) |
>
|
Basis(G,plex(x,y,z),characteristic=5);
|
| (3.30) |
標準基底
Groebner パッケージは標準基底の計算もサポートしています。頭項として単項式順序で最大のものではなく、最小のものを取ります。これには plex ではなく plex_min を用います。
>
|
L:=1+x+y+z+x^2+y^2+z^2;
|
| (3.31) |
>
|
LeadingMonomial(L,plex(x,y,z));
|
| (3.32) |
>
|
LeadingMonomial(L,plex_min(x,y,z));
|
| (3.33) |
この場合 Groebner 基底は斉次イデアルに対して計算されます。次に挙げるのは Q[x,y,z,w] における例です。
>
|
G:=[y*w^2-z^3,x*w^3-z^4];
|
| (3.34) |
通常の Groebner 基底と比較してみます。
>
|
Basis(G,plex(w,x,y,z));
|
| (3.35) |
Groebner基底による簡約では一般にべきは下がります :
>
|
Reduce(w^5*x^3*y^2*z,%,plex(w,x,y,z));
|
| (3.36) |
一方、標準基底では
>
|
Basis(G,plex_min(w,x,y,z));
|
| (3.37) |
簡約によってべきは上がります。
>
|
Reduce(w^5*x^3*y^2*z,%,plex_min(w,x,y,z));
|
| (3.38) |
|