Scalaで多項式計算

Table of Contents

1 定数倍

多項式を定数倍した新しい多項式を求める関数 mul は以下のように定義できる.

1:  def mul(b: Int, xs: List[Int]) =
2:    xs.map(b * _)

imulではなく,mul としている点に注意する. ScalaでもJavaと同様に, メソッドの オーバーローディング (多重定義,overloading)が可能である.

2 加算

二つの多項式の和になっている新しい多項式を求める関数 add を作成する.

1:  def add(xs: List[Int], ys: List[Int]): List[Int] =
2:    if (xs.isEmpty)
3:      ys
4:    else if (ys.isEmpty)
5:      xs
6:    else
7:      xs.head + ys.head :: add(xs.tail, ys.tail)

3 乗算

二つの多項式の積になっている新しい多項式を求める関数 mul を作成する.

1:  def mul(xs: List[Int], ys: List[Int]): List[Int] =
2:    if (xs.isEmpty)
3:      Nil
4:    else
5:      add(mul(xs.head, ys), 0 :: mul(xs.tail, ys))

4 プログラム全体

プログラム全体は,以下のようになる.

 1:  object Poly {
 2:    def add(xs: List[Int], ys: List[Int]): List[Int] =
 3:      if (xs.isEmpty)
 4:        ys
 5:      else if (ys.isEmpty)
 6:        xs
 7:      else
 8:        xs.head + ys.head :: add(xs.tail, ys.tail)
 9:  
10:    def mul(b: Int, xs: List[Int]) =
11:      xs.map(b * _)
12:  
13:    def mul(xs: List[Int], ys: List[Int]): List[Int] =
14:      if (xs.isEmpty)
15:        Nil
16:      else
17:        add(mul(xs.head, ys), 0 :: mul(xs.tail, ys))
18:  
19:    def main(args: Array[String]) {
20:      println(mul(2, List(1, -1, 0, 2, -3)))
21:      println(add(List(1, 2, 3), List(1, -2, 3, -4)))
22:      println(mul(List(1, 2, 3), List(1, -2, 3)))
23:    }
24:  }

5 練習問題

  1. 二つの多項式の差を求める述語 diff を作成せよ.
  2. 多項式と整数bが与えられた時, 多項式が単項式 x-b で割り切れるかどうか調べる述語 divisible を作成せよ.
  3. 多項式を微分した新しい多項式を求める述語 deriv を作成せよ.

Date: 2017-09-29 21:45:58 JST

Author: 田村直之

Validate XHTML 1.0