// petit generateur d'exercices (c) Bernhard Haak
printf("Generateur d`exercices de diagonalisation\n(c) Bernhard Haak\n\n");
clear T; clear D; clear A;
T(1,1) = round(10*(rand(1,1,'uniform')-0.5));
T(1,2) = round(10*(rand(1,1,'uniform')-0.5));
T(2,1) = round(10*(rand(1,1,'uniform')-0.5));
T(2,2) = round(10*(rand(1,1,'uniform')-0.5));
j=0
while (det(T)==0)
  T(2,2) = T(2,2)+1;
  j = j+1;
  if j=100 then break end
end
D = eye(2,2);
D(1,1) = round(4*(rand(1,1,'uniform')-0.5)) *det(T);
D(2,2) = D(1,1);
while ( D(2,2)== D(1,1) )
    D(2,2) = round(4*(rand(1,1,'uniform')-0.5)) *det(T);
end
A = T * D * T^(-1) ;
// de fait, A est entiere. Pour eviter des artefactes
// de calcul, on arrondit!
A(1,1)= round(A(1,1));
A(1,2)= round(A(1,2));
A(2,1)= round(A(2,1));
A(2,2)= round(A(2,2));
// et voila, c'est parti:
printf("Diagonaliser la matrice");
print(%io(2),A);printf("\n\n");
x = input("taper `entree` pour une indication."); 
printf("Il faut calculer les racines du polynome donnee par\n\n");
printf("            |%d -x \t %d    |\n", A(1,1), A(1,2));
printf("p(x) = det  |%d \t\t %d -x |\n", A(2,1), A(2,2));
x = input("encore une?");
printf("Les racines sont x_1 = %d et x_2 = %d\n\n", D(1,1), D(2,2));
x = input("encore une?");
printf("le vecteur propre u_1 est ");
print(%io(2),T*[1;0]);
printf("le vecteur propre u_2 est ");
print(%io(2),T*[0;1]);
x = input("la solution?");
printf("la matrice de transformation T est\n");
print(%io(2),T);
printf("et T^(-1) * A * T =");
print(%io(2),D)