1//+build ignore 2 3package main 4 5import ( 6 "fmt" 7) 8 9var logTable = [fieldSize]int16{ 10 -1, 0, 1, 25, 2, 50, 26, 198, 11 3, 223, 51, 238, 27, 104, 199, 75, 12 4, 100, 224, 14, 52, 141, 239, 129, 13 28, 193, 105, 248, 200, 8, 76, 113, 14 5, 138, 101, 47, 225, 36, 15, 33, 15 53, 147, 142, 218, 240, 18, 130, 69, 16 29, 181, 194, 125, 106, 39, 249, 185, 17 201, 154, 9, 120, 77, 228, 114, 166, 18 6, 191, 139, 98, 102, 221, 48, 253, 19 226, 152, 37, 179, 16, 145, 34, 136, 20 54, 208, 148, 206, 143, 150, 219, 189, 21 241, 210, 19, 92, 131, 56, 70, 64, 22 30, 66, 182, 163, 195, 72, 126, 110, 23 107, 58, 40, 84, 250, 133, 186, 61, 24 202, 94, 155, 159, 10, 21, 121, 43, 25 78, 212, 229, 172, 115, 243, 167, 87, 26 7, 112, 192, 247, 140, 128, 99, 13, 27 103, 74, 222, 237, 49, 197, 254, 24, 28 227, 165, 153, 119, 38, 184, 180, 124, 29 17, 68, 146, 217, 35, 32, 137, 46, 30 55, 63, 209, 91, 149, 188, 207, 205, 31 144, 135, 151, 178, 220, 252, 190, 97, 32 242, 86, 211, 171, 20, 42, 93, 158, 33 132, 60, 57, 83, 71, 109, 65, 162, 34 31, 45, 67, 216, 183, 123, 164, 118, 35 196, 23, 73, 236, 127, 12, 111, 246, 36 108, 161, 59, 82, 41, 157, 85, 170, 37 251, 96, 134, 177, 187, 204, 62, 90, 38 203, 89, 95, 176, 156, 169, 160, 81, 39 11, 245, 22, 235, 122, 117, 44, 215, 40 79, 174, 213, 233, 230, 231, 173, 232, 41 116, 214, 244, 234, 168, 80, 88, 175, 42} 43 44const ( 45 // The number of elements in the field. 46 fieldSize = 256 47 48 // The polynomial used to generate the logarithm table. 49 // 50 // There are a number of polynomials that work to generate 51 // a Galois field of 256 elements. The choice is arbitrary, 52 // and we just use the first one. 53 // 54 // The possibilities are: 29, 43, 45, 77, 95, 99, 101, 105, 55 //* 113, 135, 141, 169, 195, 207, 231, and 245. 56 generatingPolynomial = 29 57) 58 59func main() { 60 t := generateExpTable() 61 fmt.Printf("var expTable = %#v\n", t) 62 //t2 := generateMulTableSplit(t) 63 //fmt.Printf("var mulTable = %#v\n", t2) 64 low, high := generateMulTableHalf(t) 65 fmt.Printf("var mulTableLow = %#v\n", low) 66 fmt.Printf("var mulTableHigh = %#v\n", high) 67} 68 69/** 70 * Generates the inverse log table. 71 */ 72func generateExpTable() []byte { 73 result := make([]byte, fieldSize*2-2) 74 for i := 1; i < fieldSize; i++ { 75 log := logTable[i] 76 result[log] = byte(i) 77 result[log+fieldSize-1] = byte(i) 78 } 79 return result 80} 81 82func generateMulTable(expTable []byte) []byte { 83 result := make([]byte, 256*256) 84 for v := range result { 85 a := byte(v & 0xff) 86 b := byte(v >> 8) 87 if a == 0 || b == 0 { 88 result[v] = 0 89 continue 90 } 91 logA := int(logTable[a]) 92 logB := int(logTable[b]) 93 result[v] = expTable[logA+logB] 94 } 95 return result 96} 97 98func generateMulTableSplit(expTable []byte) [256][256]byte { 99 var result [256][256]byte 100 for a := range result { 101 for b := range result[a] { 102 if a == 0 || b == 0 { 103 result[a][b] = 0 104 continue 105 } 106 logA := int(logTable[a]) 107 logB := int(logTable[b]) 108 result[a][b] = expTable[logA+logB] 109 } 110 } 111 return result 112} 113 114func generateMulTableHalf(expTable []byte) (low [256][16]byte, high [256][16]byte) { 115 for a := range low { 116 for b := range low { 117 result := 0 118 if !(a == 0 || b == 0) { 119 logA := int(logTable[a]) 120 logB := int(logTable[b]) 121 result = int(expTable[logA+logB]) 122 } 123 if (b & 0xf) == b { 124 low[a][b] = byte(result) 125 } 126 if (b & 0xf0) == b { 127 high[a][b>>4] = byte(result) 128 } 129 } 130 } 131 return 132} 133