TP01-sol.cas
5.7 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
restart;maple_mode(1);cas_setup(0,0,0,1,0,1e-10,25,[1,50,0,25],0,0,0);#radians,pas de cmplx, pas de Sqrt
diag(seq(1,4)); diag(1$4);
diag(seq(i,i=1..4));
A:=matrix(4,4)+1;v:=[seq(1,j=1..4)];
A*v;# Attention il retourne une ligne,pour xcas les vecteurs sont en ligne
purge(a);
f:=(i,j)->if (i=j) then 0 else if (i<j) then a[i,j] else -a[j,i] fi;fi;
matrix(4,4,f); d:=det(matrix(4,4,f)):
factor(d);#c'est toujours un carre
if (op(factor(d))[nops(factor(d))]) == 2 then print("OK c'est un carre") else print("PB ca doit etre un carre"); fi ;
M:=matrix(8,8,f);
/* Methode type pivot, contre m\'ethode de Laplace,... mais ici la matrice£est antisymetrique.*/
print("calcul du det 8x8 antisymetrique formel");
d1:=det(M):
// print("calcul du det 8x8 antisymetrique formel par det_minor");
d2:=det_minor(M):
if normal(d1-d2) == 0 then print("OK c'est bien nul") else print("erreur") fi ;
FFFd2:=factor(d2);
if (op(FFFd2)[nops(FFFd2)]) == 2 then print("OK pour le pfaffien 8x8") else print("PB ca doit etre un carre"); fi ;
/* -------------------Illustration de la reduction de Jordan--------------------------------------------------------------------------------£ Construction de l'exemple: on veut une reponse de ce type:*/
f:=(i,j)->if(i=j-1) then 1 else 0 fi;
J:=matrix(8,8,f);#forme classique d'ordre 8.
J[3,4]:=0:J[6,7]:=0:J;#2 blocs d'ordre 3 et un d'ordre 2.
/* On veut faire un changement de base simple. Ex det=1 pour garder des coeffs entiers.£ on cree une transvection:*/
f:=(i,j)->if(i=j) then 1 else 0 fi;
T:=proc(i,j,a)
local A;
A:=matrix(8,8,f):A[i,j]:=a;A;
end proc;
B:=matrix(8,8,b);
/* faire Li<-Li+aLj c'est multiplier a gauche par T(i,j,a).£ Par exemple L3<- L3+aL2 c'est multiplier a GAUCHE par: T(3,2,a);*/
T(3,2,a)*B;
/* En revanche: C2<-C2+aC3 c'est multplier a DROITE par T(3,2,a)*/
B*T(3,2,a);
/* Remarquer que l'inverse de T(i,j,a) est T(i,j,-a)*/
T(3,2,a)^(-1);
/* Donc conjuguer par T(i,j,a) c'est faire:£ Li <- Li+aLj et Cj <- Cj-aCi*/
P:=T(6,7,2)*T(4,5,1)*T(3,2,2)*T(1,2,1):
P,P^(-1);
/* Donc faire a l'ordinateur:*/
N:=P*J*P^(-1):
/* est identique a faire a la main a partir de J:£ L1 <- L1+L2 ; C2<-C2 - C1 puis£ L3 <- L3+2L2 ; C2 <- C2 -2C3£ L4 <- L4+L5 ; C5 <- C5 -C4£ L6 <- L6 +2 L7; C7 <- C7 -2 C6£ On a maintenant trouve un bel exercice: Trouver la forme de£ jordan de N et une matrice de passage pour l'obtenir.£ On calcule N^2 et son noyau.*/
N,N^2;
N2:=nullspace(N^2);
/* on choisit a et b independants modulo ker N^2 (qui est aussi im£ N). (attention a et b hors de ker N^2 est insuffisant).*/
a:=[0,0,1,0,0,0,0,0]:b:=[0,0,0,0,0,1,0,0]:
rank(matrix([op(N2),a,b]));# doit etre dim ker N^2 +2.
N1:=nullspace(N);
/* dim ker N^2 -dim ker N= 6-3=2+1 donc N.a,N.b doit etre complete par c£ tq N.a,N.b,c indep modulo ker N. Par exemple on prend celui la:*/
c:=[0,0,0,0,0,0,0,1]:
/* On verifie qu'il convient:*/
rank(matrix([op(N1),N*a,N*b,c]));
/* dim ker N - dim ker N^0=3 c'est donc engendr\'e par£N^2.a,N^2.b,N.c. Il n'y a plus rien a faire, et l'on prend £ la base suivante: (Attention pour xcas N*a... sont des lignes, on£ prend donc la transposee)*/
Q:=transpose(matrix([(N^2)*a,N*a,a,(N^2)*b,N*b,b,N*c,c]));
/* On sait maintenant que Q^(-1)*N*Q doit donner J. verifification:*/
if J==normal(Q^(-1)*N*Q) then print("La jordanisation est bonne") else print("on n'a pas retrouve J") fi;
/* --------------------------------------------------------------------------------------------------------------*/
/* Il s'agit donc de trouver les bases qui jordanisent l'endomorphisme.£On a N^3=0.£Il nous faut d'abord pour les 2 blocs de taille 3, une base de kerN^3/ker N^2£que l'on remonte ensuite dans ker N^3 (Choix de a et b dans la question£precedente). Comme ker N^3/ker N^2 est de dimension £2, on a deja: card(GL2).(card ker N^2)^2. qui vaut: (p^2-1)*(p^2-p)*(p^6)^2.£reste le choix d'un vecteur non nul de ker N^2/(ker N +Im N) que l'on remonte.£ker N+im N est de dim 3+2. On a donc p-1 choix dans le quotient, soit (p-1)*p^5£choix pour le dernier vecteur a choisir (c dans la question precedente).*/
cardstab:=(p^2-1)*(p^2-p)*p^12*(p-1)*p^5;
/* Autre methode: On commence par choisir les vecteurs de base qui sont dans le£noyau. On prend une base de Im N^2 qui est de dim 2, soit (p^2-1)*(p^2-p) puis£un vecteur du noyau hors de Im N^2. soit (p^3-p^2) choix. On cherche alors des£antecedants a ces vecteurs. (p^3 choix pour l'antecedant d'un vecteur) */
cardstab2:=(p^2-1)*(p^2-p)*(p^3-p^2)*(p^3)^3*(p^3)^2;
normal(cardstab-cardstab2);
cardGL8:=product((p^8-p^i),i=0..7);
cardorbite:=normal(cardGL8/cardstab);
/* -------------------------------------------Exercice---syntaxe et combinatoire£des matrice nilpotentes--------------------------------*/
n:=5; purge(a);
A:=matrix(n,n,(i,j)->a[n*(i-1)+j]);
l:=[seq(a[i],i=1..n^2)];
/* Pour convertir la liste l en une matrice a n colonne:*/
A:=list2mat(l,n);
J:=matrix(n,n):J[1,2]:=1:J[3,4]:=1:J;
L:=mat2list(A*J-J*A);
C:=matrix(n^2,n^2,(i,j)->diff(L[i],a[j]));
n^2-rank(C); #est la dim du commutateur de J.
Nullspace(matrix([[2]])) mod 2; # est correct
nullspace(matrix([[2]])) mod 2; # cherche d'abord le noyau sur Q puis le reduit mod2
maple_mode(0); // en mode xcas il suffit d'utiliser %, on reste dans Z/2Z
e2:=1 % 2; maple_mode(1);
nullspace(matrix([[2*e2]]));
com:=Nullspace(C) mod 2;
COM:=[seq(list2mat(i,n),i=com)];
v:=[1$13];
v*COM;
[1,2,3]*[a,b,c,d,e];
convert(67,base,2);
convert(0,base,2);# Attention, il ne retoure pas 0 mais le vide.
augment(convert(67,base,2),[0$10]); # pour ajouter des 0
LCOM:=[];
/*
print("Patienter SVP 2^13 tours");
for i from 0 to 2^13-1 do
ci:=convert(i,base,2);LCOM:=[op(LCOM),augment(ci,[0$(13-dim(ci))])*COM] od;
STAB:=select(x->(det(x) mod 2)<>0,LCOM);
if dim(STAB)==1536 then print("OK 1536") else print("Erreur") fi;
*/