mirror of
https://github.com/Luzifer/nginx-sso.git
synced 2024-12-30 01:31:18 +00:00
65 lines
1.3 KiB
Go
65 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]]
|
|
}
|