20200315

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")  
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章