mutable/dense API

Luna-Flow/luna-poly/mutable/dense はミュータブルな DensePolynomial[A] を提供します。immut/dense と同じ正規形の昇順係数ストレージを伸長可能な配列に保持し、セッターと _inplace メソッドがそれを更新します。演算子とその他のメソッドはすべて新しい値を返し、オペランドには手を触れません。

この型は mutable ファサードによって @mutable.DensePolynomial として再エクスポートされており、例ではこちらを使います。「immut と同様」と記したメソッドは、immut/dense API のページで説明しているものとまったく同じ意味、制約、コストを持ちます。変更のモデルは mutable/dense の設計 で説明しています。

型

DensePolynomial

格納配列が決して零係数で終わらない、ミュータブルな密な一変数多項式です。

type DensePolynomial[A] derive(Compare, Eq, @debug.Debug)
pub impl[A] @luna-generic.Zero for DensePolynomial[A]
pub impl[A : Eq + @luna-generic.Zero + @luna-generic.One] @luna-generic.One for DensePolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid] Add for DensePolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Neg] Sub for DensePolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Mul] Mul for DensePolynomial[A]
pub impl[A : Eq + @luna-generic.Zero + Neg] Neg for DensePolynomial[A]
pub impl[A : Show + Eq + @luna-generic.Zero] Show for DensePolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] @arithmetic.PowNatChecked for DensePolynomial[A]
pub impl[A] @core.Clearable for DensePolynomial[A]
pub impl[A] @core.Copyable for DensePolynomial[A]
pub impl[A] @core.HasDegree for DensePolynomial[A]
pub impl[A] @core.HasLength for DensePolynomial[A]
pub impl[A] @core.HasShape for DensePolynomial[A]
pub impl[A] @core.IsZero for DensePolynomial[A]
pub impl[A] @core.MutablePolynomial for DensePolynomial[A]
pub impl[A] @core.UnivariatePolynomial for DensePolynomial[A]

構築と変換

DensePolynomial::from_coefficients, DensePolynomial::constant, DensePolynomial::variable, DensePolynomial::monomial, DensePolynomial::monomial_checked, DensePolynomial::zero, DensePolynomial::one

多項式を構築します (immut と同様)。from_coefficients は入力をコピーします。

pub fn[A : Eq + @luna-generic.Zero] DensePolynomial::from_coefficients(Array[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.Zero] DensePolynomial::constant(A) -> Self[A]
pub fn[A : Eq + @luna-generic.Zero + @luna-generic.One] DensePolynomial::variable() -> Self[A]
pub fn[A : Eq + @luna-generic.Zero] DensePolynomial::monomial(Int, A) -> Self[A]
pub fn[A : Eq + @luna-generic.Zero] DensePolynomial::monomial_checked(Int, A) -> Self[A]?
pub fn[A] DensePolynomial::zero() -> Self[A]
pub fn[A : Eq + @luna-generic.Zero + @luna-generic.One] DensePolynomial::one() -> Self[A]

DensePolynomial::from_immut

イミュータブルな多項式の係数を持つ新しいミュータブルな多項式を返します。

pub fn[A : Eq + @luna-generic.Zero] DensePolynomial::from_immut(@Luna-Flow/luna-poly/immut/dense.DensePolynomial[A]) -> Self[A]

DensePolynomial::to_immut

現在の係数のイミュータブルなスナップショットを返します。その後レシーバーを変更してもスナップショットには影響しません。

pub fn[A : Eq + @luna-generic.Zero] DensePolynomial::to_immut(Self[A]) -> @Luna-Flow/luna-poly/immut/dense.DensePolynomial[A]

DensePolynomial::copy

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

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

問い合わせ

DensePolynomial::to_coefficients, DensePolynomial::length, DensePolynomial::degree, DensePolynomial::is_zero, DensePolynomial::coefficient, DensePolynomial::coefficient_checked, DensePolynomial::leading_term, DensePolynomial::leading_coefficient, DensePolynomial::shape

immut と同様です。to_coefficients はコピーを返すため、結果を変更しても多項式には影響しません。

pub fn[A] DensePolynomial::to_coefficients(Self[A]) -> Array[A]
pub fn[A] DensePolynomial::length(Self[A]) -> Int
pub fn[A] DensePolynomial::degree(Self[A]) -> Int?
pub fn[A] DensePolynomial::is_zero(Self[A]) -> Bool
pub fn[A : @luna-generic.Zero] DensePolynomial::coefficient(Self[A], Int) -> A
pub fn[A : @luna-generic.Zero] DensePolynomial::coefficient_checked(Self[A], Int) -> A?
pub fn[A] DensePolynomial::leading_term(Self[A]) -> (Int, A)?
pub fn[A] DensePolynomial::leading_coefficient(Self[A]) -> A?
pub fn[A] DensePolynomial::shape(Self[A]) -> @core.PolynomialShape

変更

DensePolynomial::set_coefficient

xkx^k の係数を設定します。kk が次数を超える場合は配列を伸長し、その後切り詰めるため、先頭係数を零にすると次数が下がります。負のべきは中断 (abort) します。チェック付き版はありません。

pub fn[A : Eq + @luna-generic.Zero] DensePolynomial::set_coefficient(Self[A], Int, A) -> Unit

DensePolynomial::clear

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

pub fn[A] DensePolynomial::clear(Self[A]) -> Unit

DensePolynomial::add_inplace

既存の配列に加算することで、レシーバーを self + other で置き換えます。O(max⁡(m,n))O(\max(m, n)) です。p.add_inplace(p) は p を 2 倍にします。

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

DensePolynomial::mul_inplace

レシーバーを self * other で置き換えます (筆算式、O(mn)O(mn))。積はまず新しい配列に計算されるため、p.mul_inplace(p) は p を二乗します。

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

DensePolynomial::scale_inplace

レシーバーを c xk⋅pc\,x^k \cdot p で置き換えます。負のべきは中断 (abort) します。

pub fn[A : Eq + @luna-generic.Zero + Mul] DensePolynomial::scale_inplace(Self[A], Int, A) -> Unit
test "mutation" {
  let p = @mutable.DensePolynomial::from_coefficients([1, 2, 3])
  let snapshot = p.to_immut()
  p.set_coefficient(4, 1)
  inspect(p, content="1 + 2x^1 + 3x^2 + 1x^4")
  p.set_coefficient(4, 0)
  debug_inspect(p.degree(), content="Some(2)")
  p.add_inplace(@mutable.DensePolynomial::from_coefficients([-1, -2, -3]))
  assert_true(p.is_zero())
  inspect(snapshot, content="1 + 2x^1 + 3x^2")
  let q = @mutable.DensePolynomial::from_coefficients([1, 1])
  q.mul_inplace(q)
  q.scale_inplace(1, 2)
  inspect(q, content="2x^1 + 4x^2 + 2x^3")
}

非破壊的な演算

DensePolynomial::add, DensePolynomial::sub, DensePolynomial::mul, DensePolynomial::neg

演算子 +、-、* と単項 - で、新しい多項式を返します (immut と同様)。

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

DensePolynomial::scale, DensePolynomial::scale_checked, DensePolynomial::pow, DensePolynomial::karatsuba

immut と同様です。イミュータブルな型に変換して計算し、元に戻します。

pub fn[A : Eq + @luna-generic.Zero + Mul] DensePolynomial::scale(Self[A], Int, A) -> Self[A]
pub fn[A : Eq + @luna-generic.Zero + Mul] DensePolynomial::scale_checked(Self[A], Int, A) -> Self[A]?
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] DensePolynomial::pow(Self[A], UInt) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + Neg + @luna-generic.One] DensePolynomial::karatsuba(Self[A], Self[A]) -> Self[A]

DensePolynomial::eval, DensePolynomial::substitute, DensePolynomial::derivative

Horner 法による評価、合成 p(q)p(q)、形式的微分です (immut と同様)。

pub fn[A : @luna-generic.AddMonoid + Mul] DensePolynomial::eval(Self[A], A) -> A
pub fn[A : Eq + @luna-generic.AddMonoid + Mul] DensePolynomial::substitute(Self[A], Self[A]) -> Self[A]
pub fn[A : @luna-generic.NatHomomorphism + Eq + @luna-generic.Zero + Mul] DensePolynomial::derivative(Self[A]) -> Self[A]

DensePolynomial::equal, DensePolynomial::compare, DensePolynomial::to_string

構造的等価性、構造的順序 (まず次数、次に定数項からの係数)、および表示です (immut と同様)。

pub fn[A : Eq] DensePolynomial::equal(Self[A], Self[A]) -> Bool
pub fn[A : Compare] DensePolynomial::compare(Self[A], Self[A]) -> Int
pub fn[A : Show + Eq + @luna-generic.Zero] DensePolynomial::to_string(Self[A]) -> String

DensePolynomial::ops

ミュータブルな型の UnivariateOps レコードです。その関数は引数を変更しません。

pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] DensePolynomial::ops() -> @core.UnivariateOps[Self[A], A]
test "non-mutating" {
  let p = @mutable.DensePolynomial::from_coefficients([1, 2, 3])
  let q = p * p
  inspect(p, content="1 + 2x^1 + 3x^2")
  inspect(q.eval(1), content="36")
  let f = @mutable.DensePolynomial::from_coefficients([1.0, 2.0, 3.0])
  debug_inspect(f.derivative().to_coefficients(), content="[2, 6]")
  inspect(@mutable.DensePolynomial::ops().eval(p, 2), content="17")
}

非推奨

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

非推奨代替
p.not_equal(q)p != q
p.op_lt(q), op_le, op_gt, op_ge<, <=, >, >=
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)