SetLogFile("decodifica.log"); print "Introduci un numero l potenza di un primo"; readi l; q:=l; K:=GF(q^2); R:=PolynomialRing(K,2); h:=q+1; n:=q^3; g:=((h-1)*(h-2)) div 2; b:=2*g+2; dim:=function(x) if x eq 0 then return 1; else S:={}; for r in [0..x] do for s in [0..q-1] do if r*q+s*(q+1) le x then S:=S join {r*q+s*(q+1)}; end if; end for; end for; return #S; end if; end function; print "Introduci un numero naturale c"; readi c; k:=c; if k lt b then print "L'algoritmo non si puo'applicare"; else nongaps:=[]; for x in [0..k+g-1] do if dim(x+1) eq dim(x)+1 then Append(~nongaps,x); end if; end for; print nongaps; a:=nongaps[k]; print a; if IsEven(k) then i:=k div 2; j:=k div 2-g+1; print i,j; else i:=(k-1) div 2; j:=(k+1) div 2 -g+1; print i,j; end if; w:=nongaps[i]; z:=nongaps[j]; print w,z; BaseA:=[]; for s in [0..q-1] do for r in [0..a] do if r*q+s*(q+1) le z then Append(~BaseA,(x^r)*(y^s)); end if; end for; end for; print BaseA; BaseY:=[]; for s in [0..q-1] do for r in [0..a] do if r*q+s*(q+1) le w then Append(~BaseY,(x^r)*(y^s)); end if; end for; end for; print BaseY; BaseD:=[]; for s in [0..q-1] do for r in [0..a] do if r*q+s*(q+1) le a then Append(~BaseD,(x^r)*(y^s)); end if; end for; end for; print BaseD; B:=[]; for u in K do for v in K do if Evaluate(x^(q+1)+y^q+y,[u,v]) eq 0 then Append(~B,[u,v]); end if; end for; end for; print B; seq:=[]; for I in [1..k] do for l in [1..n] do ing:=Evaluate(BaseD[I],B[l]); Append(~seq,ing); end for; end for; M1:=KMatrixSpace(K,k,n); G:=M1![seq[t]:t in [1..k*n]]; C:=Transpose(G); print C; M2:=KMatrixSpace(K,1,k); O:=M2![0:t in [1..k]]; o,Q:=Solution(C,O); print Q; print "Introduci la parola ricevuta F di lunghezza", n, "con componenti naturali comprese tra 0 e", q^2-1, "inclusi"; F:=[]; for ii:=1 to n do readi z; Append(~F,z); end for; //read F; print "La parola messaggio e'", F; f:=[K|]; for I in [1..q^3] do if F[I] eq 0 then f1:=0; Append(~f,f1); elif F[I] eq 1 then f1:=1; Append(~f,f1); else for J in [2..q^2-1] do if F[I] eq J then f1:=K.1^(J-1); Append(~f,f1); end if; end for; end if; end for; print f; comp:=[]; for I in [1..i] do for J in [1..j] do sind:=&+[Evaluate(BaseA[J],B[l])*Evaluate(BaseY[I],B[l])*f[l]:l in [1..n]]; Append(~comp,sind); end for; end for; M3:=KMatrixSpace(K,i,j); X:=M3![comp[t]:t in [1..i*j]]; Xtr:=Transpose(X); print Xtr; M4:=KMatrixSpace(K,1,i); Z:=M4![0:I in [1..i]]; print Z; D,A:=Solution(Xtr,Z); if Dimension(A) ne 0 then print A; N:=[K|]; N:=Basis(A); print N; L:=&+[N[1][J]*BaseA[J]:J in [1..j]]; print "Un localizzatore di errore e'", L; P:=[l:l in [1..q^3]|Evaluate(L,B[l]) eq 0]; print P; ss:=[]; for l in P do for I in [1..k] do entr:=Evaluate(BaseD[I],B[l]); Append(~ss,entr); end for; end for; M5:=KMatrixSpace(K,#P,k); C1:=M5![ss[t]:t in [1..k*#P]]; print C1; M6:=KMatrixSpace(K,1,n); ff:=M6![f[I]:I in [1..n]]; fC:=ff*C; er:=Solution(C1,fC); print er; e:=[K|]; J:=1; for I in [1..n] do if I in P then e[I]:=er[1][J]; J:=J+1; else e[I]:=0; end if; end for; print e; ed:=[]; for I in [1..n] do if e[I] eq 0 then e1:=0; Append(~ed,e1); elif e[I] eq 1 then e1:=1; Append(~ed,e1); else for s in [2..q^2-1] do if e[I] eq K.1^(s-1) then e1:=s; Append(~ed,e1); end if; end for; end if; end for; print "La parola errore e'", ed; c:=[K|]; for I in [1..n] do c[I]:=f[I]-e[I]; end for; print c; cd:=[]; for I in [1..n] do if c[I] eq 0 then c1:=0; Append(~cd,c1); elif c[I] eq 1 then c1:=1; Append(~cd,c1); else for s in [2..q^2-1] do if c[I] eq K.1^(s-1) then c1:=s; Append(~cd,c1); end if; end for; end if; end for; print "La parola codice esatta e'",cd; if cd eq F then print "La parola messaggio e'una parola codice"; end if; else print "L'algoritmo non si puo'applicare perche'non esiste alcun localizzatore di errore non banale"; end if; end if;