internal API

Luna-Flow/luna-poly/internal は実装パッケージ間で共有されるヘルパーを保持します。MoonBit は internal パッケージをインポートできるのを同じモジュール内のパッケージに限定しているため、このページは各表現が依存する契約を記述するものです。luna-poly の外のコードからは呼び出せません。

べき

pow_nat

単位元 one から始めて、二分累乗法で自然数の指数に対する aea^e を計算します。

pub fn[A : Mul] pow_nat(A, UInt, one~ : A) -> A
  • pow_nat(a, 0, one=u) は a が何であっても u を返します。ライブラリ内のすべての pow(0) が、零に対しても 1 を返すのはこのためです。
  • ⌊log⁡2e⌋\lfloor \log_2 e \rfloor 回の二乗と、ee の立っているビットごとに高々 1 回の追加乗算を行うため、* の呼び出しは高々 2⌊log⁡2e⌋+12\lfloor \log_2 e \rfloor + 1 回です。
  • 必要なのは、one が左単位元となる結合的な * だけです。掛け合わせる因子はすべて a のべきなので、可換性は不要です。

多項式のべき (DensePolynomial::pow、TermPolynomial::pow、SparsePolynomial::pow) と、評価や代入における係数のべき aiαia_i^{\alpha_i} に使われます。

// Inside luna-poly only:
let p = @internal.pow_nat(base, 5U, one=DensePolynomial::one())