|
![[Basis, FGLM, HilbertDimension, HilbertPolynomial, HilbertSeries, Homogenize, InitialForm, InterReduce, IsProper, IsZeroDimensional, LeadingCoefficient, LeadingMonomial, LeadingTerm, MatrixOrder, MaximalIndependentSet, MonomialOrder, MultiplicationMatrix, MultivariateCyclicVector, NormalForm, NormalSet, RationalUnivariateRepresentation, Reduce, RememberBasis, SPolynomial, Solve, SuggestVariableOrder, TestOrder, ToricIdealBasis, TrailingTerm, UnivariatePolynomial, Walk, WeightedDegree]](/support/helpjp/helpview.aspx?si=1198/file00198/math328.png)
| (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]));
|
![GB := [x^2+y^2+z^2-1, 17*z*x+13*z-x*y-13*z^3+17*y*z^2, -7*z-6*x*y+7*z^3+17*y^2*z, -17*z*x-11*z-7*x*y+11*z^3-17*y+17*y^3, -y*z-z^2*x+x*y^2, -48*z^2-34*y*z-34*z^2*x-63*x*y*z+48*z^4, -408*z*x-233*z+65*x*y+233*z^3+408*z^3*x, -3*x+2*z^2+3*y*z+6*z^2*x-6*x*y*z+2*t]](/support/helpjp/helpview.aspx?si=1198/file00198/math445.png)
| (3.12) |
![[x^2+y^2+z^2-1, 17*z*x+13*z-x*y-13*z^3+17*y*z^2, -7*z-6*x*y+7*z^3+17*y^2*z, -17*z*x-11*z-7*x*y+11*z^3-17*y+17*y^3, -y*z-z^2*x+x*y^2, -48*z^2-34*y*z-34*z^2*x-63*x*y*z+48*z^4, -408*z*x-233*z+65*x*y+233*z^3+408*z^3*x]](/support/helpjp/helpview.aspx?si=1198/file00198/math452.png)
| (3.13) |
一般の場合、数値の見積りや phi への代入が必要となります。ここでは x と y を消去する事によって z の全ての取り得る値を求める事ができます。
>
|
GB2:=Basis(%,lexdeg([x,y],[z]));
|
![GB2 := [-44*z+655*z^3-1763*z^5+1152*z^7, -118*y*z-453*z^2+1605*z^4-1152*z^6+118*z^3*y, 2556*z-1404*z^3-1152*z^5+3835*y*z^2+3835*z*x, -3839*z+10751*z^3-6912*z^5+3835*y^2*z, -6403*z+25987*z^3-19584*z^5+3835*x*y, x^2+y^2+z^2-1, -2562*z+11778*z^3-3835*y-9216*z^5+3835*y*z^2+3835*y^3]](/support/helpjp/helpview.aspx?si=1198/file00198/math470.png)
| (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)]);
|
![[{x = 0, z = 0, y = 1}, {x = 0, z = 0, y = -1}, {y = 0, z = 0, x = 1}, {y = 0, z = 0, x = -1}, {x = 0, y = 0, z = 1}, {x = 0, y = 0, z = 1}, {y = -1/3, x = -2/3, z = -2/3}, {x = -2/3, y = 1/3, z = 2/3}, {x = 0, y = 0, z = -1}, {x = 0, y = 0, z = -1}, {x = 0, y = 0, z = -1}, {x = 0, y = 0, z = -1}, {x = 0, y = 0, z = -1}, {x = 0, y = 0, z = -1}, {y = -(3/16)*22^(1/2), x = -3/8, z = (1/16)*22^(1/2)}, {y = (3/16)*22^(1/2), x = -3/8, z = -(1/16)*22^(1/2)}]](/support/helpjp/helpview.aspx?si=1198/file00198/math493.png)
| (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) |
|