Appendix: GAP Code

Default Minimum Distance Algorithm, Algorithm 1

InstallMethod(MinimumDistance, "attribute method for linear codes", true, 
        [IsLinearCode], 0, 
function(C) 

        local Gp, Gpt, Gt, L, k, i, j, dimMat, Grstr, J, d1, arrayd1, Combo, rows, row, rowSum, G, F, zero, AClosestVec, s, p, num;
        G := GeneratorMat(C);

        if (IsInStandardForm(G)=false) then
                G := ShallowCopy(G);
                PutStandardForm(G);             
        fi;
        F:=LeftActingDomain(C);
        num:=5; #these seem to be optimal values
        dimMat := DimensionsMat(G);
        p:=dimMat[1]; #this equals k
        s := dimMat[2]-dimMat[1];

        Gp := ShallowCopy(G);

##Use gaussian elimination on the new matrix
        TriangulizeMat(Gp);

##generate the restricted code (I|Z) from Gp=(I|Z|B)
        Gpt := TransposedMat(Gp);
        Grstr := NullMat(s,dimMat[1]);
        for i in [dimMat[1]+1..dimMat[1]+s] do
                Grstr[i-dimMat[1]] := Gpt[i];
        od;
        Grstr := TransposedMat(Grstr);
        zero := Zero(F)*Grstr[1];
        
##search for all rows of weight p

        J := []; #col number of codewords to compute the length of
        
        for i in [1..p] do
        AClosestVec:=AClosestVectorCombinationsMatFFEVecFFE(Grstr, F, zero, i, 1);
        if WeightVecFFE(AClosestVec) > 0 then
                Add(J, [AClosestVec,i]);
        fi;
        od;

        d1:=dimMat[2];
        for rows in J do
            d1:=Minimum(WeightVecFFE(rows[1])+rows[2],d1);
        od;

return(d1);
end);

Leon's Minimum Distance Algorithm, Algorithm 3

InstallMethod(MinimumDistanceLeon, "attribute method for linear codes", true, 
        [IsLinearCode], 0, 
function(C) 
        local majority,G0, Gp, Gpt, Gt, L, k, i, j, dimMat, Grstr, J, d1, 
	 arrayd1, Combo, rows, row, rowSum, G, F, zero, AClosestVec, s, p, num;
        G0 := GeneratorMat(C);
        if (IsInStandardForm(G0)=false) then
                G := List(G0,ShallowCopy);
                PutStandardForm(G);             
        fi;
        F:=LeftActingDomain(C);
        if F<>GF(2) then Print("Code must be binary. Quitting. \n"); return(0); fi;
        p:=5; #these seem to be optimal values
        num:=8; #these seem to be optimal values
        dimMat := DimensionsMat(G);
        s := dimMat[2]-dimMat[1];
        arrayd1:=[];

for k in [1..num] do
##Permute the columns randomly
        Gt := TransposedMat(G);
        Gp := NullMat(dimMat[2],dimMat[1]);
        L := SymmetricGroup(dimMat[2]);
        L := Random(L);
        L:=List([1..dimMat[2]],i->OnPoints(i,L));
        for i in [1..dimMat[2]] do 
                Gp[i] := Gt[L[i]];
        od;
        Gp := TransposedMat(Gp);
        Gp := ShallowCopy(Gp);

##Use gaussian elimination on the new matrix
        TriangulizeMat(Gp);

##generate the restricted code (I|Z) from Gp=(I|Z|B)
        Gpt := TransposedMat(Gp);
        Grstr := NullMat(s,dimMat[1]);
        for i in [dimMat[1]+1..dimMat[1]+s] do
                Grstr[i-dimMat[1]] := Gpt[i];
        od;
        Grstr := TransposedMat(Grstr);
        zero := Zero(F)*Grstr[1];

##search for all rows of weight p

        J := []; #col number of codewords to compute the length of
        
        for i in [1..p] do
        AClosestVec:=AClosestVectorCombinationsMatFFEVecFFE(Grstr, F, zero, i, 1);
        if WeightVecFFE(AClosestVec) > 0 then
                Add(J, [AClosestVec,i]);
        fi;
        od;

        d1:=dimMat[2];
        for rows in J do
          d1:=Minimum(WeightVecFFE(rows[1])+rows[2],d1);
        od;
        arrayd1[k]:=d1;
od;
if AbsoluteValue(Sum(arrayd1)/Length(arrayd1)-Int(Sum(arrayd1)/Length(arrayd1)))<1/2 then 
  majority:=Int(Sum(arrayd1)/Length(arrayd1)); 
 else
  majority:=Int(Sum(arrayd1)/Length(arrayd1))+1;
fi;
return(majority);
end);





Next: References Previous: Application   Contents
David Joyner 2004-04-27