• こちら
  • 1,2,3,4,5と5要素あったときに、2,3,1,5,4と入れ替えたとすると、1->2->3->1と4->5->4とからできていると考えて、(1,2,3)(4,5)と言う表記をすることができる
  • また、1は2に、2は3に、3は1に、という意味で(1,2),(2,3),(3,1),(4,5),(5,4)と書くこともできる
  • そんな「入れ替え」をハスケルでタイプとして書こうという話
  • さらに、そんな入れ替え演算を繰り返すこともハスケルの関数表記しようという話
  • 巡回群で、(1,2,3,4)が(2,3,4,1)になるのは、ハスケルでは
rotateL (x:xs) = xs ++ [x]
Prelude Math.Combinatorics.Graph Math.Algebra.Group.PermutationGroup> rotateL [1,2,3,4,5]
[2,3,4,5,1]
  • 3通りの作り方がある。どれもPermutation タイプを作る
> fromList [1,5,4,3,2]
[[2,5],[3,4]]
> fromPairs [(1,1),(2,5),(3,4),(4,3),(5,2)]
[[2,5],[3,4]]
> fromCycles [[2,5],[3,4]]
[[2,5],[3,4]]
  • 演算の定義ができる
let p1 = fromList[1,5,4,3,2]
let p2 = fromPairs [(1,1),(2,5),(3,4),(4,3),(5,2)]
p1 == p2
p1 * p2
Prelude Math.Combinatorics.Graph Math.Algebra.Group.PermutationGroup> let p1 = fromList[1,5,4,3,2]
Prelude Math.Combinatorics.Graph Math.Algebra.Group.PermutationGroup> let p2 = fromPairs [(1,1),(2,5),(3,4),(4,3),(5,2)]
Prelude Math.Combinatorics.Graph Math.Algebra.Group.PermutationGroup> p1 == p2
True
Prelude Math.Combinatorics.Graph Math.Algebra.Group.PermutationGroup> p1 * p2
1
Prelude Math.Combinatorics.Graph Math.Algebra.Group.PermutationGroup> :type (p1*p2)
(p1*p2) :: (Show a, Ord a, Num a) => Permutation a
  • 行列表現があっても良さそうだ…。そうすれば演算も逆元も簡単そうだ