1#!/usr/bin/python 2 3# (64,30) linear block code stuff 4 5polynomial = 0260534236651 6 7# produce generator matrix g 8g = [] 9for i in range(30): 10 g.append(polynomial << i) 11 for j in range(i): 12 if g[i] & (1 << (33 + i - j)): 13 g[i] ^= g[i-j-1] 14 15#print 16#for i in range(29,-1,-1): 17 #print "0x%016x," % g[i] 18#print 19 20# produce check matrix h 21h = [] 22for i in range(34): 23 h.append(0) 24 for j in range(30): 25 h[i] |= (g[29-j] >> i) & 0x1 26 h[i] <<= 1 27 h[i] <<= 33 28 h[i] |= (0x1 << i) 29 30#print 31#for i in range(34): 32 #print "0x%016x," % h[i] 33#print 34 35# reverse the order 36g = g[::-1] 37h = h[::-1] 38 39def count_bits(n): 40 i = 0 41 while n != 0: 42 n &= n - 1 43 i += 1 44 return i 45 46def gen_syndrome(c): 47 assert c < 2**64 48 s = 0 49 # look for a faster GF(2) matrix multiplication algorithm 50 for i in range(34): 51 s <<= 1 52 s |= (count_bits(c & h[i]) % 2) 53 return s 54 55# optimized check table generation (sw_check_tables.h) 56for shift in range(8): 57 for i in range(256): 58 print "0x%09x, " % gen_syndrome(i<<(shift*8)), 59 print 60