羣論小工具calG.exe的golang版本

應用例子1:M9/[45,72]=G36,M9的所有2、3階子羣都不是正規子羣,
M9的18 階換位子羣: [1 4 6 12 21 26 27 28 29 30 34 36 47 48 58 59 62 72]是M9'=GAP4[18,4]=G18_5=(C_3×C_3):C_2,秩=3,是S_6的子羣,這個18階半直積羣可以用M9'來表示。
M9的1個36 階正規子羣的生成元集合:[45 72]
命令行參數爲./calG M9.txt 45,72
S(M9):
中心: 1 ,射影中心: 72 ,換位子羣: 18 ,射影換位子羣: 4
[45 72] => 36 階正規子羣 
G36有1個1階元,9個2階元,8個3階元,18個4階元,0個6階元,0個9階元,0個12階元,0個18階元,0個36階元
S(G36):
中心: 1 ,射影中心: 36 ,換位子羣: 9 ,射影換位子羣: 4
root@iZ14rcmneyrcltZ:~/cpptest/gotest# go build calG.go
root@iZ14rcmneyrcltZ:~/cpptest/gotest# ./calG A3.txt
G3ElementToOrder(0)=1
G3ElementToOrder(1)=3
G3ElementToOrder(2)=3
G3有1個1階元,2個3階元
root@iZ14rcmneyrcltZ:~/cpptest/gotest# ./calG
請輸入羣A凱萊表文件名:M9.txt
G72ElementToOrder(0)=1
G72ElementToOrder(1)=4
G72ElementToOrder(2)=4
G72ElementToOrder(3)=2
G72ElementToOrder(4)=4
G72ElementToOrder(5)=2
G72ElementToOrder(6)=4
G72ElementToOrder(7)=4
G72ElementToOrder(8)=4
G72ElementToOrder(9)=4
G72ElementToOrder(10)=4
G72ElementToOrder(11)=3
G72ElementToOrder(12)=4
G72ElementToOrder(13)=4
G72ElementToOrder(14)=4
G72ElementToOrder(15)=4
G72ElementToOrder(16)=4
G72ElementToOrder(17)=4
G72ElementToOrder(18)=4
G72ElementToOrder(19)=4
G72ElementToOrder(20)=3
G72ElementToOrder(21)=4
G72ElementToOrder(22)=4
G72ElementToOrder(23)=4
G72ElementToOrder(24)=4
G72ElementToOrder(25)=2
G72ElementToOrder(26)=2
G72ElementToOrder(27)=2
G72ElementToOrder(28)=2
G72ElementToOrder(29)=2
G72ElementToOrder(30)=4
G72ElementToOrder(31)=4
G72ElementToOrder(32)=4
G72ElementToOrder(33)=3
G72ElementToOrder(34)=4
G72ElementToOrder(35)=2
G72ElementToOrder(36)=4
G72ElementToOrder(37)=4
G72ElementToOrder(38)=4
G72ElementToOrder(39)=4
G72ElementToOrder(40)=4
G72ElementToOrder(41)=4
G72ElementToOrder(42)=4
G72ElementToOrder(43)=4
G72ElementToOrder(44)=4
G72ElementToOrder(45)=4
G72ElementToOrder(46)=3
G72ElementToOrder(47)=2
G72ElementToOrder(48)=4
G72ElementToOrder(49)=4
G72ElementToOrder(50)=4
G72ElementToOrder(51)=4
G72ElementToOrder(52)=4
G72ElementToOrder(53)=4
G72ElementToOrder(54)=4
G72ElementToOrder(55)=4
G72ElementToOrder(56)=4
G72ElementToOrder(57)=3
G72ElementToOrder(58)=3
G72ElementToOrder(59)=4
G72ElementToOrder(60)=4
G72ElementToOrder(61)=3
G72ElementToOrder(62)=4
G72ElementToOrder(63)=4
G72ElementToOrder(64)=4
G72ElementToOrder(65)=4
G72ElementToOrder(66)=4
G72ElementToOrder(67)=4
G72ElementToOrder(68)=4
G72ElementToOrder(69)=4
G72ElementToOrder(70)=4
G72ElementToOrder(71)=3
G72有1個1階元,9個2階元,8個3階元,54個4階元,0個6階元,0個8階元,0個9階元,0個12階元,0個18階元,0個24階元,0個36階元,0個72階元

// 根據羣的凱萊表分析其結構的小工具calG.exe
package main
 
import (
    "fmt"
    "os"
    "io/ioutil"    
    "strings"
    "strconv"
    "math"    
)

func ReadAll(filePth string) ([]byte, error) {
 f, err := os.Open(filePth)
 if err != nil {
  return nil, err
 }
 return ioutil.ReadAll(f)
}

func CharArrToStr(v* []byte)string {
    return string((*v)[:])
}

func CharArrToNormal(v* []byte)[]byte {
    ret := []byte{}
    n:=len(*v)
    for i:=0;i<n;i++ {    
        if((*v)[i]==32||(*v)[i]==13||(*v)[i]==10){
            if(len(ret)>0 && ret[len(ret)-1]!=','){
                ret=append(ret,',')
            }
        }else{
            ret=append(ret,(*v)[i])
        }
    }        
    return ret
}

func IsLegalMtx(mtx* [][]int)[]int {
    ret := []int{0,0,0}
    illegal:=-1
    ret[1]=len(*mtx)
    if(ret[1]==0){
        ret[0]=illegal//不是合法矩陣
        return ret
    }
    ret[2]=len((*mtx)[0])
    if(ret[2]==0){
        ret[0]=illegal//不是合法矩陣
        return ret
    }
    for i:=1;i<ret[1];i++{
        if(len((*mtx)[i])!=ret[2]){
            ret[0]=illegal//不是合法矩陣
            return ret
        }
    }
    ret[0]=0//是合法矩陣
    return ret
}

func atoTable(strMtx string)[][]int {
    vvMtx:=[][]int{}
    iAll:=[]int{}
    if(strMtx!=""){    
        if(strMtx[len(strMtx)-1]==','){    
            strMtx=string(strMtx[0:len(strMtx)-1])
        }
        All:=strings.Split(strMtx,",")
        for i:=0;i<len(All);i++ {
            iElem,_:=strconv.Atoi(All[i])
            iAll=append(iAll,iElem)
        }
    }
    n:=len(iAll)
    n1:=int(math.Sqrt(float64(n)))
    if(n1*n1==n){
        for i:=0;i<n1;i++ {
            iRow:=[]int{}
            for j:=0;j<n1;j++ {
                iElem:=iAll[i*n1+j]
                iRow=append(iRow,iElem)
            }
            vvMtx=append(vvMtx,iRow)
        }
    }
    return vvMtx
}

func ABmul(A* [][]int,B* [][]int)[][]int {
    C:=[][]int{}
    AFlag:=IsLegalMtx(A)
    if(AFlag[0]==-1){
        return C
    }
    BFlag:=IsLegalMtx(B)
    if(BFlag[0]==-1){
        return C
    }
    nB:=BFlag[1]
    n:=AFlag[1]*BFlag[1]

    for a:=0;a<n;a++{
        iRow:=[]int{}
        for b:=0;b<n;b++{
            aj:=a%nB
            ai:=a/nB
            bj:=b%nB
            bi:=b/nB
            i:=(*A)[ai][bi]-1
            j:=(*A)[aj][bj]-1
            c:=nB*i+j+1
            iRow=append(iRow,c)
        }
        C=append(C,iRow)
    }
    return C
}

func Factors(n int)[]int {
    ret := []int{}
    if(n<1){
        return ret
    }
    for i:=1;i<=n;i++{
        if(n%i==0){
            ret=append(ret,i)
        }
    }
    return ret
}

// 未知n階羣的羣元的階
func getGnEOrder(A* [][]int,a int)int {
    AFlag:=IsLegalMtx(A)
    if(AFlag[0]==-1){
        return -1
    }
    n:=AFlag[1]
    if(a<0||a>=n){
        return -1
    }
    t:=0
    for i:=1;i<=n;i++{
        t=(*A)[t][a]-1
        if(t==0){
            return i
        }
    }
    return -1
}

func main() {
    var filePth string
    if(len(os.Args)<2){
        fmt.Printf("請輸入羣A凱萊表文件名:")
        fmt.Scanf("%s",&filePth)
    }else{
        filePth=os.Args[1]
    }

    //filePth="M9.txt"
    ret, _ := ioutil.ReadFile(filePth)
    //ret, _ :=ReadAll(filePth)
    A:=CharArrToNormal(&ret)
    strA:=CharArrToStr(&A)    
    vvA:=atoTable(strA)
    AFlag:=IsLegalMtx(&vvA)
    vOrders:=Factors(AFlag[1])
    vCounts:=make([]int,AFlag[1]+1)
    for i:=0;i<AFlag[1];i++ {
        ord:=getGnEOrder(&vvA,i)
        fmt.Printf("G%dElementToOrder(%d)=%d\n",AFlag[1],i,ord);
        vCounts[ord]=vCounts[ord]+1
    }    
    var strF string
    strF = fmt.Sprintf("G%d有",AFlag[1])
    for i:=0;i<len(vOrders);i++{
        strF += fmt.Sprintf("%d個%d階元,",vCounts[vOrders[i]],vOrders[i])
    }
    if(len(strF)>2){
        strF=string(strF[0:len(strF)-1])
    }
    fmt.Println(strF)
}

 

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