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