package main
import "fmt"
//Prints the complete cayley table for the symmetric group S3
func main( ) {
//Define S3
type trans func( [ ] int ) [ ] int
e := func( x [ ] int ) [ ] int {
y := make( [ ] int , 3 )
copy( y, x)
return y
}
a := func( x [ ] int ) [ ] int {
y := make( [ ] int , 3 )
copy( y, x)
y[ 0 ] , y[ 1 ] = y[ 1 ] , y[ 0 ]
return y
}
b := func( x [ ] int ) [ ] int {
y := make( [ ] int , 3 )
copy( y, x)
y[ 1 ] , y[ 2 ] = y[ 2 ] , y[ 1 ]
return y
}
ab := func( x [ ] int ) [ ] int { return a( b( x) ) }
ba := func( x [ ] int ) [ ] int { return b( a( x) ) }
aba := func( x [ ] int ) [ ] int { return a( b( a( x) ) ) }
s3 := [ ] trans{ e, a, b, ab, ba, aba}
//Provides an easy way to print an element's name when applied to [1,2,3]
tree := map[ int ] map[ int ] string{
1 : map[ int ] string{ 2 : "e" , 3 : "b" } ,
2 : map[ int ] string{ 1 : "a" , 3 : "ba" } ,
3 : map[ int ] string{ 1 : "ab" , 2 : "aba" } ,
}
name := func( x [ ] int ) string { return tree[ x[ 0 ] ] [ x[ 1 ] ] }
//Print cayley table
x := [ ] int { 1 , 2 , 3 }
for _, elem1 := range s3 {
for _, elem2 := range s3 {
p := elem1( x)
q := elem2( x)
r := elem1( q)
fmt.Println ( name( p) , "*" , name( q) , "=" , name( r) )
}
}
}
cGFja2FnZSBtYWluCgppbXBvcnQgImZtdCIKCi8vUHJpbnRzIHRoZSBjb21wbGV0ZSBjYXlsZXkgdGFibGUgZm9yIHRoZSBzeW1tZXRyaWMgZ3JvdXAgUzMKZnVuYyBtYWluKCkgewoJLy9EZWZpbmUgUzMKCXR5cGUgdHJhbnMgZnVuYyhbXWludCkgW11pbnQKCWUgOj0gZnVuYyh4IFtdaW50KSBbXWludCB7CgkJeSA6PSBtYWtlKFtdaW50LCAzKQoJCWNvcHkoeSwgeCkKCQlyZXR1cm4geQoJfQoJYSA6PSBmdW5jKHggW11pbnQpIFtdaW50IHsKCQl5IDo9IG1ha2UoW11pbnQsIDMpCgkJY29weSh5LCB4KQoJCXlbMF0sIHlbMV0gPSB5WzFdLCB5WzBdCgkJcmV0dXJuIHkKCX0KCWIgOj0gZnVuYyh4IFtdaW50KSBbXWludCB7CgkJeSA6PSBtYWtlKFtdaW50LCAzKQoJCWNvcHkoeSwgeCkKCQl5WzFdLCB5WzJdID0geVsyXSwgeVsxXQoJCXJldHVybiB5Cgl9CglhYiA6PSBmdW5jKHggW11pbnQpIFtdaW50IHsgcmV0dXJuIGEoYih4KSkgfQoJYmEgOj0gZnVuYyh4IFtdaW50KSBbXWludCB7IHJldHVybiBiKGEoeCkpIH0KCWFiYSA6PSBmdW5jKHggW11pbnQpIFtdaW50IHsgcmV0dXJuIGEoYihhKHgpKSkgfQoKCXMzIDo9IFtddHJhbnN7ZSwgYSwgYiwgYWIsIGJhLCBhYmF9CgoJLy9Qcm92aWRlcyBhbiBlYXN5IHdheSB0byBwcmludCBhbiBlbGVtZW50J3MgbmFtZSB3aGVuIGFwcGxpZWQgdG8gWzEsMiwzXQoJdHJlZSA6PSBtYXBbaW50XW1hcFtpbnRdc3RyaW5newoJCTE6IG1hcFtpbnRdc3RyaW5nezI6ICJlIiwgMzogImIifSwKCQkyOiBtYXBbaW50XXN0cmluZ3sxOiAiYSIsIDM6ICJiYSJ9LAoJCTM6IG1hcFtpbnRdc3RyaW5nezE6ICJhYiIsIDI6ICJhYmEifSwKCX0KCW5hbWUgOj0gZnVuYyh4IFtdaW50KSBzdHJpbmcgeyByZXR1cm4gdHJlZVt4WzBdXVt4WzFdXSB9CgoJLy9QcmludCBjYXlsZXkgdGFibGUKCXggOj0gW11pbnR7MSwgMiwgM30KCWZvciBfLCBlbGVtMSA6PSByYW5nZSBzMyB7CgkJZm9yIF8sIGVsZW0yIDo9IHJhbmdlIHMzIHsKCQkJcCA6PSBlbGVtMSh4KQoJCQlxIDo9IGVsZW0yKHgpCgkJCXIgOj0gZWxlbTEocSkKCQkJZm10LlByaW50bG4obmFtZShwKSwgIioiLCBuYW1lKHEpLCAiPSIsIG5hbWUocikpCgkJfQoJfQp9Cg==