% cours6.tex (gH) : D\'{e}terminants, syst\`{e}mes lin\'{e}aires etc.
%
\documentclass[a4paper,12pt]{article}
%
\usepackage{maple2e}
%
\parskip    0.35cm
\parindent  0.00cm
%
\renewcommand{\thesection}{\arabic{section}. }
\renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}}
%
\def\C{\mbox{l\hspace{-0.43em}C}}
\def\Maple{\textit{Maple}}
\def\L{\ensuremath{\mathcal{L}}}
\def\dz{\texttt{\symbol{'043}}}      % di\`{e}se
%
% pour une matrice 2x2
%
\newcommand{\mat}[4]{\ensuremath{%
\left(\begin{tabular}{cc}%
#1&#2\\#3&#4\\\end{tabular}\right)}
}% fin de definition de \mat
%
% pour simuler une entr\'{e}e (ligne) Maple
%
\newcommand{\mapleIn}[1]{\textsf{
\begin{tabular}{ll}
 $ > $ &#1
\end{tabular}
}}
%
% pour simuler une sortee (ligne) Maple
%
\newcommand{\mapleOut}[1]{\texttt{
\begin{tabular}{ll}
 \hspace{1.3cm} & #1
\end{tabular}
}}
%
% une entr\'{e}e et une sortie pour Maple longue
%
\newcommand{\mapleInt}[1]{\textsf{#1}}
\newcommand{\mapleOutLong}[1]{\texttt{#1}}
%
% des macros "locales" au sujet
%
\def\sl{$sl(2,\C)$}
\def\slm{\textit{sl}-matrix}
\def\slms{\textit{sl}-matrices}
\newcommand{\sym}[1]{$Sym^{#1}(\C^ 2)$}
%
%
\begin{document}
%
\title{6. Matrices et d\'{e}terminants}
\author{Gilles Hunault}
\date{Bergson, 1996}
\maketitle
%
\section{Vecteurs, matrices, op\'{e}rations associ\'{e}es} % ##
%

Une variable classique correspond \`{a} un nom et une valeur. Une structure
indic\'{e}e permet d'associer \`{a} un nom plusieurs valeurs, accessibles via
une fonction d'indexation \`{a} un ou plusieurs indices. \Maple\ reconnait
comme telles structures les listes, les tableaux, les vecteurs et
matrices...
Si un tableau (ou une table) au sens informatique du terme peut
se d\'{e}finir via l'instruction \texttt{array},
un vecteur se se d\'{e}finit par l'instruction \texttt{vector}
et une matrice se d\'{e}finit par l'instruction \texttt{matrix}.
Les indices d'un \texttt{array} sont en nombre quelconque.
Leur plage de variation est fixe, num\'{e}rique mais non limit\'{e}e
\`{a} des entiers. Par contre pour \texttt{vector}  et \texttt{matrix}
on indique la valeur maximale des indices car ceux-ci commencent
forc\'{e}ment \`{a} 1.
La principale diff\'{e}rence entre ces trois instructions r\'{e}side dans
la reconnaissance par \Maple\ d'op\'{e}rations sp\'{e}ciales pour
les diff\'{e}rents types.
Il est possible de remplir ces structures indic\'{e}es en fournissant
explicitement la liste des valeurs \`{a} la suite des indications de dimension ou
par fonction sur les indices ou apr\`{e}s la d\'{e}finition avec une boucle
(\texttt{seq}, \texttt{map}, \texttt{for} ...).
A titre d'exemple, nous commen\c{c}ons par construire une liste $L$
de taille 5 dont les valeurs sont $1,2,3,4,5$, puis le vecteur $S$
correspondant \`{a} $L+1$ et nous montrons ensuite comment calculer "\`{a} la main"
puis en notation fonctionnelle la somme $Z$ de $S$ et $L$.
%
\begin{verbatim}
     L := [$1..5] :                # renvoie [1,2,3,4,5]
     S := map( x->x+1, L ) :       # renvoie [2,3,4,5,6]
     Z := L + S ;                  # renvoie [3,5,7,9,11]
     sommeListe := (x,y) -> x+ y :
     Z := sommeListe(L,S) ;        # renvoie [3,5,7,9,11]
\end{verbatim}
%
Passons maintenant aux vecteurs. Comme pr\'{e}c\'{e}dement, nous construisons
un vecteur $V$
de taille 5 dont les valeurs sont $1,2,3,4,5$, puis le vecteur $W$
correspondant \`{a} $V+1$ et nous montrons ensuite comment calculer "\`{a} la main"
puis en notation fonctionelle la somme $U$ de $V$ et $W$.
%
\begin{verbatim}
 V := vector(5,[$1..5]) :                # renvoie [1,2,3,4,5]
 W := vector(5,[ seq(V[i]+1,i=1..5) ]) : # renvoie [2,3,4,5,6]
 sommeVecteur := (x,y) ->
      vector(5,[ seq(x[i]+y[i],i=1..5) ]):
 U := sommeVecteur(V,W) ;                # renvoie [3,5,7,9,11]
\end{verbatim}
%

Pour disposer d'une fonction qui calcule d'elle-m\^{e}me la taille du
vecteur, il faut "ruser". Cette dimension est au-choix
\texttt{nops( convert(x,list)} ou \texttt{nops([ entries(x) ])}.
Malheureusement l'\'{e}criture fonctionnelle avec $->$ oblige
\`{a} \'{e}crire deux fois cette quantit\'{e}. On lui pr\'{e}ferre une \'{e}criture
dite "proc\'{e}durale" qui commence par \texttt{proc}~:
%
\begin{verbatim}
   sommeVecteur := (x,y) ->
   vector( nops( convert(x,list)) ,
           [ seq(x[i]+y[i],i=1..nops( convert(x,list) ) ) ]
         ) ;
\end{verbatim}
%
Pour r\'{e}aliser ce cadrage et cette indentation, on appuie
simultan\'{e}ment sur la touche "Entr\'{e}e" et sur la touche majuscule.

Enfin, prenons la matrice $M$ de taille 3  correspondant \`{a} la table
d'addition, ajoutons-la \`{a} la matrice de la table de soustraction,
multiplions-l\`{a} par elle-m\^{e}me.
%
\begin{verbatim}
   M := matrix(4,4, (i,j) -> i+j ) ;
   N := matrix(4,4, (i,j) -> i-j ) ;
   evalm(M+N)  ;
   evalm(M&*M) ;
\end{verbatim}
%
\newpage
%
\section{Matrices remarquables} % ##
%
\subsection{Matrices nilpotentes}
%
Une matrice $M$ est nilpotente si elle est carr\'{e}e et s'il existe
un nombre $k$ tel que $M^k=O$ o\`{u} $O$ d\'{e}signe ici la matrice nulle.
Montrons que la matrice triangulaire-unit\'{e} (d\'{e}finie par des 1
au-dessus de la diagonale et par des 0 ailleurs) est idempotente~:
%
\begin{verbatim}
     M := matrix(5,5, (i,j) -> if i<j then 1 else 0 fi  ) ;
     U := matrix(5,5, 0) ;
     k := 1 :
     while not( linalg[equal]( evalm(M^k),U) )
     do k := k+1 od :
     print(` ordre de nilpotence : `,k) ;       # renvoie 6
\end{verbatim}
%
\subsection{Matrices de Heisenberg}
%
Une matrice de Heisenberg $M$ est une matrice carr\'{e}e de taille 3
param\'{e}tr\'{e}e par 3 valeurs$a$, $b$ et $c$ et d\'{e}finie par
\begin{center}%
\begin{tabular}{cc}
 $mh(a,b,c)$ $=$ & $\left(
                \begin{tabular}{ccccccc}
                        1&\ &a &\ b \\
                        0&\ &1 &\ c  \\
                        0&\ &0 &\ 1
                \end{tabular}
              \right)$
\end{tabular}
\end{center}


Une fa\c{c}on longue de d\'{e}finir la fonction $mh$ est de commencer
par \'{e}crire un test sur son nombre d'arguments. Cela permet de donner
des indications si le nombre d'arguments est incorrect. On peut aussi
r\'{e}duire la port\'{e}ee d'une fonction ou la sp\'{e}cialiser en imposant qu'elle ne
s'applique qu'\`{a} des entiers, des vecteurs...
Pour cela, au lieu de la forme courte
%
\begin{verbatim}
   mh := (a,b,c) -> ...
\end{verbatim}
%
On utilise la fonction longue proc\'{e}durale
%
\begin{verbatim}
   mh  := proc() local ... global ... ;
   end :
\end{verbatim}
%
o\`{u} \Maple\ renvoie comme r\'{e}sultat de la fonction ce qu'il y a entre parenth\`{e}ses
dans l'instruction \texttt{RETURN(...)}.
%
Le nombre d'arguments est alors \texttt{nargs} et l'argument num\'{e}ro $i$
est fourni par \texttt{args[i]}. Ici par exemple, si \texttt{nargs} est
sup\'{e}rieur \`{a} 1, $a$ vaut \texttt{args[1]}.
Avec la d\'{e}finition ci-dessous de $mh$,
si on tape $mh()$, \Maple\ renvoie alors le texte d'aide qui correspond
\`{a} la partie \texttt{nargs=0}. Sinon, \Maple\ renvoie la matrice demand\'{e}e.
%
\begin{verbatim}
    mh := proc() ;
       if nargs=0 then
          lprint(` mh - matrice de Heisenberg `) ;
          lprint(`      syntaxe : mh(a,b,c) `) ;
          lprint(`      exemple : mh(1.0,3) `) ;
       else
          RETURN( matrix(3,3, [  [ 1 , args[1] , args[3] ] ,
                                 [ 1 ,       1 , args[2] ] ,
                                 [ 0 ,       0 ,       1 ] ]
                        ) # fin de matrix
                ) # fin de RETURN
       fi :
    end ;
\end{verbatim}
%
Soient $m_1$ et $m_2$ les matrices de $Heisenberg$ d\'{e}finies par
$m_1=mh(a,b,c)$ et $m_2=mh(x,y,z)$. Leur somme se calcule par
\texttt{linalg$[$add$]$(m1,m2)}, leur produit par
\texttt{linalg$[$mult$]$(m1,m2)} ou par \texttt{evalm(m1 \&* m2)}.
L'inverse de $m_1$ est donn\'{e} par
\texttt{linalg$[$inverse$]$(m1)}.

??? La non commutativit\'{e} du produit de m1 par m2 est donn\'{e}e
par
\texttt{equal( multiply(m1,m2), multiply(m2,m1) ) }.

Si on d\'{e}finit la matrice identit\'{e} de taille 3 par
\texttt{id3 := array(identity,1..3,1..3)}, on peut \'{e}crire
$mh(a,b,c)$ comme combinaison lin\'{e}aire de
$id_3$,
$mh(1,0,0)$, $mh(0,1,0)$ et $mh(0,0,1)$ avec les coefficients
respectifs $1-a-b-c$, $a$, $b$ et $c$. Une autre fa\c{c}on de faire est
d'utiliser les matrices $mh(a/3,0,0)$, $mh(0,-b,0)$ et $mh(0,0,-c)$,
comme le montrent les instructions suivantes :

Soit $p$ la premi\`{e}re projection : $p = mh(a,b,c) \to\ a$, ce qui s'\'{e}crit
en \Maple\ \texttt{p := m -> m[1,2]}. On peut v\'{e}rifier que $p$ est un morphisme
en \'{e}crivant :

\texttt{???}.

\newpage
%
\subsection{Matrices de repr\'{e}sentations}
%
L'ensemble $sl_2(C)$ est compos\'{e} de matrices carr\'{e}es de taille 2 de trace
nulle. On note $sl2mat(a,b,c)$ une telle matrice, qui s'\'{e}crit donc
%
$$\mat{a}{b}{c}{-a}$$
%
Un probl\`{e}me pos\'{e} est de savoir si une matrice (2,2) appartient a cet
ensemble. On \'{e}crit donc la fonction

\mapleOutLong{
\begin{tabular}{ll}
\hspace{0.9cm} & ismatsl2 := proc(x) : \\
 & RETURN(evalb(linalg[trace](x)=0)) : \\
 & end : \dz\ proc ismatsl2
\end{tabular}
}% end mapleOutLong

ce qui permet de tester si la somme de deux matrices de $sl_2$, leur produit
et le produit d'une matrice par un scalaire est dans $sl_2$ :

\mapleInt{
\begin{tabular}{ll}
 & M := sl2mat(m1,m2,m3): \\
%
%\mapleOut{{$\mat{m1}{m2}{m3}{-m1}$}}
%
 & N := sl2mat(n1,n2,n3): \\
%
%\mapleOut{{$\mat{n1}{n2}{n3}{-n1}$}}
%
 & ismatsl2(M+N) ;
\end{tabular}
}% end mapleIn

\mapleOut{$true$}

\mapleIn{{ismatsl2(M \&* N);}}

\mapleOut{$false$}

\mapleIn{{ismatsl2(k * M);}}

\mapleOut{$true$}
%

On appelle \textit{op\'{e}rateur crochet de Jacobi} de deux matrices $a$ et $b$
la quantit\'{e} $a.b - b.a$. Si on d\'{e}finit ce crochet par

\mapleOutLong{
\begin{tabular}{ll}
\hspace{0.9cm} & sb := proc(a,b) ; \\
 & RETURN( evalm( (a \&* b) - (b \&* a) ) ) : \\
 & end : \dz\ proc sb
\end{tabular}
}% end mapleOutLong

on v\'{e}rifie alors imm\'{e}diatement que le crochet de deux matrices
quelconques est dans $sl_2$.

\mapleIn{ismatsl2( sb(M,N) ) :}

\mapleOut{$true$}

Cet op\'{e}rateur est

\begin{tabular}%
{ll}
 anti-sym\'{e}trique & $[X,Y]=-[Y,X]$), \\
 bilin\'{e}aire      & $[M+P,N] = [M,N] + [P,N]$, \\
                     & $[M,k.N] = k.[M,N]$ :
\end{tabular}

\mapleOut{$true$}

\mapleIn{linalg[equal]( sb(M,N) , -sb(N,M) ) ;}

\mapleOut{$true$}

\mapleIn{linalg[equal]( sb(M+P,N), sb(M,N) + sb(P,N) ) ;}

\mapleOut{$true$}

\mapleIn{linalg[equal]( sb(M,k*N), k*sb(M,N) ) ;}

\mapleOut{$false$}

\mapleIn{linalg[equal]( sb(M,k*N), map(expand,evalm(k*sb(M,N)))) ;}

\mapleOut{$true$}

On appelle identit\'{e} de $Jacobi$ en $x$, $y$ et $z$ de base $f$
la relation $$f(x,f(y,z)) + f(y,f(z,x)) + f(z,f(x,y)) = 0$$.
Montrons que $[..]$ sert de base pour l'identit\'{e} de $Jacobi$
dans $sl_2$ :

\mapleOutLong{
\begin{tabular}{ll}
\hspace{0.9cm} & jacobi := proc(f,x,y,z) local p1,p2,p3 ; \\
& p1 := f(x,f(y,z)) : \\
& p2 := f(y,f(z,x)) : \\
& p3 := f(z,f(x,y)) : \\
& RETURN(linalg[equal](p1+p2+p3,sl2mat(0,0,0))) : \\
& end : \dz\ proc jacobi
\end{tabular}
}% end mapleOutLong

\mapleIn{jacobi(sb,M,N,P) ;}

\mapleOut{$true$}
%
\newpage
%
\section{Suites r\'{e}curentes lin\'{e}aires et Matrices}
%
Soit \textbf{u}=$(u_i)_{i\in N}$ une suite d'entiers. On appelle
matrice de Hankel d'ordre $p$ associ\'{e}e \`{a} \textbf{u} la matrice
carr\'{e}e de taille $p$ dont l'\'{e}lement en ligne $i$, colonne $j$
vaut $u_{i+j-1}$. On appelle dimension de Hankel de \textbf{u}
la taille de la plus petite matrice de Hankel de \textbf{u}
dont le d\'{e}terminant est nul. Calculer cette dimension pour
%

\begin{tabular}%
{lll}
 \hspace{3cm} & a) & $u(i)=3^i$       \\
              & b) & $u(i)=i^2$       \\
              & c) & $u(i)=3^i+i^2$   \\
\end{tabular}

On appelle matrice PDOL une matrice carr\'{e}e \`{a} coefficients dans N.
Si $M$ est une telle matrice, la fonction qui \`{a} $n$ entier associe
le nombre $G\ .\ M^n\ . D$ (o\`{u}
$G$ est le vecteur $(1\ 0\ 0\ ...\ 0)$
et $D$ est la transpos\'{e}e du vecteur $(1\ 1\ 1\ ...\ 1)$)
est nomm\'{e} suite de croissance de M.

Calculer la dimension de
Hankel de la suite de croissance des matrices suivantes.

\begin{tabular}%
{lll}
 \hspace{3cm} & a) & $M(i,j)=i+j$   \\
 \hspace{3cm} & b) & $M(i,j)=i+j$ si $i\leq j$ et $0$ sinon        \\
              & c) & $M= \left( \begin{tabular}{lllll}
                                  2&1&0&0&0 \\
                                  0&2&1&0&0 \\
                                  0&0&3&0&0 \\
                                  0&0&0&2&1 \\
                                  0&0&0&0&1
                          \end{tabular}\right)$
\end{tabular}
%
\newpage
%
\section{Compl\'{e}ments sur les structures}
%
Nous fournissons ici les principales fonctions
utilisables sur les structures $listes$ et $ensembles$~:

%

\begin{center}
\begin{tabular}{|l|l|}        \hline
 ensemble &   union        \\ \hline
          &   intersection \\ \hline
          &   minus        \\ \hline
          &   select       \\ \hline
 liste    &   member       \\ \hline
          &   subsop       \\ \hline
\end{tabular}
\end{center}
%
Signalons au passage que les fonctions
\texttt{convert},
\texttt{map},
\texttt{nops},
\texttt{op},
\texttt{seq}
\texttt{sort}
s'appliquent (au moins) \`{a} ces deux types de structures.

\end{document}
