幾種置換表達方式的互轉(golang版本)

D:\go20190906\src\SmallRing>go build Permutation.go
[0x7FEF9EE3C50] ANOMALY: meaningless REX prefix used
# command-line-arguments
[0x7FEF9EE3C50] ANOMALY: meaningless REX prefix used

D:\go20190906\src\SmallRing>Permutation
[0x7FEF9EE3C50] ANOMALY: meaningless REX prefix used
1 2 3 4 5 6
2 3 1 5 6 4
3 1 2 6 4 5
4 6 5 1 3 2
5 4 6 2 1 3
6 5 4 3 2 1
[1 2 3]->()->[[1 0 0] [0 1 0] [0 0 1]]
[2 3 1]->(1,2,3)->[[0 1 0] [0 0 1] [1 0 0]]
[3 1 2]->(1,3,2)->[[0 0 1] [1 0 0] [0 1 0]]
[3 2 1]->(1,3)->[[0 0 1] [0 1 0] [1 0 0]]
[1 3 2]->(2,3)->[[1 0 0] [0 0 1] [0 1 0]]
[2 1 3]->(1,2)->[[0 1 0] [1 0 0] [0 0 1]]
()->[1 2 3]->[[1 0 0] [0 1 0] [0 0 1]]
(2,3)->[1 3 2]->[[1 0 0] [0 0 1] [0 1 0]]
(1,2)->[2 1 3]->[[0 1 0] [1 0 0] [0 0 1]]
(1,2,3)->[2 3 1]->[[0 1 0] [0 0 1] [1 0 0]]
(1,3,2)->[3 1 2]->[[0 0 1] [1 0 0] [0 1 0]]
(1,3)->[3 2 1]->[[0 0 1] [0 1 0] [1 0 0]]
1 2 3 4 5 6 7 8
2 1 4 3 7 8 5 6
3 4 1 2 6 5 8 7
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 3 4 1 2
7 8 5 6 2 1 4 3
8 7 6 5 4 3 2 1
[1 2 3 4]->()->[[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]]
[2 1 3 4]->(1,2)->[[0 1 0 0] [1 0 0 0] [0 0 1 0] [0 0 0 1]]
[1 2 4 3]->(3,4)->[[1 0 0 0] [0 1 0 0] [0 0 0 1] [0 0 1 0]]
[2 1 4 3]->(1,2)(3,4)->[[0 1 0 0] [1 0 0 0] [0 0 0 1] [0 0 1 0]]
[3 4 1 2]->(1,3)(2,4)->[[0 0 1 0] [0 0 0 1] [1 0 0 0] [0 1 0 0]]
[4 3 1 2]->(1,4,2,3)->[[0 0 0 1] [0 0 1 0] [1 0 0 0] [0 1 0 0]]
[3 4 2 1]->(1,3,2,4)->[[0 0 1 0] [0 0 0 1] [0 1 0 0] [1 0 0 0]]
[4 3 2 1]->(1,4)(2,3)->[[0 0 0 1] [0 0 1 0] [0 1 0 0] [1 0 0 0]]
()->[1 2 3 4]->[[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]]
(1,2)->[2 1 3 4]->[[0 1 0 0] [1 0 0 0] [0 0 1 0] [0 0 0 1]]
(3,4)->[1 2 4 3]->[[1 0 0 0] [0 1 0 0] [0 0 0 1] [0 0 1 0]]
(1,2)(3,4)->[2 1 4 3]->[[0 1 0 0] [1 0 0 0] [0 0 0 1] [0 0 1 0]]
(1,3)(2,4)->[3 4 1 2]->[[0 0 1 0] [0 0 0 1] [1 0 0 0] [0 1 0 0]]
(1,4,2,3)->[4 3 1 2]->[[0 0 0 1] [0 0 1 0] [1 0 0 0] [0 1 0 0]]
(1,3,2,4)->[3 4 2 1]->[[0 0 1 0] [0 0 0 1] [0 1 0 0] [1 0 0 0]]

package main

import(
    "fmt"
    "sort"
    "strings"    
    "strconv"    
    "regexp"
)

func PermutationMat(a *[]int16)[][]int16{
    n:=int16(len(*a))
    var ret [][]int16=make([][]int16,n)
    var i int16=0
    var j int16=0    
    for i=0;i<n;i++{
        var v []int16=make([]int16,n)
        J:=(*a)[i]
        for j=0;j<n;j++{
            if(j==J-1){
               v[j]=1
            }else{
               v[j]=0
            }
        }    
        ret[i]=v        
    }
    return ret
}

// GAP4置換表達式->雙行置換表達式
func Str2Perm(s string,n int)[]int16{
    var ret []int16=IdentityPerm(n)
    if(s=="()"){        
        return ret
    }
    ss:=MySplit(s)
    M:=len(ss)
    for i:=0;i<M;i++{
        arr:=strings.Split(ss[i],",")
        N:=len(arr)
        j0:=MyAtoi(arr[0])
        //fmt.Printf("M=%d,i=%d,N=%d,j0=%d\n",M,i,N,j0)        
        for j:=1;j<N;j++{
            idx:=MyAtoi(arr[j-1])
            //fmt.Printf("j=%d,idx=%d\n",j,idx)
            ret[idx-1]=MyAtoi(arr[j])             
        }
        jL:=MyAtoi(arr[len(arr)-1])
        ret[jL-1]=j0
    }    
    return ret
}

func MyAtoi(s string)int16{
    n,r:=strconv.Atoi(s)
    if(r==nil){
     return int16(n)
    } 
    return 0
}

// 截取出包含在()裏面的內容
func MySplit(s string)[]string{
    rex:=regexp.MustCompile("\\((.*?)\\)")
    out:=rex.FindAllStringSubmatch(s,-1)
    var ss []string=make([]string,len(out))
    for k,v :=range out{
       ss[k]=v[1]
    }
    return ss
}

func Deg(s string)int{
    arr:=strings.Split(s,",")
    max:=0
    for _, v := range arr {
       n,r:=strconv.Atoi(v)
       if(r==nil && n>max){
         max=n
        }  
    }
    return max
}

func Degree(s *[]string)int{
    max:=0
    for _, v := range *s {
       n:=Deg(v)
       if(n>max){
         max=n
        }  
    }
    //fmt.Printf("max=%d\n",max)
    return max
}

// 雙行置換表達式->GAP4置換表達式
func Perm2Str(a *[]int16)string{
    I:=IdentityPerm(len(*a))
    bI:=IsEqual(a,&I)
    if(bI){
        return "()"
    }
    var s string=""
    var s1 string=""    
    n:=int16(len(*a))
    var i int16=0    
    var v []int16=[]int16{}
    var set []int16=[]int16{}    
    for{    
        for i=1;i<=n;i++{
            if(getpos(&set,i)==-1){
               set=append(set,i)
                var I int16=(*a)[i-1]
                if(getpos(&set,I)==-1){
                   set=append(set,I)
                }                
                nv:=int16(len(v))            
                if(I!=i){                    
                    if(nv>0 && v[nv-1]==i){
                        v=v[:nv-1]
                    }                    
                    if(getpos(&v,i)==-1){
                       v=append(v,i)
                    }
                    if(getpos(&v,I)==-1){
                       v=append(v,I)
                    }                
                    if(v[0]==(*a)[I-1]){                    
                        break
                    }                    
                }
                nv=int16(len(v))            
                if(int16(len(set))==n){
                   break
                }               
            }
        }
        s1=Vec2Str(&v)
        if(s!="" && s1=="()"){
            s1=""    
        }
        s=s+s1
        v=v[:0]
        if(int16(len(set))==n){
           break
        }
    }
    return s
}

func Vec2Str(v *[]int16)string{
    var s1 string="("
    n:=int16(len(*v))
    var i int16=0
    for ;i<n;i++{
        s1=s1+fmt.Sprintf("%d",(*v)[i])
        if(i<n-1){
            s1=s1+","
        }
    }
    s1=s1+")"
    return s1
}

func getpos(v *[]int16,a int16)int16{
    n:=int16(len(*v))
    var i int16=0
    for ;i<n;i++{
        if((*v)[i]==a){
            return i
        }
    }
    return -1    
}

func IdentityPerm(n int)[]int16{
    var c []int16=make([]int16,n)
    for i:=0;i<n;i++{
        c[i]=int16(i+1)
    }
    return c    
}

func IsEqual(a *[]int16,b *[]int16)bool{
    na:=len(*a)
    nb:=len(*b)
    if(na!=nb){
      return false
    }
    var i int16=0
    for ;i<int16(na);i++{
        if((*a)[i]!=(*b)[i]){
            return false
        }
    }
    return true
}

// 滿足sort包的sort.Interface接口
type int16s []int16
func (s int16s)Len()int {return len(s)}
func (s int16s)Less(i,j int)bool {return s[i]<s[j]}
func (s int16s)Swap(i,j int) {s[i],s[j]=s[j],s[i]}

func IsPerm(a []int16)bool{
    //sort.Ints(a)
    sort.Sort(int16s(a))
    I:=IdentityPerm(len(a))
    bI:=IsEqual(&a,&I)
    return bI
/*
    n:=int16(len(a))
    var i int16=0
    for ;i<n;i++{
        if(a[i]!=i+1){
            return false
        }
    }
    return true
*/    
}

func Mul(a *[]int16,b *[]int16)[]int16{
    na:=len(*a)
    nb:=len(*b)
    if(na!=nb){
      return []int16{}
    }
    var c []int16=make([]int16,na)
    for i:=0;i<na;i++{
        c[i]=(*a)[(*b)[i]-1]
    }
    return c
}

func getidx(vv *[][]int16,a *[]int16)int16{
    n:=len(*vv)
    na:=len(*a)
    for i:=0;i<n;i++{
        if(len((*vv)[i])==na){
            bFind:=true
            for j:=0;j<na;j++{
                if((*vv)[i][j]!=(*a)[j]){
                   bFind=false
                   break
                }
            }
            if(bFind){
               return int16(i)
            }
        }
    }
    return -1
}

func TableByPermuteSet(FG *[][]int16)[][]int16{
    n:=len(*FG)
    var vv [][]int16=make([][]int16,n)    
    for i:=0;i<n;i++{
        var v []int16=make([]int16,n)    
        for j:=0;j<n;j++{
            ij:=Mul(&(*FG)[i],&(*FG)[j])
            v[j]=getidx(FG,&ij)+1
        }
        vv[i]=v
    }    
    return vv
}


func printTable(vv *[][]int16){
   n:=len(*vv)  
   for i:=0;i<n;i++{
       for j:=0;j<n;j++{
          fmt.Printf("%d ",(*vv)[i][j]) 
       } 
       fmt.Printf("\n")       
   }
}

func main() {
    //a:=[]int16{1,4,2}
    //ret:=IsPerm(a)
    //fmt.Printf("%v %v\n",a,ret)
    
    var s3 [][]int16=[][]int16{{1,2,3},{2,3,1},{3,1,2},{3,2,1},{1,3,2},{2,1,3}}
    S3:=TableByPermuteSet(&s3)
    printTable(&S3)
    
    n:=len(s3)
    for i:=0;i<n;i++{
      fmt.Printf("%v->%v->%v\n",s3[i],Perm2Str(&s3[i]),PermutationMat(&s3[i])) 
    } 
    
    var sd3 []string=[]string{"()","(2,3)","(1,2)","(1,2,3)","(1,3,2)","(1,3)"}
    n=len(sd3)
    d:=Degree(&sd3)
    for i:=0;i<n;i++{
      d3Perm:=Str2Perm(sd3[i],d)
      fmt.Printf("%v->%v->%v\n",sd3[i],d3Perm,PermutationMat(&d3Perm)) 
    }     
    
    var d4 [][]int16=[][]int16{{1,2,3,4},{2,1,3,4},{1,2,4,3},{2,1,4,3},{3,4,1,2},{4,3,1,2},{3,4,2,1},{4,3,2,1}}
    D4:=TableByPermuteSet(&d4)
    printTable(&D4)
    
    n=len(d4)    
    for i:=0;i<n;i++{
      fmt.Printf("%v->%v->%v\n",d4[i],Perm2Str(&d4[i]),PermutationMat(&d4[i])) 
    }     
    
    var sd4 []string=[]string{"()","(1,2)","(3,4)","(1,2)(3,4)","(1,3)(2,4)","(1,4,2,3)","(1,3,2,4)","(1,4)(2,3)"}
    n=len(sd4)
    d=Degree(&sd4)    
    for i:=0;i<n;i++{
      d4Perm:=Str2Perm(sd4[i],d)      
      fmt.Printf("%v->%v->%v\n",sd4[i],Str2Perm(sd4[i],d),PermutationMat(&d4Perm)) 
    }     
    
}

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