michael-dziedzic-79T37JljDZ4-unsplash.jpg

型レベル多項式の微分

 
0
このエントリーをはてなブックマークに追加
Kazuki Moriyama
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]]
info-outline

お知らせ

K.DEVは株式会社KDOTにより運営されています。記事の内容や会社でのITに関わる一般的なご相談に専門の社員がお答えしております。ぜひお気軽にご連絡ください。