=begin
[(())]
(())
/
(())
/
(())
/
(())
= Algebra::MPolynomial
((*(多変数多項式環クラス)*))
多変数の多項式環を表現します。実際のクラスを生成するには環を指定して、
クラスメソッド((<::create>))あるいは関数(())()を
用います。
== ファイル名:
* ((|m-polynomial.rb|))
== スーパークラス:
* ((|Object|))
== インクルードしているモジュール:
* ((|Enumerable|))
* ((|Comparable|))
* (())
== 関連する関数:
--- Algebra.MPolynomial(ring [, obj0 [, obj1 [, ...]]])
((<::create(ring [, obj0[, obj1[, ...]]])>))に同じ。
== クラスメソッド:
--- ::create(ring [, obj0 [, obj1 [, ...]]])
((|ring|))で表現されるクラスを係数環とする多変数多項式環
クラスを生成します。
オブジェクト(({obj0, obj1, ...}))で変数を登録し、戻り値である
多変数多項式環クラスは Algebra::MPolynomial クラスのサブクラスです。
オブジェクト(({obj0, obj1, ...}))は変数の区別と
名(((|to_s|))の値)に利用されるだけです。
このサブクラスにはクラスメソッドとして((|ground|))と
((|vars|))が定義され、それぞれ、係数環((|ring|))、変数
の配列を返します。
登録されたオブジェクト (({obj0, obj1, ...})) で表現される
される変数は(({var(obj0)})), (({var(obj1)})),...
で得ることができます。すなわち(({vars == [var(obj0), var(obj1), ...]}))
です。
各変数の大小関係は(({obj0 > obj1 > ...}))となります。各単項式
の順序は((<::set_ord>))で指定します。
例: 整数を係数とする多項式環の生成
require "m-polynomial"
P = Algebra::MPolynomial.create(Integer, "x", "y", "z")
x, y, z = P.vars
p((-x + y + z)*(x + y - z)*(x - y + z))
#=> -x^3 + x^2y + x^2z + xy^2 - 2xyz + xz^2 - y^3 + y^2z + yz^2 - z^3
p P.ground #=> integer
--- ::vars([obj0 [, obj1 [, ...]]])
((*引数が1つもないとき*))、既に登録されている全ての変数を
配列として返します。
例:
P = Algebra.MPolynomial(Integer, "x", "y", "z")
p P.vars #=> [x, y, z]
((*引数がただ1つで文字列であるとき*))、文字列を「英字1字+数字の列」
に分解し、それで表現される変数を登録します。オブジェクトが既
に登録されていれば新たな登録はしません。戻り値はそれぞれのオ
ブジェクトに対応する変数の配列です。
例:
P = Algebra.MPolynomial(Integer)
x, y, z, w = P.vars("a0b10cd")
p P.vars #=> [a0, b10, c, d]
p [x, y, z, w] #=> [a0, b10, c, d]
((*それ以外のとき*))、引数であるオブジェクト
(({obj0, obj1, ...})) で表現される変数
を登録します。オブジェクトが既に登録されていれば新たな登録
はしません。戻り値は(({obj0, obj1, ...}))に対応する変数
の配列です。
例:
P = Algebra.MPolynomial(Integer)
p P.vars("x", "y", "z") #=> [x, y, z]
--- ::mvar([obj0 [, obj1 [, ...]]])
((*引数が1つもないとき*))、既に登録されている全ての変数を
配列として返します。
((*それ以外のとき*))、引数であるオブジェクト
(({obj0, obj1, ...})) で表現される変数
を登録します。オブジェクトが既に登録されていれば新たな登録
はしません。戻り値は (({obj0, obj1, ...})) に対応する変数
の配列です。
--- ::to_ary
(({[self, *vars]})) を返します。
例: 多項式環と変数を同時に定義する。
P, x, y, z, w = Algebra.MPolynomial(Integer, "a", "b", "c", "d")
--- ::var(obj)
((|obj|)) で登録されたオブジェクトによって表現される変数を返します。
例:
P = Algebra.MPolynomial(Integer, "X", "Y", "Z")
x, y, z = P.vars
P.var("Y") == y #=> true
--- ::variables
既に登録されている変数を表現するオブジェクトの配列を返します。
--- ::indeterminate(obj)
((<::var>)) と同じです。
--- ::zero?
零元であるとき真を返します。
--- ::zero
零元を返します。
--- ::unity
単位元を返します。
--- ::set_ord(ord [, v_ord])
((|ord|)) に単項式順序をシンボルで指定します。順序として可能な指定
は (({:lex})) (辞書式順序(デフォルト))、(({:grlex})) (次数付き辞書
式順序)、(({:grevlex})) (次数付き逆辞書式順序)の3つです。
各変数間の順序は登録された順(先に登録されるほど大きい)に
なります。((|v_ord|)) に配列を与えてこの順番を変更する事が
できます。
例: (({x, y, z = P.var("xyz")})) としたときの順位
require "m-polynomial"
P = Algebra.MPolynomial(Integer)
x, y, z = P.vars("xyz")
f = -5*x**3 + 7*x**2*z**2 + 4*x*y**2*z + 4*z**2
P.set_ord(:lex)
p f #=> -5x^3 + 7x^2z^2 + 4xy^2z + 4z^2
f.method_cash_clear
P.set_ord(:grlex)
p f #=> 7x^2z^2 + 4xy^2z - 5x^3 + 4z^2
f.method_cash_clear
P.set_ord(:grevlex)
p f #=> 4xy^2z + 7x^2z^2 - 5x^3 + 4z^2
f.method_cash_clear
P.set_ord(:lex, [2, 1, 0]) # z > y > x
p f #=> 7x^2z^2 + 4z^2 + 4xy^2z - 5x^3
# ((<::with_ord>)) も参照してください。
--- ::order=(x)
((<::set_ord(x)>)) と同じです。
#--- ::order=(obj)
# ((<::set_ord(obj)>)) と同じです。
--- ::get_ord
単項式順序(:lex, :grlex, :grevlex)を返します。
--- ::ord
((<::get_ord>)) と同じです。
#--- ::order
# ((<::get_ord>)) と同じです。
--- ::with_ord(ord [, v_ord[ [, array_of_polys]])
((|ord|)) を単項式順序、((|v_ord|)) を変数の順序の変換配列として、
ブロックを実行します。
ブロックを抜けると以前の順序に戻ります。
多項式の配列 ((|array_of_polys|)) が与えられれば、それらに対して
(()) が実行されてから、ブロックが実行されます。
(このブロックはスレッドセーフではありません。)
例:
require "m-polynomial"
P = Algebra.MPolynomial(Integer)
x, y, z = P.vars("xyz")
f = -5*x**3 + 7*x**2*z**2 + 4*x*y**2*z + 4*z**2
P.with_ord(:lex, nil, [f]) do
p f #=> -5x^3 + 7x^2z^2 + 4xy^2z + 4z^2
p f.lt #=> -5x^3
end
P.with_ord(:grlex, nil, [f]) do
p f #=> 7x^2z^2 + 4xy^2z - 5x^3 + 4z^2
p f.lt #=> 7x^2z^2
end
P.with_ord(:grevlex, nil, [f]) do
p f #=> 4xy^2z + 7x^2z^2 - 5x^3 + 4z^2
p f.lt #=> 4xy^2z
end
P.with_ord(:lex, [2, 1, 0], [f]) do # z > y > x
p f #=> 7x^2z^2 + 4z^2 + 4xy^2z - 5x^3
p f.lt #=> 7x^2z^2
end
((<::set_ord>)) も参照してください。
--- ::monomial(ind[, c])
multi-degree ((|ind|)) で、係数が ((|c|)) の単項式を返します。
(ただし、(()) は extend
されていない。)
((|c|)) が省略されれば、単位元とみなされます。
#--- ::const(x)
#--- ::regulate(x)
#--- ::[](*x)
#--- ::method_cash_clear(*m)
== メソッド:
--- monomial(ind[, c])
((<::monomial>)) と同じ。
#--- each
#--- keys
#--- values
#--- [](ind)
#--- []=(ind, c)
#--- constant_coeff
#--- include?
#--- compact!
#--- rt!
--- constant?
定数(0次式)であるとき、真を返します。
--- monomial?
単項式であるとき、真を返します。
--- zero?
零であるとき、真を返します。
--- zero
零元を返します。
--- unity
単位元を返します。
--- method_cash_clear
このライブラリは、同じ計算を繰り返ししないように結果を保存
していますが、それをクリアします。この操作は単項式順序の変
更などを行った後に必要になります。
結果が保存されているメソッドは、
(()), (()), (()), ((