 restart(1);maple_mode(1);cas_setup(0,0,0,1,0,1e-10,10,[1,50,0,25],0,0,0); #radians,pas de cmplx, pas de  Sqrt
 Factor(x^23-1) mod 2;
/* Astuce: pour recuperer directement le second facteur, on peut utiliser op, ou£bien on utilise factors, mais£il en faut la forme inerte pour travailler sur Z/2Z, d'ou les£guillemets. Attention, ca ne marche pas toujours, par exemple si P:=x^23-1,£'factors(P)' mod 2 ne marche pas. En revanche, on peut introduire les nombres£modulaires comme en mode xcas grace a makemod, ou bien basculer en mode xcas,£creer a:=1%2; et revenir en mode maple, puis utiliser a.*/
 op(Factor(x^23-1) mod 2);
g:= op(Factor(x^23-1) mod 2)[2];
'factors(x^23-1)' mod 2;
g:=('factors(x^23-1)' mod 2)[2][2,1];
PP:=x^23-1;
('factors(PP)' mod 2); # ne marche pas!
a:=makemod(1,2);factors(x^23-a); #donne un resultat modulaire
/* On ne peut pas creer F2[x]/g avec GF car les racines de g ne sont pas£primitives dans (F_2^11) puisqu'elles sont d'ordre 23, et la commande GF veut£un polynome irreductible dont les racines engendre le groupe multiplicatif du£corps voulu. */
purge(a,FF); # pour eviter les Pb dans la ligne suivante.
FF:=GF(2,11,['a','FF']);
factor(g,FF(a));
/* On note t la premiere racine de g trouvee dans F2048*/
t:=subs(x=0,factors(factor(g,FF(a)))[2][1,1]);
/* On va maintenant comparer les racines de g avec les puissances de l'une d'entre£elles: t. On va illustrer que ce sont les t^i ou i est un carre modulo£23. On cree la liste des carres avec la fonction ensembles pour simplififer les£doublons. */
carres:={seq(i^2 mod 23 ,i=1..22)};
P:=1;for i in carres do P:=P*(x-t^i) od;
normal(P);#On retrouve bien g
g;
/* On n'etait pasoblige de trouver une racine de g dans F2^11 defini par GF, on£pouvait travailler modulo g.*/
purge(t);
P:=1;for i in carres do P:=P*(x-t^i) od;
Rem(P,subs(x=t,g),t) mod 2; #On travaille dans F2[t]/(g(t))
/*  G23 a 2^{23-deg(g)} elements. Le cardinal d'une boule de rayon 3 est la somme£ de C_23^i pour i allant de 0 \`a 3. L'annulation du terme suivant signifie que£ G23 a les invariants numeriques d'un code binaire 3 correcteur parfait de£ dimension 12 dans un espace vectoriel de dimension 23. */
normal(2^23-add(seq(binomial(23,i),i=0..3))*2^12);
/*  il y a 4 entiers consecutifs donc la distance est au moins 5*/
 sort(op(carres));
G:=matrix(12,23,(i,j)->(coeff(Rem(x^(i-1)*g,x^23-1,x) mod 2,x,j-1)));
GE:=augment(G,transpose(G*[1$23]) mod 2); #le code etendu
VE:=Nullspace(GE) mod 2;
/* Pour montrer que les espaces vectoriels engendr\'es par les lignes de GE et£celles de VE sont les memes, on cree la matrice M suivante et l'on doit montrer£qu'elle est de rang 12. On ne dispose pas d'une instruction de rang modulaire,£on utilise donc Nullspace mod 2*/
 M:=[op(GE),op(VE)];
 dim(Nullspace(M) mod 2);#c'est bien de rang 12
/*  puisque le code etendu est egal a son dual, on a:£ m.m'=0[2], et donc (m+m').(m+m')=m.m+m'.m' [4]£Donc si les poids de m et m' sont multiples de 4, celui de m+m' aussi£On en deduit que le code etendu a une distance multiple de 4, et comme elle£vaut au moins 5, et qu'il y a des mots de poids 8, c'est 8. Donc celle de G23£est 7 ou 8, et comme il y a des lignes de poids 7 dans G cette distance vaut 7*/
 
/*  ---------------------------------------------------------------------------------------------------------*/
 
 ST:=proc(U,n)
 local a,aa,b,bb,r,rr,T,S,q;
 r:=U;rr:=x^(2*n);
 a:=1;b:=0;
 aa:=0;bb:=1;
 while (degree(r)>=n) do
 q:=quo(r,rr);
 tmp:=rr;rr:=normal(r-q*rr);r:=tmp;
 tmp:=aa;aa:=normal(a-q*aa);a:=tmp;
 tmp:=bb;bb:=normal(b-q*bb);b:=tmp;
 print("ca doit etre nul",normal(a*U+x^(2*n)*b-r));
 od;
 S:=a;T:=r;
 S,T;
 end;
 normal( (x^3+1)*(x^3-1)*(x^2+x+1));
/*  on doit donc trouver S=x^3+1; T=-x^2-x-1 a facteur  pres */
 ST((x^3-1)*(x^2+x+1),3);
 MU:=proc(U,n)
 local PU;
 PU:=[seq(coeff(convert(series(U,x=0,2*n),polynom),x,i),i=0..2*n+1)];
 matrix(n+1,n+1,(i,j)->PU[i+j-1]);
 end;
 scalU:=proc(p,q,n)
 local PU;
 ([seq(coeff(p,x,i),i=0..n)]*MU(U,n)*transpose([seq(coeff(q,x,i),i=0..n)]))[1];
 end;
 purge(u):U:=add(u[i]*x^i,i=0..6);
 scalU(1,x,3);scalU(x^2,x^2,3);
 U:=1/(x+1/(x^2+1/(x^3+x+1+1/(x+2+1/x))));
GS:=factor(gramschmidt([1,x,x^2,x^3,x^4],(p,q)->scalU(p,q,4))):
matrix(5,5,(u,v)->simplify(scalU(GS[u],GS[v],4)));
S:=[seq(pade(U,x,2*i-1,i),i=1..4)];
/* On constate bien que les denominateurs des approximants de pade coincident a facteur pres avec les polyn\^omes reciproques des orthonormali */
recip:=proc(P)
normal(x^degree(P)*subs(x=1/x,P))
end;
seq(simplify(recip(denom(S[i]))/GS[i+1]),i=1..4); #donne bien les polyn\^omes obtenus par gramschmidt

