luna-poly

luna-poly は MoonBit 向けの正規形を持つ多項式型を提供します。密な一変数多項式、整列済み項配列または順序付きマップによる多変数多項式、そして評価・部分評価・代入をサポートする名前付き変数上の多項式です。どの型にも、多項式が値であるイミュータブル版と、明示的に名付けられたメソッドがコンテナをその場で更新するミュータブル版があります。このマニュアルはバージョン 0.2.0 を対象としています。

提供するもの

  • 正規形. どの表現もゼロ項を取り除いて 1 つの正規形を保つので、== は多項式の等価性です。
  • 共有の単項式モデル. 変数の個数を固定しない指数ベクトルを、次数付き単項式順序で順序付けます。
  • コストを明示したアルゴリズム. 筆算法と Karatsuba 法による乗算、Horner 法による評価、合成、形式的導関数、二分累乗、そして環準同型としての同時代入。
  • ジェネリックなコード. 小さな能力トレイト、演算レコード、そして両方のファサードから再エクスポートされる luna-generic の代数トレイト。
  • 変数コンテキストによる 名前付き変数。type_theory の名前と橋渡しされています。
  • すべての部分的な演算の チェック付き版。中断 (abort) する代わりに None を返します。

パッケージ

パッケージ役割ページ
core指数ベクトル、変数とコンテキスト、形状、能力トレイト、演算レコードAPI · チュートリアル · 設計
immutイミュータブル層のファサードAPI · チュートリアル · 設計
immut/denseイミュータブルな密の一変数 DensePolynomialAPI · チュートリアル · 設計
immut/termイミュータブルな整列項 TermPolynomialAPI · チュートリアル · 設計
immut/sparseイミュータブルな順序付きマップ SparsePolynomialAPI · チュートリアル · 設計
immut/contextイミュータブルな名前付き変数 ContextPolynomial と代入API · チュートリアル · 設計
mutableミュータブル層のファサードAPI · チュートリアル · 設計
mutable/denseミュータブルな DensePolynomialAPI · チュートリアル · 設計
mutable/termミュータブルな TermPolynomialAPI · チュートリアル · 設計
mutable/sparseミュータブルな SparsePolynomialAPI · チュートリアル · 設計
mutable/contextミュータブルな ContextPolynomialAPI · チュートリアル · 設計
internalモジュール内部専用のヘルパー(自然数乗)API · チュートリアル · 設計
consistency層と表現が一致することを検査するテスト専用パッケージAPI · チュートリアル · 設計

パッケージ間の依存関係は アーキテクチャガイド で示しています。

読み進め方

ライブラリを初めて使う場合. immut チュートリアル を読み、次に必要な表現のチュートリアルを読んでください。一変数なら dense、多変数なら term または sparse、名前付き変数と代入なら context です。

アプリケーションで使う場合. immut API と各表現の API ページを手元に置いてください。すべての前提条件、失敗ケース、コストが記載されています。中間値がボトルネックになることがプロファイリングで分かったら、mutable チュートリアル を読んでください。

ジェネリックなコードや新しい表現を書く場合. core チュートリアル と core の設計 を読んでください。後者では単項式順序を導出し、能力トレイトと演算レコードを説明しています。

コントリビュートする場合. アーキテクチャガイド、変更するパッケージの設計ページ、consistency のページ、そして コントリビューションガイド を読んでください。

要件とインストール

luna-poly には moonc 0.10 以降を含む MoonBit ツールチェーンが必要です。次のようにしてモジュールに追加します

moon add Luna-Flow/luna-poly@0.2.0

そして moon.pkg でファサードをインポートします:

import {
  "Luna-Flow/luna-poly/immut",
}

Luna-Flow/luna-generic、Luna-Flow/arithmetic、Luna-Flow/type_theory に依存しており、これらは moon が自動的にインストールします。

最初の例

test "first example" {
  let p = @immut.DensePolynomial::from_coefficients([1, 2, 3])
  inspect(p.pow(2).eval(2), content="289")

  let ctx = @immut.VariableContext::from_names(["x", "y"])
  let x = ctx.require_variable("x")
  let y = ctx.require_variable("y")
  let q = @immut.ContextPolynomial::from_named_terms_as_sparse(ctx, [
    ([(x, 2U)], 1),
    ([(x, 1U), (y, 1U)], 3),
    ([], 4),
  ])
  inspect(q.eval_named([(x, 2), (y, 5)]), content="38")
  inspect(q.eval_partial([(x, 2)]), content="8 + 6 * y")
}

バージョン 0.2.0 の構成

バージョン 0.2.0 では、以前の単一のルートパッケージが core、実装パッケージ、および 2 つのファサードに置き換えられました。Luna-Flow/luna-poly/immut または Luna-Flow/luna-poly/mutable を明示的にインポートしてください。旧ルートパッケージ向けに書かれたコードは、そのままではコンパイルできません。