mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-29 21:26:10 +01:00
66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
|
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]]
|
||
|
}
|