mutable/dense API

Luna-Flow/luna-poly/mutable/dense 提供可变的 DensePolynomial[A]:采用与 immut/dense 相同的规范升幂系数存储,保存在一个可增长的数组中,由 setter 和 _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 超出次数时扩展数组,之后去除末尾零,因此把首项系数设为零会降低次数。幂为负时中止;没有带检查的变体。

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 加倍。

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。幂为负时中止。

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)