2016年6月27日

日記

なんか置換の初歩的っぽいことでつまってる。 Permutation トレイトを Int から Int への写像 (PartialFunction) として定義する(コードは Scala で書いてる):

trait Permutation extends PartialFunction[Int, Int]

class PermutationImpl(val suffices: Seq[Int]) extends Permutation{
  def isDefinedAt(i: Int): Int = suffices.indice

  /**
    * 置換の2行表記で、上の行の値が与えられたらその下の値を返す
    */
  def apply(i: Int) = suffices(i)
}

PermutationImpl クラスの suffices フィールドは、置換の通常の2行記法での下の段の数字の列で、apply(Int) メソッドは上の段の数字が渡されると下の段の数字を返す:

val p = new PermutationImpl(Seq(3, 1, 0, 2))

assert( p(0) == 3 )
assert( p(1) == 1 )

ここでの p は

  { \displaystyle\begin{align*}
  \begin{pmatrix} 0 & 1 & 2 & 3 \\ 3 & 1 & 0 & 2 \end{pmatrix}
\end{align*}}

という置換に対応する。 念のため。

さて、2つの置換は * 演算子によって合成できるようにする。 これは(通常使われる)合成写像として定義:

class PermutationImpl(val suffices: Seq[Int]) extends Permutation{
  ...
  def *(that: Permutation): Permutation = {
    val thiz = this
    new Permutation{
      def isDefinedAt(i: Int): Boolean = thiz.isDefinedAt(i)
      def apply(i: Int): Int = thiz(that(i))  // thiz と that の apply() メソッドを合成
    }
  }
}

使い方は

val p0 = new PermutationImpl(Seq(3, 1, 0, 2))
val p1 = new PermutationImpl(Seq(1, 2, 0, 3))

val cp = p0 * p1

assert( cp(0) == 1 )
assert( cp(1) == 0 )
assert( cp(2) == 3 )
assert( cp(3) == 2 )

ここまでは普通の数学的な定義を実装してるだけ。 さて、ここで Permutation トレイトに、Seq[E] オブジェクトを受け取ってそれを置換して返すメソッド apply(Seq[E]) を定義してみる:

trait Permutation extends PartialFunction[Int, Int]{
  ...
  def apply[E](seq: Seq[E]): Seq[E] = ???
}

この apply(Seq[E]) メソッドは任意の2つの Permutation オブジェクト p0, p1 と任意の Seq オブジェクト seq について以下の assert 文を満たさないといけないハズ:

val p0: Permutation = ???
val p1: Permutation = ???

val seq: Seq[E] = ???

assert( p0(p1(seq)) == (p0 * p1)(seq) )

さて、この apply(Seq[E]) メソッドはどう実装したらいいのか・・・ ちなみに、apply(Seq[E]) メソッドに Seq(0, 1, 2, 3) を渡すと、コンストラクタに渡された Seq と同じものが返ってきてほしいハズ:

val p = new PermutationImpl(Seq(3, 1, 0, 2) )

assert( p(Seq(0, 1, 2, 3)) == Seq(3, 1, 0, 2) )

こんなの簡単じゃん!って思うでしょ? 簡単かもね。

齋藤正彦線型代数学

齋藤正彦線型代数学

ジョジョで山岸由花子役やってたので、ちょっと能登麻美子さんの web ラジオを聴いてみたのだが、なんか軽くスピリチュアルな話やってて「うーむ」となった。 癒やしボイスで言われると洗脳されるかもw そのうち水素水とか推し出したりして。

ものすごく今更な話、第5部でジョジョが「GIOGIO」なのってイタリア語の関係だったかと思うけど、DIO の子供かもしれない、DIODIO みたいなところもあるのかな? なんのこっちゃ。

ツイート (ツイート数 30)