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 でも可)。 です。
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
の係数を設定します。 が次数を超える場合は配列を伸長し、その後切り詰めるため、先頭係数を零にすると次数が下がります。負のべきは中断 (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 で置き換えます。 です。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 で置き換えます (筆算式、)。積はまず新しい配列に計算されるため、p.mul_inplace(p) は p を二乗します。
pub fn[A : Eq + @luna-generic.AddMonoid + Mul] DensePolynomial::mul_inplace(Self[A], Self[A]) -> Unit
DensePolynomial::scale_inplace
レシーバーを で置き換えます。負のべきは中断 (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 法による評価、合成 、形式的微分です (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) |