D:\go20190906\src\SmallRing>go build IGroup.go
[0x7FEF9B73C50] ANOMALY: meaningless REX prefix used
# command-line-arguments
[0x7FEF9B73C50] ANOMALY: meaningless REX prefix used
D:\go20190906\src\SmallRing>IGroup
[0x7FEF9B73C50] ANOMALY: meaningless REX prefix used
GAP[6,1]=S_3:
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
群GAP[6,1]的不变量:N0= [1 3 3 2 2 2] ,bA= 0 ,bC= [] ,Z= [0]
[0 1 2] 是正规子群
[0 3] 不是正规子群
GAP[3,1]=C_3:
1 2 3
2 3 1
3 1 2
群GAP[3,1]的不变量:N0= [1 3 3] ,bA= 1 ,bC= [1 2] ,Z= [0 1 2]
群GAP[120,34]的不变量:N0= [1 2 2 3 3 2 2 2 3 4 4 3 3 4 2 3 2 4 4 3 3 2 4 2 2 2 2 6 6 2 3 6 4 5 5 4 4 5 3 4 6 5 5 4 4 3 5
6 3 6 4 5 5 4 2 2 3 4 4 3 2 6 4 5 5 6 6 2 5 4 6 5 4 5 3 4 6 5 3 4 2 3 2 4 4 5 2 6 6 5 5 6 6 5 2 4 5 4 4 3 5 6 4 3 3 2 4
2 5 4 6 2 5 6 6 5 5 6 4 2] ,bA= 0 ,bC= [] ,Z= [0]
package main
import "fmt"
func getidx(v *[]int,id int)int{
n:=len(*v)
for i:=0;i<n;i++{
if((*v)[i]==id){
return i
}
}
return -1
}
//接口的定义
type IGroup interface {
printTable()
mul(a,b int)int
size()int
inv(a int)int
}
func printGroup(g IGroup){
n:=g.size()
for i:=0;i<n;i++{
for j:=0;j<n;j++{
ij:=g.mul(i,j)
fmt.Printf("%d ",ij+1)
}
fmt.Printf("\n")
}
}
// 群元的阶
func getGOrder(g IGroup,a int)int{
n:=g.size()
if(a<0||a>=n){
return -1
}
t:=0
for i:=1;i<=n;i++{
t=g.mul(t,a)
if(t==0){
return i
}
}
return -1
}
// 未经排序的群元阶的分布
func calN0(g IGroup)[]int{
ret:=[]int{}
n:=g.size()
for i:=0;i<n;i++{
ord:=getGOrder(g,i)
ret=append(ret,ord)
}
return ret
}
func issubgroup(g IGroup,v *[]int,id int)bool{
if(getidx(v,id)==-1){
return false
}
n:=len(*v)
// 乘法封闭性
for i:=0;i<n;i++{
for j:=i;j<n;j++{
ij:=g.mul((*v)[i],(*v)[j])
ji:=g.mul((*v)[j],(*v)[i])
if(getidx(v,ij)==-1){
return false
}
if(getidx(v,ji)==-1){
return false
}
}
}
// 有乘法逆元
for i:=0;i<n;i++{
iinv:=g.inv((*v)[i])
if(getidx(v,iinv)==-1){
return false
}
}
// id是乘法单位元
for i:=0;i<n;i++{
if(g.mul(id,(*v)[i])!=(*v)[i] || g.mul((*v)[i],id)!=(*v)[i]){
return false
}
}
return true
}
//0是正规子群
//1是子群但不是正规子群
//2不是子群
func isnormalsubgroup(g IGroup,v *[]int,id int)int{
if(!issubgroup(g,v,id)){
return 2
}
n:=g.size()
nv:=len(*v)
// 进一步判断是否是正规子群
for i:=0;i<n;i++{
for j:=0;j<nv;j++{
ghg1:=g.mul(g.mul(i,(*v)[j]),g.inv(i))
if(getidx(v,ghg1)==-1){
return 1
}
}