1 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
2/* xcas peut reduire les matrice modulo n, avec les regles de priorite suivantes:*/
3 [[1,3],[-1,5]]*[[2,7],[-1,5]] mod 5;
4([[1,3],[-1,5]]*[[2,7],[-1,5]]) mod 5;
5 [[1,3],[-1,5]]+[[2,7],[-1,5]] mod 5;
6([[1,3],[-1,5]]+[[2,7],[-1,5]]) mod 5;
7 gcd(x+3,x+5) mod 2;# le modulo est fait apres le calcul du pgcd
8 'gcd(x+3,x+5)' mod 2;# le pgcd est bien calcule dans F2
9 Gcd(x+3,x+5) mod 2;# equivaut a l'instruction precedente.
10 linsolve([[2]],[0]);
11 linsolve([[2]],[0]) mod 2;
12 'linsolve([[2]],[0])' mod 2;#celui la fait bien 2x=0 dans F2
13S:=2*x+y;
14f:=unapply(S mod 2, x,y);
15f(1,2);#le mod a ete fait avant de remplacer les x et y
16f:=(x,y)->S mod 2;
17f(1,2);
18f:=(x,y)->eval(S) mod 2;
19f(1,2);
20h:=proc(a,b)
21f:=(x,y)->S mod 2;#dans une procedure l'eval est inutile
22f(a,b);end;
23h(1,2);
24/* --------------------------------------Exercice texte jury 1---------------------------*/
25/* jeu1 du  jury   */
26  m:=[0$7];
27/*   ou bien m:=matrix(7,1,0); et on rentre m[k,1]:= */
28  H:=matrix([[1,0,1,0,1,0,1],[0,1,1,0,0,1,1],[0,0,0,1,1,1,1]]);
29/*   entrer les valeurs non nulles (1=oui) selon les reponses Ex: m[1]:=1;  */
30  m[1]:=1;m[4]:=1;m[7]:=1;
31 w:=(H*m) mod 2; #Attention mod est prioritaire sur les operations
32 k:=4*w[3]+2*w[2]+w[1];
33 if k<>0 then print("menti a la question:",k);m[k]:=(m[k]+1) mod 2   else print("pas menti"); fi:
34 r:=m[4]+m[3]*2+m[2]*4+m[1]*8:print("votre nombre est:",r);
35/* le meme dans une procedure: 1 pour oui a la question*/
36 jeu:=proc()
37 local m:=[0$7];
38 H:=matrix([[1,0,1,0,1,0,1],[0,1,1,0,0,1,1],[0,0,0,1,1,1,1]]);
39 input(output("est il >=8?(1 si oui, 0 sinon)"),rep);
40 m[1]:=rep;// m[1] ne marche pas dans un input?
41 input(output("est il dans {4,5,6,7,12,13,14,15}?(1 si oui, 0 sinon)"),rep);
42 m[2]:=rep;
43 input(output("est il dans {2,3,6,7,10,11,14,15}?(1 si oui, 0 sinon)"),rep);
44 m[3]:=rep;
45 input(output("est il impair?(1 si oui, 0 sinon)"),rep);
46 m[4]:=rep;
47 input(output("est il dans {1,2,4,7,9,10,12,15}?(1 si oui, 0 sinon)"),rep);
48 m[5]:=rep;
49 input(output("est il dans {1,2,5,6,8,11,12,15}?(1 si oui, 0 sinon)"),rep);
50 m[6]:=rep;
51 input(output("est il dans {1,3,4,6,8,10,13,15}?(1 si oui, 0 sinon)"),rep);
52 m[7]:=rep;
53 w:=(H*m) mod 2;
54 k:=4*w[3]+2*w[2]+w[1];
55 if k<>0 then print("menti a la question:",k);m[k]:=(m[k]+1) mod 2   else print("pas menti"); fi:
56 r:=m[4]+m[3]*2+m[2]*4+m[1]*8:print("votre nombre est:",r);
57 end proc;
58 f:=(i,j)->floor(j/2^(i-1)) mod 2;
59 H:=matrix(3,7,f);
60/*  On trouve une famille generatrice du code:*/
61 C:=Nullspace(H) mod 2;
62 if rank(H*transpose(C) mod 2) == 0 then print("c'est bien nul") else print("erreur") ; fi;
63 subs(y=1,x=3,[x,y]);# Attention, il ne faut PAS de {} comme sous maple
64 syst:=proc(i)
65 HE:=augment(H,[[0$7]]);
66 HE[4,i]:=1;
67 HE;
68 end proc;
69syst(3);
70 sol:=proc(k)
71 'linsolve(syst(k),[0,0,0,1])' mod 2;
72 end proc;
73/*  oui a la question k veut dire etre dans le code et m[i]=1, donc etre solution de syst(k)*/
74sol(2);
75/*  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. */
76 question:=proc(k)
77 S:=sol(k);
78 f:=(C_0,C_1,C_2)-> S mod 2;
79// f:=unapply(S mod 2,C_0,C_1,C_2);//le mod 2 est fait avant d'evaluer les C_i
80 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));
81 sort([l]);//le eval dans l sert a simplifier les (())
82 end proc;
83 for k from 1 to 7 do print("est il dans",question(k));od;
84purge(E,F,i,j);
85 prodlist:=(E,F)->eval([seq(seq([i,j],j=F),i=E)]);
86 powerlist:=proc(E,n)
87  if n=0 then [[]] else
88  aa:=prodlist(E,powerlist(E,n-1)) ; map(a->[a[1],op(a[2])],aa) fi
89  end proc;
90/* 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*/
91 powerlist2:=proc(E,n)
92 local ltmp;
93 if n=0 then ltmp:=[[]] ;
94 else
95 ltmp:=[];
96 for i from 0 to nops(E)^n-1 do
97 ltmp:=[op(ltmp),[seq(E[j+1],j=( convert(i,base,nops(E))+[0$n]))]];
98 od;
99 fi;
100 ltmp;
101  end proc;
102 if evalb({op(powerlist([0,1],3))} = {op(powerlist2([0,1],3))}) then print("BON") else print("error IL Y A UN PB") fi;
103 questionbis:=proc(k)
104 S:=sol(k);
105 L:=powerlist2([0,1],3);
106 f:=(C_0,C_1,C_2)-> S mod 2;
107 l:=seq((matrix([[8,4,2,1,0,0,0]])*f(op(A)))[1],A=L);
108 sort([l]);
109 end proc;
110 for k from 1 to 7 do print("est il dans",questionbis(k));od;
111 F4:=GF(2,2,['j','F4']);#pour avoir des notations plus compactes.
112jj:=F4(j);jj^3;
113 l:=[0,1,jj,1+jj];
114 Hb:='Hb';
115 Hb:=matrix([[0,seq(1,i=l)],[1,seq(i,i=l)]]);
116 f:=(i,k)->if (i=k+1) then 1 else 0 fi;
117 T:=matrix(3,2,f);
118 A:=transpose(T*Hb);
119 op(A);
120/* 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).*/
121 H4:=transpose(matrix(eval([op(A),seq(seq([1,l[u],l[v]],v=1..4),u=1..4)])));
122 nullspace(H4);
123/*  -----------------------------------------------Exercice------------------------------*/
124 distham:=(u,v)-> add(u[i]<>v[i],i=1..dim(u));
125 C:=ranm(2,10,2);
126distham(C[1],C[2]);
127 C:=ranm(200,10,3);
128 v:=randvector(10,3);
129/* Rappel, ici la matrice C designe la liste de tous les \'el\'ements et non une base�du code. */
130 select(x->distham(x,v)<=1,C); #ceux a distance au plus 1 de v
131 select(x->distham(x,C[1])<=1,C); #ceux a distance au plus 1 de C[1]
132 select(x->distham(x,C[1])<=1,C); #ceux a distance au plus 2 de v
133