 restart;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
/* xcas peut reduire les matrice modulo n, avec les regles de priorite suivantes:*/
 [[1,3],[-1,5]]*[[2,7],[-1,5]] mod 5;
([[1,3],[-1,5]]*[[2,7],[-1,5]]) mod 5;
 [[1,3],[-1,5]]+[[2,7],[-1,5]] mod 5;
([[1,3],[-1,5]]+[[2,7],[-1,5]]) mod 5;
 gcd(x+3,x+5) mod 2;# le modulo est fait apres le calcul du pgcd
 'gcd(x+3,x+5)' mod 2;# le pgcd est bien calcule dans F2
 Gcd(x+3,x+5) mod 2;# equivaut a l'instruction precedente.
 linsolve([[2]],[0]);
 linsolve([[2]],[0]) mod 2;
 'linsolve([[2]],[0])' mod 2;#celui la fait bien 2x=0 dans F2
S:=2*x+y;
f:=unapply(S mod 2, x,y);
f(1,2);#le mod a ete fait avant de remplacer les x et y
f:=(x,y)->S mod 2;
f(1,2);
f:=(x,y)->eval(S) mod 2;
f(1,2);
h:=proc(a,b)
f:=(x,y)->S mod 2;#dans une procedure l'eval est inutile
f(a,b);end;
h(1,2);
/* --------------------------------------Exercice texte jury 1---------------------------*/
/* jeu1 du  jury   */
  m:=[0$7];
/*   ou bien m:=matrix(7,1,0); et on rentre m[k,1]:= */
  H:=matrix([[1,0,1,0,1,0,1],[0,1,1,0,0,1,1],[0,0,0,1,1,1,1]]);
/*   entrer les valeurs non nulles (1=oui) selon les reponses Ex: m[1]:=1;  */
  m[1]:=1;m[4]:=1;m[7]:=1;
 w:=(H*m) mod 2; #Attention mod est prioritaire sur les operations
 k:=4*w[3]+2*w[2]+w[1];
 if k<>0 then print("menti a la question:",k);m[k]:=(m[k]+1) mod 2   else print("pas menti"); fi: 
 r:=m[4]+m[3]*2+m[2]*4+m[1]*8:print("votre nombre est:",r);
/* le meme dans une procedure: 1 pour oui a la question*/
 jeu:=proc()
 local m:=[0$7];
 H:=matrix([[1,0,1,0,1,0,1],[0,1,1,0,0,1,1],[0,0,0,1,1,1,1]]);
 input(output("est il >=8?(1 si oui, 0 sinon)"),rep);
 m[1]:=rep;// m[1] ne marche pas dans un input?
 input(output("est il dans {4,5,6,7,12,13,14,15}?(1 si oui, 0 sinon)"),rep);
 m[2]:=rep;
 input(output("est il dans {2,3,6,7,10,11,14,15}?(1 si oui, 0 sinon)"),rep);
 m[3]:=rep;
 input(output("est il impair?(1 si oui, 0 sinon)"),rep);
 m[4]:=rep;
 input(output("est il dans {1,2,4,7,9,10,12,15}?(1 si oui, 0 sinon)"),rep);
 m[5]:=rep;
 input(output("est il dans {1,2,5,6,8,11,12,15}?(1 si oui, 0 sinon)"),rep);
 m[6]:=rep;
 input(output("est il dans {1,3,4,6,8,10,13,15}?(1 si oui, 0 sinon)"),rep);
 m[7]:=rep;
 w:=(H*m) mod 2;
 k:=4*w[3]+2*w[2]+w[1];
 if k<>0 then print("menti a la question:",k);m[k]:=(m[k]+1) mod 2   else print("pas menti"); fi: 
 r:=m[4]+m[3]*2+m[2]*4+m[1]*8:print("votre nombre est:",r);
 end proc;  
 f:=(i,j)->floor(j/2^(i-1)) mod 2;
 H:=matrix(3,7,f);
/*  On trouve une famille generatrice du code:*/
 C:=Nullspace(H) mod 2; 
 if rank(H*transpose(C) mod 2) == 0 then print("c'est bien nul") else print("erreur") ; fi;
 subs(y=1,x=3,[x,y]);# Attention, il ne faut PAS de {} comme sous maple 
 syst:=proc(i)
 HE:=augment(H,[[0$7]]);
 HE[4,i]:=1;
 HE;
 end proc;
syst(3);
 sol:=proc(k)
 'linsolve(syst(k),[0,0,0,1])' mod 2;
 end proc;
/*  oui a la question k veut dire etre dans le code et m[i]=1, donc etre solution de syst(k)*/
sol(2);
/*  Attention, a la syntaxe f:=(C_0,C_1,C_2)-> S mod 2; S n'est pas forcement£ evalue avant (si l'on n'est pas dans une procedure forcer avec un£ eval(S)). Attention, si l'on utilise unapply(S mod 2,C_0,C_1,C_2) alors le mod£ 2 est applique aux variables formelles, et l'expression totale ne sera pas£ forcement reduite. */
 question:=proc(k)
 S:=sol(k);
 f:=(C_0,C_1,C_2)-> S mod 2;
// f:=unapply(S mod 2,C_0,C_1,C_2);//le mod 2 est fait avant d'evaluer les C_i
 l:=eval(seq(seq(seq((matrix([[8,4,2,1,0,0,0]])*f(a,b,c))[1],a=0..1),b=0..1),c=0..1));
 sort([l]);//le eval dans l sert a simplifier les (())
 end proc;
 for k from 1 to 7 do print("est il dans",question(k));od;
purge(E,F,i,j);
 prodlist:=(E,F)->eval([seq(seq([i,j],j=F),i=E)]);
 powerlist:=proc(E,n)
  if n=0 then [[]] else
  aa:=prodlist(E,powerlist(E,n-1)) ; map(a->[a[1],op(a[2])],aa) fi
  end proc;
/* Autre methode, on utilise l'ecriture binaire. convert(x,base,2) n'est pas tres£pratique, car la longueur de la suite rendue n'est pas constante. Ex 1 donne£[1] 3 donne [1,1]. Astuce, on ajoute [0,0,...,0] avec la taille voulue*/
 powerlist2:=proc(E,n)
 local ltmp;
 if n=0 then ltmp:=[[]] ;
 else
 ltmp:=[];
 for i from 0 to nops(E)^n-1 do
 ltmp:=[op(ltmp),[seq(E[j+1],j=( convert(i,base,nops(E))+[0$n]))]];
 od;
 fi;
 ltmp;
  end proc;
 if evalb({op(powerlist([0,1],3))} = {op(powerlist2([0,1],3))}) then print("BON") else print("error IL Y A UN PB") fi;
 questionbis:=proc(k)
 S:=sol(k);
 L:=powerlist2([0,1],3);
 f:=(C_0,C_1,C_2)-> S mod 2;
 l:=seq((matrix([[8,4,2,1,0,0,0]])*f(op(A)))[1],A=L);
 sort([l]);
 end proc;
 for k from 1 to 7 do print("est il dans",questionbis(k));od;
 F4:=GF(2,2,['j','F4']);#pour avoir des notations plus compactes.
jj:=F4(j);jj^3;
 l:=[0,1,jj,1+jj];
 Hb:='Hb';
 Hb:=matrix([[0,seq(1,i=l)],[1,seq(i,i=l)]]);
 f:=(i,k)->if (i=k+1) then 1 else 0 fi;
 T:=matrix(3,2,f);
 A:=transpose(T*Hb);
 op(A);
/* la generalisation du code sur F4 est le noyau de H4: (on met un eval£pour applatir les () introduites par les seq, et pour ne pas faire£raler matrix).*/
 H4:=transpose(matrix(eval([op(A),seq(seq([1,l[u],l[v]],v=1..4),u=1..4)])));
 nullspace(H4); 
/*  -----------------------------------------------Exercice------------------------------*/
 distham:=(u,v)-> add(u[i]<>v[i],i=1..dim(u));
 C:=ranm(2,10,2);
distham(C[1],C[2]);
 C:=ranm(200,10,3);
 v:=randvector(10,3);
/* Rappel, ici la matrice C designe la liste de tous les \'el\'ements et non une base£du code. */
 select(x->distham(x,v)<=1,C); #ceux a distance au plus 1 de v
 select(x->distham(x,C[1])<=1,C); #ceux a distance au plus 1 de C[1]
 select(x->distham(x,C[1])<=1,C); #ceux a distance au plus 2 de v
