2013-12-13 12:53:27 +00:00
|
|
|
package utils
|
|
|
|
|
2014-08-11 09:11:24 +00:00
|
|
|
// GaloisField encapsulates galois field arithmetics
|
2013-12-13 12:53:27 +00:00
|
|
|
type GaloisField struct {
|
|
|
|
ALogTbl []int
|
|
|
|
LogTbl []int
|
|
|
|
}
|
|
|
|
|
2014-08-11 09:11:24 +00:00
|
|
|
// NewGaloisField creates a new falois field
|
2013-12-13 12:53:27 +00:00
|
|
|
func NewGaloisField(pp int) *GaloisField {
|
|
|
|
result := new(GaloisField)
|
|
|
|
fldSize := 256
|
|
|
|
|
|
|
|
result.ALogTbl = make([]int, fldSize)
|
|
|
|
result.LogTbl = make([]int, fldSize)
|
|
|
|
|
|
|
|
x := 1
|
|
|
|
for i := 0; i < fldSize; i++ {
|
|
|
|
result.ALogTbl[i] = x
|
|
|
|
x = x * 2
|
|
|
|
if x >= fldSize {
|
|
|
|
x = (x ^ pp) & (fldSize - 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < fldSize; i++ {
|
|
|
|
result.LogTbl[result.ALogTbl[i]] = int(i)
|
|
|
|
}
|
|
|
|
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2014-08-11 09:11:24 +00:00
|
|
|
// AddOrSub add or substract two numbers
|
2013-12-13 12:53:27 +00:00
|
|
|
func (gf *GaloisField) AddOrSub(a, b int) int {
|
|
|
|
return a ^ b
|
|
|
|
}
|
|
|
|
|
2014-08-11 09:11:24 +00:00
|
|
|
// Multiply multiplys two numbers
|
2013-12-13 12:53:27 +00:00
|
|
|
func (gf *GaloisField) Multiply(a, b int) int {
|
|
|
|
if a == 0 || b == 0 {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return gf.ALogTbl[(gf.LogTbl[a]+gf.LogTbl[b])%255]
|
|
|
|
}
|
|
|
|
|
2014-08-11 09:11:24 +00:00
|
|
|
// Divide divides two numbers
|
2013-12-13 12:53:27 +00:00
|
|
|
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])%255]
|
|
|
|
}
|