TP18-sol.cas
5.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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