summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/boombuler/barcode/utils/galoisfield.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/boombuler/barcode/utils/galoisfield.go')
-rw-r--r--vendor/github.com/boombuler/barcode/utils/galoisfield.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/vendor/github.com/boombuler/barcode/utils/galoisfield.go b/vendor/github.com/boombuler/barcode/utils/galoisfield.go
new file mode 100644
index 0000000000..68726fbfde
--- /dev/null
+++ b/vendor/github.com/boombuler/barcode/utils/galoisfield.go
@@ -0,0 +1,65 @@
+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]]
+}