TP 5restart;Mise en place du corps Kp:=3;m:=5;P:=X^5+X^4+X^2+1; alias(alpha=RootOf(P,X) mod p);#d\303\251finit l'extension K=F_p[alpha] de degr\303\251 mp^m;Power(alpha,p^m-1) mod p ;Power(alpha,(p^m-1)/2) mod p;n:=p^m-1;T:=Array(0..n-1,i->Power(alpha,i) mod p):LD:=proc(x) global T,n; local i; for i from 0 to n-1 do if T[i]=x then return i end if; end do; FAILend proc:F:=i->p*i mod n;Orb:=proc(i::nonnegint)description "calcule les classes cyclotomipues";global n;local Omega,j;if i>=n then error "mauvais argument" end if;Omega:=[];j:=i; do Omega:=[op(Omega),j]; j:=F(j); if member(j,Omega) then return Omega end if; end do; FAIL;end proc:Orb(6);Construction du code BCHla distance apparente du code BCHdelta:=8; L:=[seq(Orb(i),i=1..delta-1)];J :=convert({op(map(op,L))},list);les racines du coderac:=map(i -> T[i],J); le polyn\303\264me g\303\251n\303\251rateurg:=sort(Expand(mul(X-r,r in rac)) mod p,X);la dimensionk:=n-degree(g,X);le nombre de mots du codep^k;latex(g);un exemple de correctionle mot re\303\247ufr := X^224+X^110+X^109+X^107+X^106+X^105+2*X^103+X^102+X^101+2*X^100+2*X^99+X^97+2*X^95+X^94+X^92+2*X^90+2*X^89+X^88+2*X^86+2*X^85+X^83+X^82+2*X^81+2*X^78+2*X^77+2*X^76+3*X^75+2*X^74+2*X^73+X^71+2*X^70+X^68+2*X^66+2*X^64+2*X^63+X^62+X^59+X^58+X^57+X^56+X^55+X^54+2*X^52+X^51+2*X^49+X^47+2*X^43+2*X^42+2*X^41+X^40+2*X^39+2*X^19;andmap(r->evalb(Expand(subs(X=r,fr)) mod p = 0),rac);Rem(fr,g,X,'r') mod p;le syndromeS:=sort(add((Expand(subs(X=rac[i],fr)) mod p)*X^(i-1),i=1..delta-1),X);r\303\251solution de l'\303\251quation cl\303\251 - algorithme de Euclide-SugiyamaR0:=X^(delta-1):R1:=S:U0:=1:U1:=0:V0:=0:V1:=1:do R2:=Rem(R0,R1,X,'Q') mod p; U2:=Expand(U0-Q*U1) mod p; V2:=Expand(V0-Q*V1) mod p; if degree(R2,X) < (delta-1)/2 then break end if; R0:=R1;R1:=R2; U0:=U1;U1:=U2; V0:=V1;V1:=V2;end do:R:=R2;U:=collect(U2,X);V:=collect(V2,X);C:=subs(X=0,V2);sigma:=sort(collect(Expand(V2/C) mod p,X),X);omega:=sort(collect(Expand(R2/C) mod p,X),X);t:=degree(sigma);l'\303\251quation cl\303\251 est bien satisfaiteRem(Expand(S*sigma) mod p -omega ,X^(delta-1),X) mod p;racines du polyn\303\264me localisateurrc:=[]:for i from 0 to n-1 do r:=T[i]; if Expand(subs(X=r,sigma)) mod p =0 then
rc:=[op(rc),evala(1/r) mod p] end if; if nops(rc)=t then break end if: end do:rc;d:=sort(map(LD,rc));formule de Forneyfor j from 1 to t do z[j]:=T[n-d[j]]; c[j]:=-Normal(subs(X=z[j],omega)/subs(X=z[j],diff(sigma,X))) mod p; end do;l'erreure:=add(c[i]*X^d[i],i=1..t);le mot envoy\303\251f:=sort(fr-e mod p,X);le mot trouv\303\251 appartient bien au codeandmap(r->evalb(Expand(subs(X=r,f)) mod p = 0),rac);h:=Quo(f,g,X,'r') mod p;r;