mutable/term API

Luna-Flow/luna-poly/mutable/term はミュータブルな TermPolynomial[A] を提供します。immut/term と同じ降順の正規形項配列を、_inplace メソッドと clear が置き換えるミュータブルなフィールドに保持します。演算子とその他のすべてのメソッドは新しい値を返します。

この型は mutable ファサードによって @mutable.TermPolynomial として再エクスポートされており、例ではこちらを使います。「immut と同様」とは immut/term API の意味論、制約、コストのことです。変更のモデルは mutable/term の設計 で説明しています。

型

TermPolynomial

項配列が常に単項式順序の降順にソートされ、統合され、係数 0 を含まないミュータブルな多変数多項式です。

type TermPolynomial[A] derive(Eq, @debug.Debug)
pub impl[A] @luna-generic.Zero for TermPolynomial[A]
pub impl[A : Eq + @luna-generic.Zero + @luna-generic.One] @luna-generic.One for TermPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid] Add for TermPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Neg] Sub for TermPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Mul] Mul for TermPolynomial[A]
pub impl[A : Eq + @luna-generic.Zero + Neg] Neg for TermPolynomial[A]
pub impl[A : Show + @luna-generic.Zero] Show for TermPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] @arithmetic.PowNatChecked for TermPolynomial[A]
pub impl[A] @core.Clearable for TermPolynomial[A]
pub impl[A] @core.Copyable for TermPolynomial[A]
pub impl[A] @core.HasArity for TermPolynomial[A]
pub impl[A] @core.HasShape for TermPolynomial[A]
pub impl[A] @core.HasTermCount for TermPolynomial[A]
pub impl[A] @core.HasTotalDegree for TermPolynomial[A]
pub impl[A] @core.IsZero for TermPolynomial[A]
pub impl[A] @core.MultivariatePolynomial for TermPolynomial[A]
pub impl[A] @core.MutablePolynomial for TermPolynomial[A]

構築と変換

TermPolynomial::from_terms, TermPolynomial::from_array, TermPolynomial::zero, TermPolynomial::one

immut と同様に多項式を構築します。入力配列はコピーされます。

pub fn[A : Eq + @luna-generic.AddMonoid] TermPolynomial::from_terms(Array[(@core.ExponentVector, A)]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid] TermPolynomial::from_array(Array[(Array[UInt], A)]) -> Self[A]
pub fn[A] TermPolynomial::zero() -> Self[A]
pub fn[A : Eq + @luna-generic.Zero + @luna-generic.One] TermPolynomial::one() -> Self[A]

TermPolynomial::from_immut, TermPolynomial::to_immut

イミュータブル型との相互変換です。どちらもコピーするため、後の変更がもう一方の値に影響することはありません。to_immut は項を再正規化し、O(mlog⁡m)O(m \log m) です。

pub fn[A] TermPolynomial::from_immut(@Luna-Flow/luna-poly/immut/term.TermPolynomial[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid] TermPolynomial::to_immut(Self[A]) -> @Luna-Flow/luna-poly/immut/term.TermPolynomial[A]

TermPolynomial::copy

独立したコピーを返します(Copyable::copy でも可)。

pub fn[A] TermPolynomial::copy(Self[A]) -> Self[A]

問い合わせ

TermPolynomial::to_terms, TermPolynomial::coefficients, TermPolynomial::size, TermPolynomial::term_count, TermPolynomial::is_zero, TermPolynomial::arity, TermPolynomial::total_degree, TermPolynomial::shape

immut と同様です。to_terms と coefficients は新しい配列を返し、先頭項が最初です。

pub fn[A] TermPolynomial::to_terms(Self[A]) -> Array[(@core.ExponentVector, A)]
pub fn[A] TermPolynomial::coefficients(Self[A]) -> Array[A]
pub fn[A] TermPolynomial::size(Self[A]) -> Int
pub fn[A] TermPolynomial::term_count(Self[A]) -> Int
pub fn[A] TermPolynomial::is_zero(Self[A]) -> Bool
pub fn[A] TermPolynomial::arity(Self[A]) -> Int
pub fn[A] TermPolynomial::total_degree(Self[A]) -> UInt?
pub fn[A] TermPolynomial::shape(Self[A]) -> @core.PolynomialShape

変更

TermPolynomial::add_term_inplace

レシーバに c xαc\,x^\alpha を加えます。同じ指数ベクトルの既存の項と統合し、和が 0 ならその項を削除します。配列全体が再正規化され、O(mlog⁡m)O(m \log m) です。

pub fn[A : Eq + @luna-generic.AddMonoid] TermPolynomial::add_term_inplace(Self[A], @core.ExponentVector, A) -> Unit

TermPolynomial::add_inplace

other の項を add_term_inplace で 1 つずつ加えることで、レシーバを self + other に置き換えます。other の項数が nn のときコストは O(n (m+n)log⁡(m+n))O(n\,(m + n)\log(m + n)) です。大きなオペランドには p = p + q か、連結した項に対する from_terms を使ってください。

pub fn[A : Eq + @luna-generic.AddMonoid] TermPolynomial::add_inplace(Self[A], Self[A]) -> Unit

TermPolynomial::mul_inplace

レシーバを self * other に置き換えます。積を先に計算するので、p.mul_inplace(p) は p を 2 乗します。

pub fn[A : Eq + @luna-generic.AddMonoid + Mul] TermPolynomial::mul_inplace(Self[A], Self[A]) -> Unit

TermPolynomial::scale_inplace

レシーバを c xγ⋅pc\,x^\gamma \cdot p に置き換えます。再ソートなしで順序が保たれます。

pub fn[A : Eq + @luna-generic.Zero + Mul] TermPolynomial::scale_inplace(Self[A], @core.ExponentVector, A) -> Unit

TermPolynomial::clear

レシーバを零にします(Clearable::clear でも可)。

pub fn[A] TermPolynomial::clear(Self[A]) -> Unit
test "mutation" {
  let p = @mutable.TermPolynomial::from_array([([1U], 2)])
  p.add_term_inplace(@mutable.ExponentVector::from_array([0U, 1]), 3)
  inspect(p, content="3 * x_1 + 2 * x")
  p.add_term_inplace(@mutable.ExponentVector::from_array([1U, 0]), -2)
  inspect(p, content="3 * x_1")
  p.mul_inplace(p)
  p.scale_inplace(@mutable.ExponentVector::from_array([1U]), 2)
  inspect(p, content="18 * xx_1^2")
  p.clear()
  assert_true(p.is_zero())
}

非破壊的な演算

TermPolynomial::add, TermPolynomial::sub, TermPolynomial::mul, TermPolynomial::neg

演算子 +、-、*、単項 - で、immut と同様です。+ はレシーバをコピーして add_inplace を呼ぶため、そのメソッドのコストになります。* はイミュータブルな積に委譲します。

pub fn[A : Eq + @luna-generic.AddMonoid] TermPolynomial::add(Self[A], Self[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Neg] TermPolynomial::sub(Self[A], Self[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul] TermPolynomial::mul(Self[A], Self[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.Zero + Neg] TermPolynomial::neg(Self[A]) -> Self[A]

TermPolynomial::scale, TermPolynomial::pow, TermPolynomial::eval, TermPolynomial::eval_checked

immut と同様です。

pub fn[A : Eq + @luna-generic.Zero + Mul] TermPolynomial::scale(Self[A], @core.ExponentVector, A) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] TermPolynomial::pow(Self[A], UInt) -> Self[A]
pub fn[A : @luna-generic.AddMonoid + Mul + @luna-generic.One] TermPolynomial::eval(Self[A], Array[A]) -> A
pub fn[A : @luna-generic.AddMonoid + Mul + @luna-generic.One] TermPolynomial::eval_checked(Self[A], Array[A]) -> A?

TermPolynomial::equal, TermPolynomial::to_string, TermPolynomial::ops

構造的等価性、表示、MultivariateOps レコードで、immut と同様です。

pub fn[A : Eq] TermPolynomial::equal(Self[A], Self[A]) -> Bool
pub fn[A : Show + @luna-generic.Zero] TermPolynomial::to_string(Self[A]) -> String
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] TermPolynomial::ops() -> @core.MultivariateOps[Self[A], A]
test "non-mutating" {
  let p = @mutable.TermPolynomial::from_array([([1U], 1), ([], 1)])
  let q = p.pow(2)
  inspect(q, content="1 * x^2 + 2 * x + 1")
  inspect(p, content="1 * x + 1")
  inspect(q.eval([3]), content="16")
  assert_true(q.to_immut() == @immut.TermPolynomial::from_array([([2U], 1), ([1U], 2), ([], 1)]))
}

非推奨

ソース互換性のために残されている、隠されたメソッド形式:

非推奨代替
p.not_equal(q)p != q
p.output(logger)to_string または文字列補間
p.to_repr()Repr(p) または debug_inspect
p.pow_nat_checked(e, ctx)@arithmetic.PowNatChecked::pow_nat_checked(p, e, ctx) または p.pow(e)