![michael-dziedzic-79T37JljDZ4-unsplash.jpg](/_next/image?url=https%3A%2F%2Fimages.ctfassets.net%2Fai4vjpehjr3j%2F6LgFimz7Z1CVaIatdJDmvH%2F3472e487cfe2338cdcb5a2fa98598403%2Fmichael-dziedzic-79T37JljDZ4-unsplash.jpg&w=3840&q=75)
型レベル多項式の微分
![Kazuki Moriyama](/_next/image?url=https%3A%2F%2Fimages.ctfassets.net%2Fai4vjpehjr3j%2F2Oa6QzkYOe51LQiER7VEtN%2F6e819c38a98a1c649401b86861c40d53%2Fimage.png&w=96&q=75)
Kazuki Moriyama (森山 和樹)
以前書いた型レベル多項式をベースに型レベルに多項式の微分を実装する。
https://kazchimo.com/2021/05/19/dotty-typelevel-polynomial/
多項式の定義とヘルパー型
以前の記事の再掲になるが以下が型レベル多項式の定義である。
enum Polynomial:
case X[Coef <: Int, N <: Int]()
case Plus[XX <: X[?, ?], YY <: Polynomial]()
Xが多項式の項、Plusが項と多項式の足し算を表す。
後で使いやすいように定数項用のヘルパー型も定義しておく。
type Cst[Coef <: Int] = Coef X 0
あとは一般の多項式の足し算型として+も全開の記事で定義したのでそれも今回使う。
微分の構成
微分を構成しよう。
type Derivative[A <: Polynomial]
AがXかつ乗数が0のときは定数0に変換される。
type Derivative[A <: Polynomial] <: Polynomial = A match
case c X 0 => Cst[0]
AがXかつ乗数が1以上のときには乗数を-1して、元の乗数を係数にかける。
import scala.compiletime.ops.int.{-, `*`}
type Derivative[A <: Polynomial] <: Polynomial = A match
case c X 0 => Cst[0]
case c X n => (c * n) X (n - 1)
Aが多項式の足し算の場合には各項を微分した結果を足せばいい。
import scala.compiletime.ops.int.{-, `*`}
type Derivative[A <: Polynomial] <: Polynomial = A match
case c X 0 => Cst[0]
case c X n => (c * n) X (n - 1)
case x Plus y => Derivative[x] + Derivative[y]
これを使えば多項式の微分が型レベルで実現できる。
summon[Derivative[Cst[1]] =:= Cst[0]]
summon[Derivative[2 X 1] =:= (2 X 0)]
summon[Derivative[2 X 2] =:= (4 X 1)]
summon[Derivative[(2 X 2) + (1 X 1) + Cst[1]] =:= (4 X 1) + Cst[1]]