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