Golay G24
September 8, 2008 Leave a comment
This is a dirty implemenation of Golay correcting code using python.
This is a solution to 18.13 problem 1 from Trappe and Washington’s Crytography book. To run this, you need bash, python, and the numpy libraries. To run, run golay.sh. The algorithm is located in golay.py
golay.py
#!/usr/bin/env python from numpy import * import sys geng24 = array([[1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,0,1,0], [0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,0,0,0,1], [0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,0,0], [0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,1,1,0,0], [0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,1,1,1,0], [0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,1,1,1], [0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,0,1,1,0,1,1], [0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,1,0,1,1,0,1], [0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,1,0,1,1,0], [0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0,1,1], [0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,0,0,0,1,0,1], [0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1]]) B = array([[1,1,1,0,1,1,1,0,0,0,1,0], [1,0,1,1,0,1,1,1,0,0,0,1], [1,1,0,1,1,0,1,1,1,0,0,0], [1,0,1,0,1,1,0,1,1,1,0,0], [1,0,0,1,0,1,1,0,1,1,1,0], [1,0,0,0,1,0,1,1,0,1,1,1], [1,1,0,0,0,1,0,1,1,0,1,1], [1,1,1,0,0,0,1,0,1,1,0,1], [1,1,1,1,0,0,0,1,0,1,1,0], [1,0,1,1,1,0,0,0,1,0,1,1], [1,1,0,1,1,1,0,0,0,1,0,1], [0,1,1,1,1,1,1,1,1,1,1,1]]) errorvector = array([0,0,0,0,0,0,0,0,0,0,0,0]) def weight(obj): wt = 0 for i in obj: wt += i return wt geng24_transpose = geng24.transpose() #r = array([1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0]) #r = array([0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,0,1,0,0,0,0,1,1]) #r = array([0,0,1,0,1,0,1,0,1,0,1,0,0,1,0,0,1,1,1,0,1,1,0,0]) #r = array([1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1]) r = [] for i in sys.argv[1].split(','): r.append(int(i)) r = array(r) s = (dot(r,geng24_transpose) % 2 ) sdotb = (dot(s,B) % 2 ) #e = array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) e = zeros( (1,24), dtype=int8) e = e.flat if weight(s) <= 3: print "ERROR CORRECTION 3" e = array([s, array([0,0,0,0,0,0,0,0,0,0,0,0])]) e.shape = (1,24) e = e.flat if weight(sdotb) <= 3: print "ERROR CORRECTION 4" e_new = array([array([0,0,0,0,0,0,0,0,0,0,0,0]), sdotb]) e_new.shape = (1,24) e = (e + e_new) % 2 e = e.flat for j in range(12,24): if weight((geng24[:,j] + s)%2) < 2: print "ERROR CORRECTION 5" e[j] = 1 e_new = array([(geng24[:,j]+s)%2, array([0,0,0,0,0,0,0,0,0,0,0,0])]) e_new.shape = (1,24) e = (e + e_new) % 2 e = e.flat for j in range(0,12): if weight((sdotb + B[j,:])%2) <= 2: print "ERROR CORRECTION 6" e[j] = 1 e_new = array([array([0,0,0,0,0,0,0,0,0,0,0,0]),((sdotb + B[j,:])%2)]) e_new.shape = (1, 24) e = (e + e_new) % 2 e = e.flat print "\ne = [", for i in e: print i, print "]\n" c = ((e + r)%2) m = array(c[:12]) print "r = ", r print "c = ", c print "m = ", m
Here is golay.sh
#!/bin/bash echo "Running with Example Problem" echo "===========================" ./golay.py 1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0 echo " Running with Problem1" echo "===========================" ./golay.py 0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,0,1,0,0,0,0,1,1 echo " Running with Problem2" echo "===========================" ./golay.py 0,0,1,0,1,0,1,0,1,0,1,0,0,1,0,0,1,1,1,0,1,1,0,0 echo " Running with Problem3" echo "===========================" ./golay.py 1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1