egison-5.0.0: lib/math/algebra/group.egi
def evenAndOddPermutations (n: Integer) : ([Integer -> Integer], [Integer -> Integer]) :=
let (es, os) := evenAndOddPermutations' n
in (map 1#(\i -> nth i $1) es, map 1#(\i -> nth i $1) os)
def evenAndOddPermutations0 (n : Integer) : ([Integer -> Integer], [Integer -> Integer]) :=
let (es, os) := evenAndOddPermutations' n
in ( map 1#(\i -> nth (i + 1) (map 1#($1 - 1) $1)) es
, map 1#(\i -> nth (i + 1) (map 1#($1 - 1) $1)) os )
def evenAndOddPermutations' (n: Integer) : ([[Integer]], [[Integer]]) :=
match n as integer with
| #1 -> ([[1]], [])
| #2 -> ([[1, 2]], [[2, 1]])
| _ ->
let (es, os) := evenAndOddPermutations' (n - 1)
es' := map (++ [n]) es
os' := map (++ [n]) os
in ( es' ++ concat
(map
(\i -> map (permutate i n) os')
(between 1 (n - 1)))
, os' ++ concat
(map
(\i -> map (permutate i n) es')
(between 1 (n - 1))) )
def permutate {Eq a} (x: a) (y: a) (xs: [a]) : [a] :=
match xs as list eq with
| $hs ++ #x :: $ms ++ #y :: $ts -> hs ++ y :: ms ++ x :: ts
| $hs ++ #y :: $ms ++ #x :: $ts -> hs ++ x :: ms ++ y :: ts