应用例子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)
}