mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.3 KiB
65 lines
1.3 KiB
package utils |
|
|
|
// GaloisField encapsulates galois field arithmetics |
|
type GaloisField struct { |
|
Size int |
|
Base int |
|
ALogTbl []int |
|
LogTbl []int |
|
} |
|
|
|
// NewGaloisField creates a new galois field |
|
func NewGaloisField(pp, fieldSize, b int) *GaloisField { |
|
result := new(GaloisField) |
|
|
|
result.Size = fieldSize |
|
result.Base = b |
|
result.ALogTbl = make([]int, fieldSize) |
|
result.LogTbl = make([]int, fieldSize) |
|
|
|
x := 1 |
|
for i := 0; i < fieldSize; i++ { |
|
result.ALogTbl[i] = x |
|
x = x * 2 |
|
if x >= fieldSize { |
|
x = (x ^ pp) & (fieldSize - 1) |
|
} |
|
} |
|
|
|
for i := 0; i < fieldSize; i++ { |
|
result.LogTbl[result.ALogTbl[i]] = int(i) |
|
} |
|
|
|
return result |
|
} |
|
|
|
func (gf *GaloisField) Zero() *GFPoly { |
|
return NewGFPoly(gf, []int{0}) |
|
} |
|
|
|
// AddOrSub add or substract two numbers |
|
func (gf *GaloisField) AddOrSub(a, b int) int { |
|
return a ^ b |
|
} |
|
|
|
// Multiply multiplys two numbers |
|
func (gf *GaloisField) Multiply(a, b int) int { |
|
if a == 0 || b == 0 { |
|
return 0 |
|
} |
|
return gf.ALogTbl[(gf.LogTbl[a]+gf.LogTbl[b])%(gf.Size-1)] |
|
} |
|
|
|
// Divide divides two numbers |
|
func (gf *GaloisField) Divide(a, b int) int { |
|
if b == 0 { |
|
panic("divide by zero") |
|
} else if a == 0 { |
|
return 0 |
|
} |
|
return gf.ALogTbl[(gf.LogTbl[a]-gf.LogTbl[b])%(gf.Size-1)] |
|
} |
|
|
|
func (gf *GaloisField) Invers(num int) int { |
|
return gf.ALogTbl[(gf.Size-1)-gf.LogTbl[num]] |
|
}
|
|
|