root@iZ14rcmneyrcltZ:~/cpptest/gotest# go build S3.go
root@iZ14rcmneyrcltZ:~/cpptest/gotest# ./S3
1 2 3 4 5 6
2 3 1 6 4 5
3 1 2 5 6 4
4 5 6 1 2 3
5 6 4 3 1 2
6 4 5 2 3 1
逆序數:
0 2 2 3 1 1
1 2 3
2 3 1
3 1 2
root@iZ14rcmneyrcltZ:~/cpptest/gotest# ./S4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
2 1 8 11 16 15 12 3 23 21 4 7 19 20 6 5 22 24 13 14 10 17 9 18
3 8 1 13 18 14 17 2 21 23 19 22 4 6 20 24 7 5 11 15 9 12 10 16
4 12 14 1 9 13 11 24 5 19 7 2 6 3 21 22 23 20 10 18 15 16 17 8
5 15 17 9 1 16 18 19 4 24 20 21 22 23 2 6 3 7 8 11 12 13 14 10
6 16 13 14 15 1 10 22 20 7 23 24 3 4 5 2 19 21 17 9 18 8 11 12
7 11 18 12 17 10 1 20 22 6 2 4 21 24 19 23 5 3 15 8 13 9 16 14
8 3 2 19 24 20 22 1 10 9 13 17 11 15 14 18 12 16 4 6 23 7 21 5
9 21 23 5 4 22 20 10 1 8 18 15 16 17 12 13 14 11 24 7 2 6 3 19
10 23 21 24 19 7 6 9 8 1 16 14 18 12 17 11 15 13 5 22 3 20 2 4
11 7 20 2 23 19 4 18 16 13 12 1 15 8 10 17 9 14 21 24 6 5 22 3
12 4 24 7 22 21 2 14 17 15 1 11 10 18 13 9 16 8 6 3 19 23 5 20
13 22 6 3 21 4 19 16 18 11 17 8 14 1 9 12 10 15 23 5 20 24 7 2
14 24 4 6 20 3 23 12 15 17 10 16 1 13 18 8 11 9 7 21 5 2 19 22
15 5 19 20 6 2 21 17 14 12 9 18 8 11 16 1 13 10 22 23 24 3 4 7
16 6 22 23 2 5 24 13 11 18 14 10 17 9 1 15 8 12 3 4 7 19 20 21
17 19 5 22 7 23 3 15 12 14 8 13 9 16 11 10 18 1 20 2 4 21 24 6
18 20 7 21 3 24 5 11 13 16 15 9 12 10 8 14 1 17 2 19 22 4 6 23
19 17 15 8 10 11 13 5 24 4 22 3 20 2 23 7 21 6 9 16 14 18 12 1
20 18 11 15 14 8 9 7 6 22 21 5 2 19 24 3 4 23 12 10 16 1 13 17
21 9 10 18 13 12 15 23 3 2 5 20 24 7 22 4 6 19 16 17 8 14 1 11
22 13 16 17 12 9 8 6 7 20 3 19 23 5 4 21 24 2 14 1 11 10 18 15
23 10 9 16 11 17 14 21 2 3 24 6 5 22 7 19 20 4 18 12 1 15 8 13
24 14 12 10 8 18 16 4 19 5 6 23 7 21 3 20 2 22 1 13 17 11 15 9
逆序數:
0 1 1 3 3 5 1 2 4 6 2 2 4 4 4 4 2 2 3 3 5 3 5 3
1 2 3 4 5 6 7 8 9 10 11 12
2 1 4 3 7 11 5 9 8 12 6 10
3 4 1 2 12 9 10 11 6 7 8 5
4 3 2 1 10 8 12 6 11 5 9 7
5 12 10 7 6 1 9 2 4 11 3 8
6 8 11 9 1 5 4 12 7 3 10 2
7 10 12 5 11 2 8 1 3 6 4 9
8 6 9 11 4 10 1 7 12 2 5 3
9 11 8 6 3 12 2 5 10 1 7 4
10 7 5 12 8 4 11 3 1 9 2 6
11 9 6 8 2 7 3 10 5 4 12 1
12 5 7 10 9 3 6 4 2 8 1 11
package main
import (
"fmt"
"os"
)
type S3 struct {
m_a1,m_a2,m_a3 int
}
//能反映元素階的置換表達式("描述折線過程"),區別於雙行置換表達式("描述折線結果")
var g_S3Name []string=[]string{
"I=(1)",
"r=(231)",
"rr=(132)",
"f=(13)",
"fr=(23)",
"frr=(12)"};
//雙行置換表達式
var g_S3 []S3=[]S3{
S3{1,2,3},
S3{2,3,1},
S3{3,1,2},
S3{3,2,1},
S3{1,3,2},
S3{2,1,3}}
func (this *S3) isEqual(a S3) bool {
return (this.m_a1==a.m_a1 && this.m_a2==a.m_a2 && this.m_a3==a.m_a3)
}
func (this *S3) getName() string {
for i:=0;i<6;i++ {
if(this.isEqual(g_S3[i])){
return g_S3Name[i];
}
}
return "Error";
}
func (this *S3) Mul(a S3) S3 {
var aArr[3]int=[3]int{a.m_a1,a.m_a2,a.m_a3}
var ret S3
ret.m_a1=aArr[this.m_a1-1]
ret.m_a2=aArr[this.m_a2-1]
ret.m_a3=aArr[this.m_a3-1]
return ret
}
func (this *S3) InvMul() S3 {
for i:=0;i<6;i++ {
var t S3=this.Mul(g_S3[i])
if(t.isEqual(g_S3[0])){
return g_S3[i]
}
}
return S3{0,0,0}
}
//羣元的逆序數
func (this *S3) Tau() int {
var aArr[3]int=[3]int{this.m_a1,this.m_a2,this.m_a3}
var ret int=0
for i:=0;i<3;i++ {
for j:=i+1;j<3;j++ {
if(aArr[i]>aArr[j]){
ret++
}
}
}
return ret
}
//羣元索引
func (this *S3) Idx(v *[]S3) int {
for i:=0;i<6;i++ {
if(this.isEqual((*v)[i])){
return i
}
}
return -1
}
//羣元的階
func getOrder(idx,m S3) int {
var t S3=idx
for i:=1;i<=6;i++ {
t=t.Mul(m)
if(t.isEqual(idx)){
return i
}
}
return -1
}
func createS3(sOrderForm string) S3 {
for i:=0;i<6;i++ {
if(sOrderForm==g_S3Name[i]){
return g_S3[i]
}
}
return S3{0,0,0}
}
func A3Set()[]S3{
ret:=[]S3{}
for _, v := range g_S3 {
if(v.Tau()%2==0){
ret = append(ret,v)
}
}
return ret
}
func A3MulTable()[][]int{
ret:=[][]int{}
vA3:=A3Set()
m:=len(vA3)
for i:=0;i<m;i++{
I:=[]int{}
for j:=0;j<m;j++{
IJ:=vA3[i].Mul(vA3[j])
ij:=IJ.Idx(&vA3)
I = append(I,ij+1)
}
ret = append(ret,I)
}
return ret
}
func S3MulTable()[][]int{
ret:=[][]int{}
m:=6
for i:=0;i<m;i++{
I:=[]int{}
for j:=0;j<m;j++{
IJ:=g_S3[i].Mul(g_S3[j])
ij:=IJ.Idx(&g_S3)
I = append(I,ij+1)
}
ret = append(ret,I)
}
return ret
}
func PrintMulTable(vv [][]int){
for _, v := range vv {
for _, v2 := range v {
fmt.Printf("%d ",v2)
}
fmt.Println()
}
return
}
func WriteMulTable(vv [][]int,fn string) {
f, err := os.OpenFile(fmt.Sprintf("%s.txt",fn), os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer f.Close()
n:=len(vv)
var buf string
for i:=0;i<n;i++{
for j:=0;j<n;j++{
buf = fmt.Sprintf("%d ",vv[i][j])
f.WriteString(buf)
}
f.WriteString("\n");
}
}
func main() {
vvS3:=S3MulTable()
PrintMulTable(vvS3)
WriteMulTable(vvS3,"S3")
fmt.Println("逆序數:")
for _, v := range g_S3 {
fmt.Printf("%d ",v.Tau())
}
fmt.Println()
vvA3:=A3MulTable()
PrintMulTable(vvA3)
WriteMulTable(vvA3,"A3")
}
package main
import (
"fmt"
"os"
)
type S4 struct {
m_a1,m_a2,m_a3,m_a4 int
}
//能反映元素階的置換表達式("描述折線過程"),區別於雙行置換表達式("描述折線結果")
var g_S4Name []string=[]string{
"(1)",
"(12)",
"(34)",
"(13)",
"(24)",
"(14)",
"(23)",
"(12)(34)",
"(13)(24)",
"(14)(23)",
"(123)",
"(132)",
"(134)",
"(143)",
"(124)",
"(142)",
"(234)",
"(243)",
"(1234)",
"(1243)",
"(1324)",
"(1342)",
"(1423)",
"(1432)"};
//雙行置換表達式
var g_S4 []S4=[]S4{
S4{1,2,3,4},
S4{2,1,3,4},
S4{1,2,4,3},
S4{3,2,1,4},
S4{1,4,3,2},
S4{4,2,3,1},
S4{1,3,2,4},
S4{2,1,4,3},
S4{3,4,1,2},
S4{4,3,2,1},
S4{2,3,1,4},
S4{3,1,2,4},
S4{3,2,4,1},
S4{4,2,1,3},
S4{2,4,3,1},
S4{4,1,3,2},
S4{1,3,4,2},
S4{1,4,2,3},
S4{2,3,4,1},
S4{2,4,1,3},
S4{3,4,2,1},
S4{3,1,4,2},
S4{4,3,1,2},
S4{4,1,2,3}}
func (this *S4) isEqual(a S4) bool {
return (this.m_a1==a.m_a1 && this.m_a2==a.m_a2 && this.m_a3==a.m_a3 && this.m_a4==a.m_a4)
}
func (this *S4) getName() string {
for i:=0;i<24;i++ {
if(this.isEqual(g_S4[i])){
return g_S4Name[i];
}
}
return "Error";
}
func (this *S4) Mul(a S4) S4 {
var aArr[4]int=[4]int{a.m_a1,a.m_a2,a.m_a3,a.m_a4}
var ret S4
ret.m_a1=aArr[this.m_a1-1]
ret.m_a2=aArr[this.m_a2-1]
ret.m_a3=aArr[this.m_a3-1]
ret.m_a4=aArr[this.m_a4-1]
return ret
}
func (this *S4) InvMul() S4 {
for i:=0;i<24;i++ {
var t S4=this.Mul(g_S4[i])
if(t.isEqual(g_S4[0])){
return g_S4[i]
}
}
return S4{0,0,0,0}
}
//羣元的逆序數
func (this *S4) Tau() int {
var aArr[4]int=[4]int{this.m_a1,this.m_a2,this.m_a3,this.m_a4}
var ret int=0
for i:=0;i<4;i++ {
for j:=i+1;j<4;j++ {
if(aArr[i]>aArr[j]){
ret++
}
}
}
return ret
}
//羣元索引
func (this *S4) Idx(v *[]S4) int {
for i:=0;i<24;i++ {
if(this.isEqual((*v)[i])){
return i
}
}
return -1
}
//羣元的階
func getOrder(idx,m S4) int {
var t S4=idx
for i:=1;i<=24;i++ {
t=t.Mul(m)
if(t.isEqual(idx)){
return i
}
}
return -1
}
func createS4(sOrderForm string) S4 {
for i:=0;i<24;i++ {
if(sOrderForm==g_S4Name[i]){
return g_S4[i]
}
}
return S4{0,0,0,0}
}
func A4Set()[]S4{
ret:=[]S4{}
for _, v := range g_S4 {
if(v.Tau()%2==0){
ret = append(ret,v)
}
}
return ret
}
func A4MulTable()[][]int{
ret:=[][]int{}
vA4:=A4Set()
m:=len(vA4)
for i:=0;i<m;i++{
I:=[]int{}
for j:=0;j<m;j++{
IJ:=vA4[i].Mul(vA4[j])
ij:=IJ.Idx(&vA4)
I = append(I,ij+1)
}
ret = append(ret,I)
}
return ret
}
func S4MulTable()[][]int{
ret:=[][]int{}
m:=24
for i:=0;i<m;i++{
I:=[]int{}
for j:=0;j<m;j++{
IJ:=g_S4[i].Mul(g_S4[j])
ij:=IJ.Idx(&g_S4)
I = append(I,ij+1)
}
ret = append(ret,I)
}
return ret
}
func PrintMulTable(vv [][]int){
for _, v := range vv {
for _, v2 := range v {
fmt.Printf("%d ",v2)
}
fmt.Println()
}
return
}
func WriteMulTable(vv [][]int,fn string) {
f, err := os.OpenFile(fmt.Sprintf("%s.txt",fn), os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer f.Close()
n:=len(vv)
var buf string
for i:=0;i<n;i++{
for j:=0;j<n;j++{
buf = fmt.Sprintf("%d ",vv[i][j])
f.WriteString(buf)
}
f.WriteString("\n");
}
}
func test1(n int){
//n:=4
var i,j,k,p int
for i = 1; i <=n; i++ {
for j = 1; j <=n; j++ {
if(i!=j){
for k = 1; k <=n; k++ {
if((k!=i)&&(k!=j)){
for p = 1; p <=n; p++ {
if((p!=i)&&(p!=j)&&(p!=k)){
fmt.Println(i,j,k,p)
}
}
}
}//end for k
}//end for if(i!=j)
}//end for j
}//end for i
}
func main() {
//test1(4)
//var a S4
//fmt.Println(a,a.getName())
vvS4:=S4MulTable()
PrintMulTable(vvS4)
WriteMulTable(vvS4,"S4")
fmt.Println("逆序數:")
for _, v := range g_S4 {
fmt.Printf("%d ",v.Tau())
}
fmt.Println()
vvA4:=A4MulTable()
PrintMulTable(vvA4)
WriteMulTable(vvA4,"A4")
}