golang中有限群、有限环接口的声明与实现

这个博客展示了如何在Go语言中实现有限群(如S_3、S_5和C_3)和有限环(如F_8、F_4)的接口和操作,包括群的乘法表、加法表、群元阶的分布等。博客通过定义接口IGroup和IRing来抽象群和环的概念,并提供了如加法、乘法、求阶数和中心等操作。此外,还展示了如何计算群元阶的分布并分析群的性质。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值