有限循環環mZ/nZ的加法、乘法運算表(golang版本)

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

D:\go20190906\src\SmallRing>SmallRing.exe
[0x7FEF97D3C50] ANOMALY: meaningless REX prefix used
模8剩餘類環Z/(8)={[0],[1],[2],[3],[4],[5],[6],[7]}:
[R8Add]
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
[R8Mul]
1 1 1 1 1 1 1 1
1 2 3 4 5 6 7 8
1 3 5 7 1 3 5 7
1 4 7 2 5 8 3 6
1 5 1 5 1 5 1 5
1 6 3 8 5 2 7 4
1 7 5 3 1 7 5 3
1 8 7 6 5 4 3 2
Z/(64)的一個8階子環M_8=8Z/64Z={[0],[8],[16],[24],[32],[40],[48],[56]}:
[R8Add]
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
[R8Mul]
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Z/(16)的一個8階子環2Z/16Z={[0],[2],[4],[6],[8],[10],[12],[14]}:
[R8Add]
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
[R8Mul]
1 1 1 1 1 1 1 1
1 3 5 7 1 3 5 7
1 5 1 5 1 5 1 5
1 7 5 3 1 7 5 3
1 1 1 1 1 1 1 1
1 3 5 7 1 3 5 7
1 5 1 5 1 5 1 5
1 7 5 3 1 7 5 3
Z/(12)的一個6階子環2Z/12Z={[0],[2],[4],[6],[8],[10]}:
[R6Add]
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5
[R6Mul]
1 1 1 1 1 1
1 3 5 1 3 5
1 5 3 1 5 3
1 1 1 1 1 1
1 3 5 1 3 5
1 5 3 1 5 3
Z/(18)的一個6階子環3Z/18Z={[0],[3],[6],[9],[12],[15]}:
[R6Add]
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5
[R6Mul]
1 1 1 1 1 1
1 4 1 4 1 4
1 1 1 1 1 1
1 4 1 4 1 4
1 1 1 1 1 1
1 4 1 4 1 4
模4剩餘類環Z/(4)={[0],[1],[2],[3]}:
[R4Add]
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
[R4Mul]
1 1 1 1
1 2 3 4
1 3 1 3
1 4 3 2

package main

import (
    "fmt"
)

var g_Z8Mul[][]int=[][]int{
    {0,0,0,0,0,0,0,0},
    {0,1,2,3,4,5,6,7},
    {0,2,4,6,0,2,4,6},
    {0,3,6,1,4,7,2,5},
    {0,4,0,4,0,4,0,4},
    {0,5,2,7,4,1,6,3},
    {0,6,4,2,0,6,4,2},
    {0,7,6,5,4,3,2,1},
}

// 模m加
func addmodm(a int,b int,m int)int{
    return (a+b)%m
}

// 模m乘
func mulmodm(a int,b int,m int)int{
    return (a*b)%m
}

func getIdx(Set []int,a int)int{
   for k,v:=range Set{
       if(v==a){
          return k
       }
   }
   return -1  
}

func ZnTable(Set []int,m int,add func(int,int,int)(int),mul func(int,int,int)(int))([][]int,[][]int){
    A:=[][]int{}    
    n:=len(Set)
    for i:=0;i<n;i++{
        I:=[]int{}
        for j:=0;j<n;j++{
            ij:=add(Set[i],Set[j],m)
            I=append(I,getIdx(Set,ij)+1)
        }
        A=append(A,I)
    }    
    M:=[][]int{}    
    for i:=0;i<n;i++{
        I:=[]int{}
        for j:=0;j<n;j++{
            ij:=mul(Set[i],Set[j],m)
            I=append(I,getIdx(Set,ij)+1)
        }
        M=append(M,I)
    }
    return    A,M
}

func PrintRingTable(A [][]int,M [][]int){
    n:=len(A)
    fmt.Printf("[R%dAdd]\n",n)    
    for i:=0;i<n;i++{
        for j:=0;j<n;j++{
            fmt.Printf("%d ",A[i][j])
        }
        fmt.Println("")
    }    
    n=len(M)    
    fmt.Printf("[R%dMul]\n",n)    
    for i:=0;i<n;i++{
        for j:=0;j<n;j++{
            fmt.Printf("%d ",M[i][j])
        }
        fmt.Println("")
    }    
}

func main() {
    fmt.Printf("模8剩餘類環Z/(8)={[0],[1],[2],[3],[4],[5],[6],[7]}:\n")    
    A,M:=ZnTable([]int{0,1,2,3,4,5,6,7},8,addmodm,mulmodm)
    PrintRingTable(A,M)
    
    fmt.Printf("Z/(64)的一個8階子環M_8=8Z/64Z={[0],[8],[16],[24],[32],[40],[48],[56]}:\n")    
    A,M=ZnTable([]int{0,8,16,24,32,40,48,56},64,addmodm,mulmodm)
    PrintRingTable(A,M)    
    
    fmt.Printf("Z/(16)的一個8階子環2Z/16Z={[0],[2],[4],[6],[8],[10],[12],[14]}:\n")    
    A,M=ZnTable([]int{0,2,4,6,8,10,12,14},16,addmodm,mulmodm)
    PrintRingTable(A,M)    

    fmt.Printf("Z/(12)的一個6階子環2Z/12Z={[0],[2],[4],[6],[8],[10]}:\n")    
    A,M=ZnTable([]int{0,2,4,6,8,10},12,addmodm,mulmodm)
    PrintRingTable(A,M)
    
    fmt.Printf("Z/(18)的一個6階子環3Z/18Z={[0],[3],[6],[9],[12],[15]}:\n")    
    A,M=ZnTable([]int{0,3,6,9,12,15},18,addmodm,mulmodm)
    PrintRingTable(A,M)    
    
    fmt.Printf("模4剩餘類環Z/(4)={[0],[1],[2],[3]}:\n")    
    A,M=ZnTable([]int{0,1,2,3},4,addmodm,mulmodm)
    PrintRingTable(A,M)    
}

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