Next: , Previous:   [Contents][Index]

57 grobner


57.1 Introduction to grobner

grobnerは MaximaでGroebner基底を使うためのパッケージです。

Groebner基底に関するチュートリアルは以下で見つかります。

http://www.geocities.com/CapeCanaveral/Hall/3131/

以下の関数を使うには、grobner.lispパッケージをロードしなければいけません。

load("grobner");
demo("grobner.demo");

もしくは

batch("grobner.demo")

でデモを開始することができます。

デモの中の計算のいくつかは長い時間かかります。 だから、デモの出力 grobner-demo.outputが デモファイルと同じディレクトリに見つかります。

57.1.1 Notes on the grobner package

パッケージは

Marek Rychlik

http://alamos.math.arizona.edu

によって書かれ、 General Public License(GPL)の条件の下、2002-05-24にリリースされました。 (ファイル grobner.lispを参照してください。) このドキュメントは、 ファイル

README, grobner.lisp, grobner.demo, grobner-demo.output

から

Günter Nowakによって抽出されました。

ドキュメントの改善に関する提案は maximaメーリングリスト maxima@math.utexas.eduで議論することができます。 現在、コードは若干古くなっています。 モダンな実装は 以下に記載されている高速の F4アルゴリズムを使います。

A new efficient algorithm for computing Gröbner bases (F4) 
Jean-Charles Faugère
LIP6/CNRS Université Paris VI 
January 20, 1999

57.1.2 Implementations of admissible monomial orders in grobner

  • lex

    純粋に辞書式の、 単項式比較のデフォルト順序

  • grlex

    全次数順序。同点は辞書式で決めます。

  • grevlex

    全次数。同点は逆辞書式で決めます。

  • invlex

    逆時書式順序。


57.2 Functions and Variables for grobner

57.2.1 Global switches for grobner

オブション変数: poly_monomial_order

デフォルト値: lex

このグローバルスイッチは どの単項式順序が多項式とGroebner基底計算で使われるか制御します。 もし設定されないなら、 lexが使われます。

オブション変数: poly_coefficient_ring

デフォルト値: expression_ring

このスイッチは grober計算で使われる多項式の係数環を示します。 もし設定されないなら、 maximaの 一般式環が使われます。 もし望むなら、この変数を ring_of_integersに設定できます。

オブション変数: poly_primary_elimination_order

デフォルト値: false

消去ベース関数で消去される変数のデフォルト順序名。 設定されていないなら、 lexが使われます。

オブション変数: poly_secondary_elimination_order

デフォルト値: false

消去ベース関数で保持される変数のデフォルト順序名。 設定されていないなら、 lexが使われます。

オブション変数: poly_elimination_order

デフォルト値: false

消去計算で使われるデフォルト消去順序名。 設定されているなら、 変数 poly_primary_elimination_orderpoly_secondary_elimination_orderの設定を上書きします。 ユーザーは これが消去変数の数に有効な真の消去順序であることを保証しなければいけません。

オブション変数: poly_return_term_list

デフォルト値: false

もし trueに設定されているなら、 このパッケージの関数すべては maxima一般式ではなく、 それぞれの多項式を 現在の単項式順序で並べた項のリストとして返します。

オブション変数: poly_grobner_debug

デフォルト値: false

もし trueに設定されているなら、 デバッグ用、トレース用出力を生成します。

オブション変数: poly_grobner_algorithm

デフォルト値: buchberger

可能な値:

  • buchberger
  • parallel_buchberger
  • gebauer_moeller

Groebner基底を見つけるのに使われるアルゴリズム名。

オブション変数: poly_top_reduction_only

デフォルト値: false

もし falseでないなら、 可能な時はいつでも、頭項簡約を使います。 頭項簡約は、割り算アルゴリズムが最初の簡約後に停止することを意味します。

57.2.2 Simple operators in grobner

poly_add, poly_subtract, poly_multiply, poly_exptは 多項式の算出演算子です。 これらは 内部表現を使って実行されますが、 結果は maxima一般形式に変換されます。

関数: poly_add (poly1, poly2, varlist)

2つの多項式 poly1poly2を足します。


(%i1) poly_add(z+x^2*y,x-z,[x,y,z]);
                                    2
(%o1)                              x  y + x
関数: poly_subtract (poly1, poly2, varlist)

多項式 poly1から poly2を引きます。


(%i1) poly_subtract(z+x^2*y,x-z,[x,y,z]);
                                      2
(%o1)                          2 z + x  y - x
関数: poly_multiply (poly1, poly2, varlist)

多項式 poly1poly2の積を返します。


(%i2) poly_multiply(z+x^2*y,x-z,[x,y,z])-(z+x^2*y)*(x-z),expand;
(%o1)                                  0
関数: poly_s_polynomial (poly1, poly2, varlist)

2つの多項式 poly1poly2シジジー多項式 (S多項式)を返します。

関数: poly_primitive_part (poly1, varlist)

多項式 poly1を係数のGCDで割ったものを返します。

(%i1) poly_primitive_part(35*y+21*x,[x,y]);
(%o1)                              5 y + 3 x
関数: poly_normalize (poly, varlist)

多項式 poly1を主係数で割ったものを返します。 割り算が可能であることを仮定しています。 これは、体の場合には大丈夫ですが、環の場合にはいつも可能なわけではありません。

57.2.3 Other functions in grobner

関数: poly_expand (poly, varlist)

この関数は 多項式を内部形式にパースします。 もし polyが多項式を正確にパースしたら、 それは expand(poly)と同値です。 もし表現が変数 varlistの多項式と互換性がないなら、 結果はエラーです。 式が正確に内部表現にパースするかテストするのに使うことができます。 以下の例は添字付き変数と超越関数変数が許されることを例示します。


(%i1) poly_expand((x-y)*(y+x),[x,y]);
                                     2    2
(%o1)                               x  - y
(%i2) poly_expand((y+x)^2,[x,y]);
                                2            2
(%o2)                          y  + 2 x y + x
(%i3) poly_expand((y+x)^5,[x,y]);
                  5      4         2  3       3  2      4      5
(%o3)            y  + 5 x y  + 10 x  y  + 10 x  y  + 5 x  y + x
(%i4) poly_expand(-1-x*exp(y)+x^2/sqrt(y),[x]);
                                          2
                                  y      x
(%o4)                       - x %e  + ------- - 1
                                       sqrt(y)

(%i5) poly_expand(-1-sin(x)^2+sin(x),[sin(x)]);
                                2
(%o5)                      - sin (x) + sin(x) - 1

関数: poly_expt (poly, number, varlist)

polyの、正の整数 numberのべき乗を返します。 もし numberが正の整数でないなら、 エラーが生じます。


(%i1) poly_expt(x-y,3,[x,y])-(x-y)^3,expand;
(%o1)                                  0
関数: poly_content (poly. varlist)

poly_contentは係数のGCDを抽出します。


(%i1) poly_content(35*y+21*x,[x,y]);
(%o1)                                  7
関数: poly_pseudo_divide (poly, polylist, varlist)

多項式 polyn個の多項式のリスト polylistで擬似的に割ります。 複数の値を返します。 一番目の値は 商のリスト aです。 二番目の値は余り rです。 三番目の値は、 係数環(体である必要はありません)内でpolylistc*polyを割れるような スカラ係数 cです。 最後に 四番目の値は実行された簡約の回数です。 結果のオブジェクトは以下の等式を満たします:

c*poly=sum(a[i]*polylist[i],i=1...n)+r.

関数: poly_exact_divide (poly1, poly2, varlist)

多項式 poly1を多項式 poly2で割ります。 余りのない厳密な割り算が可能と仮定します。 商を返します。

関数: poly_normal_form (poly, polylist, varlist)

poly_normal_formは 多項式の集合 polylistに関して 多項式 polyの正規形を見つけます。

関数: poly_buchberger_criterion (polylist, varlist)

Buchberger判定(criterion)を使って もし polylistが現在の項順序に関して Groebner基底なら trueを返します: Buchberger判定(criterion)は、 polylistの2つの多項式 h1h2すべてに関して、 S多項式 S(h1,h2)polylistとして0に簡約されるというものです。

関数: poly_buchberger (polylist_fl varlist)

poly_buchbergerは 多項式のリスト上でBuchbergerアルゴリズムを実行し、 結果の Groebner基底を返します。

57.2.4 Standard postprocessing of Groebner Bases

K[ x[1],...,x[n] ]上のイデアル Ik番目の消去イデアル I_kは イデアル intersect(I, K[ x[k+1],...,x[n] ])です。
コロンイデアル I:Jは イデアル {h|for all w in J: w*h in I}です。.
イデアル I:p^infはイデアル {h| there is a n in N: p^n*h in I}です。
イデアル I:J^infはイデアル {h| there is a n in N and a p in J: p^n*h in I}です。
The 根基イデアル sqrt(I)はイデアル {h| there is a n in N : h^n in I }です。

関数: poly_reduction (polylist, varlist)

poly_reductionは多項式のリスト polylistを簡約します。 それぞれの多項式は他の多項式で完全に簡約されます。

関数: poly_minimization (polylist, varlist)

polylistと同じ単項式イデアルの最小全域である、 多項式リスト polylistの部分リストを返します。 すなわち、部分リストの中の多項式の主単項式はすべて、他の多項式の主単項式を割りません。

関数: poly_normalize_list (polylist, varlist)

poly_normalize_listpoly_normalizeをリストの中の多項式それぞれに適用します。 これは リスト polylistの中のすべての多項式を主係数で割ることを意味します。

関数: poly_grobner (polylist, varlist)

多項式リスト polylistで張られたイデアルのGroebner基底を返します。 グローバルフラグで影響を受けます。

関数: poly_reduced_grobner (polylist, varlist)

多項式リスト polylistで張られたイデアルの簡約Groebner基底を返します。

関数: poly_depends_p (poly, var, varlist)

poly_dependsは多項式が変数 varに依存するかテストします。

関数: poly_elimination_ideal (polylist, number, varlist)

poly_elimination_idealは、 (必ずしもGroebner基底である必要はない)生成多項式のリストとして指定されたイデアルの number番目の消去イデアルの Groebner基底を返します。

関数: poly_colon_ideal (polylist1, polylist2, varlist)

コロンイデアル

I(polylist1):I(polylist2)

の簡約Groebner基底を返します。

ここで、 polylist1polylist2は2つの多項式リストです。

関数: poly_ideal_intersection (polylist1, polylist2, varlist)

poly_ideal_intersectionは2つのイデアルの交わりです。

関数: poly_lcm (poly1, poly2, varlist)

poly1poly2の最小公倍数(式)を返します。

関数: poly_gcd (poly1, poly2, varlist)

poly1poly2の最大公約数(式)を返します。

ezgcd, gcd, gcdex, gcdivide も参照してください。

例:

(%i1) p1:6*x^3+19*x^2+19*x+6; 
                        3       2
(%o1)                6 x  + 19 x  + 19 x + 6
(%i2) p2:6*x^5+13*x^4+12*x^3+13*x^2+6*x;
                  5       4       3       2
(%o2)          6 x  + 13 x  + 12 x  + 13 x  + 6 x
(%i3) poly_gcd(p1, p2, [x]);
                            2
(%o3)                    6 x  + 13 x + 6
関数: poly_grobner_equal (polylist1, polylist2, varlist)

poly_grobner_equalは 2つの Groebner基底が同じイデアルを生成するか テストします。 もし、Groebner基底と仮定された2つの多項式リスト polylist1polylist2が 同じイデアルを生成するなら、trueを返します。 そうでないなら、 falseを返します。 これは、 一番目の基底のすべての多項式が二番目の基底を法として0に簡約されるかとその逆をチェックする ことと同値です。 以下の例では、一番目のリストがGroebner基底でないので 結果が falseであることに注意してください。

(%i1) poly_grobner_equal([y+x,x-y],[x,y],[x,y]);
(%o1)                         false
関数: poly_grobner_subsetp (polylist1, polylist2, varlist)

poly_grobner_subsetppolylist1が生成するイデアルが polylist2が生成するイデアルに含まれるかテストします。 このテストが常に成功するには、polylist2が Groebner基底でなければいけません。

関数: poly_grobner_member (poly, polylist, varlist)

もし多項式 polyが Groebner基底であると仮定された多項式リスト polylistが生成するイデアルに属するなら、 trueを返します。 そうでないなら、 falseを返します。

poly_grobner_memberは 多項式が Groebner基底であると仮定された多項式のリストが生成するイデアルに属するかテストします。 normal_formが0と同値です。

関数: poly_ideal_saturation1 (polylist, poly, varlist)

イデアル

I(polylist):poly^inf のsaturationの簡約 Groebner基底を返します。

幾何学的に、代数的閉体上で、 これは polyの多様体上で恒等的に0とならない polylistが生成するイデアルの中の 多項式の集合です。

関数: poly_ideal_saturation (polylist1, polylist2, varlist)

イデアル

I(polylist1):I(polylist2)^inf のsaturationの簡約 Groebner基底を返します。

幾何学的に、代数的閉体上で、 これは polylist2の多様体上で恒等的に0とならない polylist1が生成するイデアルの中の 多項式の集合です。

関数: poly_ideal_polysaturation1 (polylist1, polylist2, varlist)

polylist2は2個の多項式のリスト [poly1,...,polyn]です。 多項式リスト polylist1が生成するイデアルの 多項式リスト polylist2の多項式に関する連続saturationの列によって得られるイデアル

I(polylist):poly1^inf:...:polyn^inf

の簡約 Groebner基底を返します。

関数: poly_ideal_polysaturation (polylist, polylistlist, varlist)

polylistlistは多項式リストn個のリスト [polylist1,...,polylistn]です。 イデアル

I(polylist):I(polylist_1)^inf:...:I(polylist_n)^inf のsaturationの簡約 Groebner基底を返します。

関数: poly_saturation_extension (poly, polylist, varlist1, varlist2)

poly_saturation_extensionは有名な Rabinowitzのトリックを実装します。

関数: poly_polysaturation_extension (poly, polylist, varlist1, varlist2)

Next: , Previous:   [Contents][Index]