私は自分のニーズに合わせて単純な多項式関連のライブラリを作成しています。今のところ、GF(2) 上の多項式ベースの多項式だけを扱っているので、単純に次のように表されます。
case class Polynomial(coeffs: BitSet)
だから私はちょうどのようなものを書くことができます
Polynomial(BitSet(0,1,2))
表現します
(x^2 + x + 1)
今、私は乗算関数について特に誇りに思っています。
def *(that: Polynomial): Polynomial = Polynomial {
coeffs.foldLeft(BitSet.empty) { case (acc, i) => acc ^ that.coeffs.map(i +) }
}
しかし、今のところ、他の多項式モジュロによる簡約を表現するためのすべての努力は、同様の結果を示しませんでした。除算がやや複雑であることは確かに理解していますが、現在、非常に汚い再帰的なソリューションがあり、まったく好きではありません。私が現在持っているのは、次のようなものです (私たちが GF(2) にいることを忘れないでください)。(UPD:クラス外で実行できるようにするための簡略化されたコード)
def foo(thisSet: BitSet, thatSet: BitSet): BitSet = {
var ts = thisSet
while (!ts.isEmpty && ts.max >= thatSet.max) {
ts = ts ^ thatSet.map(_ - thatSet.max + ts.max)
}
ts
}
それはうまく動作します (私はこれまでテストを書いていませんでしたが) が、私はきちんとしたものが欲しいです (せいぜい末尾再帰ですが、できれば折り畳み/マップ/縮小を使用するだけです.