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