Go to the first, previous, next, last section, table of contents.

## Weight

前節で紹介した項順序は, 各変数に weight (重み) を設定することで より一般的なものとなる.

    [0] dp_td(<<1,1,1>>);
    3
    [1] dp_set_weight([1,2,3])$
    [2] dp_td(<<1,1,1>>);
    6

単項式の全次数を計算する際, デフォルトでは 各変数の指数の和を全次数とする. これは各変数の weight を 1 と 考えていることに相当する. この例では, 第一, 第二, 第三変数の weight をそれぞれ 1,2,3 と指定している. このため, `<<1,1,1>>` の全次数 (以下ではこれを単項式の weight と呼ぶ) が `1*1+1*2+1*3=6` となる. weight を設定することで, 同じ項順序型のもとで異なる項順序が定義できる. 例えば, weight をうまく設定することで, 多項式を weighted homogeneous にすることができる場合がある.

各変数に対する weight をまとめたものを weight vector と呼ぶ. すべての成分が正であり, グレブナ基底計算において, 全次数の 代わりに用いられるものを特に sugar weight と呼ぶことにする. sugar strategy において, 全次数の代わりに使われるからである. 一方で, 各成分が必ずしも正とは限らない weight vector は, sugar weight として設定することはできないが, 項順序の一般化には 有用である. これらは, 行列による項順序の設定にすでに現れて いる. すなわち, 項順序を定義する行列の各行が, 一つの weight vector と見なされる. また, ブロック順序は, 各ブロックの 変数に対応する成分のみ 1 で他は 0 の weight vector による比較を 最初に行ってから, 各ブロック毎の tie breaking を行うことに相当する.

weight vector の設定は `dp_set_weight()` で行うことができる が, 項順序を指定する際の他のパラメタ (項順序型, 変数順序) と まとめて設定できることが望ましい. このため, 次のような形でも 項順序が指定できる.

    [64] B=[x+y+z-6,x*y+y*z+z*x-11,x*y*z-6]$
    [65] dp_gr_main(B|v=[x,y,z],sugarweight=[3,2,1],order=0);
    [z^3-6*z^2+11*z-6,x+y+z-6,-y^2+(-z+6)*y-z^2+6*z-11]
    [66] dp_gr_main(B|v=[y,z,x],order=[[1,1,0],[0,1,0],[0,0,1]]);
    [x^3-6*x^2+11*x-6,x+y+z-6,-x^2+(-y+6)*x-y^2+6*y-11]
    [67] dp_gr_main(B|v=[y,z,x],order=[[x,1,y,2,z,3]]);
    [x+y+z-6,x^3-6*x^2+11*x-6,-x^2+(-y+6)*x-y^2+6*y-11]

いずれの例においても, 項順序は option として指定されている. 最初の例では `v` により変数順序を, `sugarweight` により sugar weight vector を, `order`により項順序型を指定している. 二つ目の例における `order` の指定は matrix order と同様である. すなわち, 指定された weight vector を左から順に使って weight の比較 を行う. 三つ目の例も同様であるが, ここでは weight vector の要素を 変数毎に指定している. 指定がないものは 0 となる. 三つ目の例では, `order` による指定では項順序が決定しない. この場合には, tie breaker として全次数逆辞書式順序が自動的に設定される. この指定方法は, `dp_gr_main`, `dp_gr_mod_main` など の組み込み関数でのみ可能であり, `gr` などのユーザ定義関数 では未対応である.

Go to the first, previous, next, last section, table of contents.