\documentclass{article}
\oddsidemargin 5 mm
\evensidemargin 5 mm
\textwidth 16cm
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{latexsym}
\usepackage{amssymb}
\usepackage{times}
\usepackage{ifpdf}
\usepackage{makeidx}
\usepackage{graphicx}
\ifpdf
 \usepackage[pdftex,colorlinks]{hyperref}
\else
 \usepackage[ps2pdf,breaklinks=true,colorlinks=true,linkcolor=red,citecolor=green]{hyperref}
 \fi

\newtheorem{rem}{Remarque}
\newcommand{\R}{{\mathbb{R}}}
\newcommand{\C}{{\mathbb{C}}}
\newcommand{\Z}{{\mathbb{Z}}}
\newcommand{\N}{{\mathbb{N}}}
\newcommand{\Q}{{\mathbb{Q}}}
\newcommand{\faux}{$\square\;$}
\newcommand{\vrai}{$\square\;$}
%\newcommand{\vrai}{$\boxtimes\;$}
%\newcommand{\item}{\item \faux}
%\newcommand{\item}{\item \faux}

\newtheorem{exo}{Exercice}[section]

\title{TP de math\'ematiques.}

\author{Licence 2-Mat 406}
\date{2022}

\makeindex

\begin{document}
\topmargin -1 cm
\textheight 23cm
\textwidth 16.5cm \columnsep 10pt \columnseprule 0pt

{\Large \noindent Mat406 \hfill TP \hfill UGA}

\section{TP de prise en main}
Nous utiliserons Xcas, 
sur les PC du DLST il se lance \`a partir de l'icone Xcas du bureau
ou directement
depuis un navigateur (Firefox recommandé)\\
\verb|https://www-fourier.univ-grenoble-alpes.fr/~parisse/xcasfr.html|\\
Vous pouvez aussi utiliser Xcas sur votre propre ordinateur depuis
Firefox, Chrome ou Edge (Safari non supporté), ou en l'installant 
cf. \\\verb|www-fourier.ujf-grenoble.fr/~parisse/install_fr.html|
(sur Mac, il est conseillé d'installer Xcas à l'intérieur d'une
machine virtuelle Linux).
Vous pouvez également travailler sur calculatrice.

Attention, lors de votre première utilisation au DLST,
il faut avoir lancé le navigateur par défaut de Windows (Edge) au moins
une fois pour pouvoir accéder à la documentation en ligne de Xcas.

Si vous avez l'habitude d'utiliser un interpréteur comme Python
ou un logiciel de calcul scientifique, vous pouvez directement
faire le TP de prise en main. Pour trouver un nom de commandes,
regardez d'abord dans le menu Outils, puis Cmds si vous ne trouvez pas
dans le menu Outils, ou dans
le menu Graphe qui fournit des assistants pour les repr\'esentations
graphiques.
Vous pouvez aussi commencer par
parcourir le tutoriel, celui-ci est accessible depuis le menu
\verb|Aide, Debuter en calcul formel|. Lisez
jusqu'au paragraphe 2.4 (vous pouvez sauter le paragraphe 2.2 sur les
chaines de caract\`eres), puis passez au TP de prise en main.


Pour sauvegarder une session, avec Xcas PC, utilisez le menu Fich,
avec Xcas web, vous pouvez vous envoyer un email contenant un lien
qui sauvegarde votre session, cliquez sur l'icone d'enveloppe en haut.
{\bf Faites des sauvegardes régulières}, c'est en particulier
conseillé avant de tester un programme. Si vous avez des difficultés
à sauvegarder sur votre espace personnel sur le réseau, vous
pouvez utiliser une clef USB. Vous pouvez aussi exporter une session
au format lisible sur calculatrices (Khicas Casio).

Les TP qui suivent le TP de prise en main
demandent souvent d'\'ecrire des petits programmes, pour
cela utilisez le menu Prg nouveau programme de Xcas PC
ou tapez directement votre programme en ligne de commande
avec Xcas web (taper shift-entr\'ee pour passer \`a la ligne).
Si vous voulez utiliser la syntaxe compatible avec Python,
dans Xcas PC v\'erifiez que \verb|python| apparait dans la ligne
d'\'etat, sinon cliquez sur cette ligne et modifiez, dans Xcas web
validez en cliquant sur le bouton cyan Cas.
Pour plus de d\'etails sur la programmtion, 
vous pouvez consulter le tutoriel.


%\subsection{Utilisation interactive}
\begin{enumerate}
\item \'Ecrire le polyn\^ome $(x+3)^7 \times (x-5)^6$ selon les puissances
d\'ecroissantes de $x$.

\item Simplifier les expressions suivantes:
\[ \quad \sqrt{3+2\sqrt{2}},
\quad \frac{1+\sqrt{2}}{1+2\sqrt{2}}, \quad
e^{i\pi/6}, \quad 4\mbox{atan}(\frac{1}{5})-\mbox{atan}(\frac{1}{239}) \]

\item Factoriser~:
\[ x^8-3x^7-25x^6+99x^5+60x^4-756x^3+1328x^2-960x+256 \]
\[ x^6-2x^3+1, \quad (-y+x)z^2-xy^2+x^2y \]

\item Calculez les int\'egrales et simplifiez le r\'esultat:
\[ \int \frac{1}{e^x-1} \ dx, \quad
\int  \frac{1}{x\ln(x)} \ln(\ln(x)) dx, \quad \int e^{x^2} \ dx,
\quad \int x\sin(x)e^{x} \ dx \]
V\'erifiez en d\'erivant les expressions obtenues.

\item D\'eterminer la valeur de:
\[\int _1^2\frac{1}{(1+x^2)^3}, \quad  \int _1^2 \frac{1}{x^3+1} \ dx \]

\item Calculer les sommes suivantes
\[\sum_{k=1}^N k,\ \sum_{k=1}^N k^2,\ \sum_{k=1}^\infty \frac{1}{k^2}\]

\item D\'evelopper $\sin(3x)$, lin\'eariser l'expression obtenue
et v\'erifier qu'on retrouve l'expression initiale.

\item Calculer le d\'eveloppement de Taylor en $x=0$ \`a l'ordre 4
de:
\[ \ln(1+x+x^2),\quad
\frac{\exp(\sin(x))-1}{x+x^2} , \quad \sqrt{1+e^{x}}, \quad
\frac{\ln(1+x)}{\exp(x)-\sin(x)} \]

\item Trouver les entiers $n$ tels que le reste de la division
euclidienne de $123 n $ par 256 soit 17.

\item D\'eterminer la liste des diviseurs de 45768. \\
Factoriser 100!

\item R\'esoudre le syst\`eme lin\'eaire:
\[ \left\{ \begin{array}{lllllll}
 x &+& y &+& az&=&1\\
 x & +& a y&+& z&=&2 \\
 ax & +&y &+& z&=&3 
\end{array}\right. \]

\item D\'eterminer l'inverse de la matrice~:
\[ A=\left(\begin{array}{llll}
 1 & 1 & 1 & a \\
 1 & 1 & a & 1 \\
 1 & a & 1 & 1 \\
 a & 1 & 1 & 1
\end{array}\right)\]
%Diagonaliser la matrice $A$.
\end{enumerate}

%\end{document}
%\pagebreak

%\printindex

%\tableofcontents


\section{TP1: Suites r\'ecurrentes}

{\em On souhaite \'etudier des suites r\'ecurrentes $(u_n)$ d\'efinies par
  $u_{n+1}=f(u_n)$ et $u_0$, o\`u $f$ est une fonction de $\R$
  dans $\R$, par exemple $f(x)=\sqrt{2+x}$.}

\vspace{4mm}

{\bf Exercice 1} 
\begin{enumerate}
\item 
  En utilisant le tableur de Xcas (menu Tableur), repr\'esenter
  les premiers termes de la suite
  $u_{n+1}=\sqrt{2+u_n}$ avec $u_0=0.1$ ou $u_0=1/10$ (menu Math->suite
  r\'ecurrente du tableur).
\item Calculer ensuite en mode exact et approch\'e
  les 10 premiers termes de la suite~:
  vous pouvez d\'efinir la cellule
  \verb|A1| par \verb|=sqrt(2+A0)|, puis taper Ctrl-D.
% d\'eplacer la souris vers la partie situ\'e en bas
% \`a droite de la cellule \verb|A1| (le curseur souris change de forme), puis
% appuyer sur le bouton de la souris et rel\^acher \`a la fin de la zone
%  o\`u vous voulez copier la formule d\'efinissant \verb|A1|.
\item Essayez avec $u_{n+1}=\frac{u_n+3}{u_n+1}$.
\item   Quels sont les avantages 
  et inconv\'enients d'utiliser une valeur initiale exacte ou
  approch\'ee?
\end{enumerate}


\vspace{4mm}

{\em La feuille de calcul pr\'ec\'edente donne une id\'ee de la convergence
de la suite, mais ne donne aucune information quantitative
sur la vitesse de convergence. Au lieu de calculer un nombre fix\'e
de termes de la suite, on va \'ecrire un programme
avec un test d'arr\^et selon la
valeur $|u_{n+1}-u_n|$ compar\'e \`a un nombre positif (petit)
$\varepsilon$ fix\'e \`a l'avance. Pour \'eviter que le programme ne boucle
ind\'efiniment lorsque la suite ne converge pas (ou converge
trop lentement pour la machine), on fixe aussi un nombre maximal
d'it\'eration $N$.}

\vspace{4mm}

{\bf Exercice 2} \\
\'Ecrire un programme \verb|iter| prenant en argument
la fonction $f$, la valeur de $u_0$, de $N$ et de $\varepsilon$, et
qui s'arr\^ete d\`es que l'une des conditions suivantes est satisfaite~:
\begin{itemize}
\item $|u_{n+1}-u_n|<\varepsilon$ 
\item le nombre d'it\'erations d\'epasse $N$.
\end{itemize}
Dans le premier cas le programme renverra la valeur de $u_{n+1}$, dans
le second cas une s\'equence compos\'ee de $u_N$ et de $N$.\\
Tester votre programme avec $f(x)=\sqrt{2+x}$ et $f(x)=x^2$.


\vspace{4mm}

{\em On suppose que la fonction $f$ satisfait aux hypoth\`eses du
  th\'eor\`eme du point fixe.  On notera $k<1$ la constante de contractance.
  % et $l := \lim u_n$ la limite $l$ de la suite $(u_n)$.
  On peut alors trouver un encadrement de la limite $l$ 
  de la suite $(u_n)$ en fonction de $u_n$, $u_{n-1}$ et $k$.}

\vspace{4mm}

{\bf Exercice 3} \\
\'Ecrire un programme \verb|iter_k| prenant en argument
la fonction $f$, la valeur de $u_0$, la constante $k$ et l'\'ecart tol\'er\'e $\varepsilon$, 
et qui s'arr\^ete d\`es que $| u_n - l | \le \varepsilon$.

V\'erifier les hypoth\`eses du th\'eor\`eme du point fixe pour $f(x)=2\cos(x/3)$ 
sur $[0,2]$ et expliciter une constante de contractance $k$.
D\'eterminer une valeur approch\'ee de la limite de $(u_{n})$
\`a \verb|1e-3| pr\`es en utilisant la fonction \verb|iter_k|.
% (ou la fonction \verb|iter| de l'exercice pr\'ec\'edent).


\vspace{4mm}

{\em La convergence de ces suites est en g\'en\'eral {\em lin\'eaire},
  le nombre de d\'ecimales exactes augmente de la m\^eme valeur
  \`a chaque it\'eration. Par contre lorsqu'on est pr\^et d'une racine,
  la m\'ethode de Newton permet en gros de multiplier par deux le nombre
  de d\'ecimales \`a chaque it\'eration.}

\vspace{4mm}


{\bf Exercice 4}
\begin{enumerate}
\item Donner une suite it\'erative obtenue par la m\'ethode de Newton
  convergeant vers $\sqrt{7}$. 
\item Montrer que la fonction $f \colon \R_+ \to \R_+$ d\'efinie par 
  \[ f(x)=\frac{7x+7}{x+7} \]
  admet $\sqrt{7}$ pour point fixe.  Trouver un intervalle $I$ 
  contenant $\sqrt{7}$ sur lequel les hypoth\`eses du th\'eor\`eme du point fixe 
  sont satisfaites et expliciter une constante de contractance $k$.
\item Comparer au tableur la vitesse de convergence des 10 premiers
  termes des deux suites (calculez les avec par exemple
  40 chiffres significatifs et faites \verb|evalf(.,40)| sur
les diff\'erence entre 2 termes successifs).
\item En utilisant la fonction \verb|iter_k|, trouver un encadrement de 
  $\sqrt{7}$ \`a \verb|1e-6| pr\`es pour le point fixe. 
Combien d'it\'erations sont n\'ecessaires~? 
Donner aussi un encadrement par la m\'ethode de Newton en utilisant
$u_4$.
Dans les 2 cas, on pourra
  prendre une valeur initiale approch\'ee puis enti\`ere exacte pour avoir
  une valeur num\'erique approch\'ee puis une fraction.
  
\end{enumerate}


\vspace{4mm}

{\em Dans certains cas, la fonction $f$ n'est pas contractante, mais
  on peut r\'e\'ecrire l'\'equation \`a r\'esoudre sous une autre
  forme avec une fonction contractante, par exemple en utilisant
  une fonction r\'eciproque.}

\vspace{4mm}

{\bf Exercice 5}\\
Donner un encadrement \`a \verb|1e-6| pr\`es d'une racine
de l'\'equation $\tan(x)=x$ sur l'intervalle $]3\pi/2,5\pi/2[$ en
utilisant une m\'ethode de point fixe. On observera qut $\tan$ n'est
pas contractante mais que sa fonction r\'eciproque l'est (attention
\`a y ajuster correctement un multiple entier de $\pi$).\\
On peut aussi appliquer la m\'ethode de Newton sur cet exemple.


%\pagebreak
\section{TP2: Types. Calcul exact et approch\'e. Algorithmes de bases}
\begin{enumerate}
\item Utiliser la commande {\tt type} pour d\'eterminer la repr\'esentation
utilis\'ee par le logiciel pour repr\'esenter
une fraction, un nombre complexe, un flottant en pr\'ecision machine, 
un flottant avec 100 d\'ecimales, la variable $x$, l'expression $\sin(x)+2$,
la fonction {\tt x->sin(x)}, une liste, une s\'equence, un vecteur,
une matrice. Essayez d'acc\'eder aux parties de
l'objet pour les objets composites (en utilisant {\tt op} par exemple).

\item D\'eterminer le plus petit entier $n$
tel que $(1.0+2^{-n})-1.0$ renvoie 0 sur PC avec la pr\'ecision par
d\'efaut puis avec \verb|(evalf(1,30)+2^(-n))-evalf(1,30)|. 
M\^eme question sur votre calculatrice si vous en avez une.

\item Calculer la valeur de $a:=\exp(\pi \sqrt{163})$ avec 30 chiffres
significatifs (\verb|evalf(.,30)|, 
puis sa partie fractionnaire (\verb|frac(.)|). Proposez une commande
permettant de d\'ecider si $a$ est un entier.

\item 
D\'eterminer la valeur et le signe de la fraction rationnelle 
\[ F(x,y)= \frac{1335}{4} y^6 + x^2 (11x^2 y^2-y^6 -121y^4-2) + 
\frac{11}{2} y^8 + \frac{x}{2y}\]
en $x=77617$ et $y=33096$ en faisant deux calculs, l'un en mode approch\'e 
(\verb|F(77617.0,33096.0)| ou \verb|F(evalf(77617,30),evalf(33096,30))|) et 
l'autre en mode exact. Que pensez-vous de ces r\'esultats?
Combien de chiffres significatifs faut-il pour obtenir un r\'esultat
raisonnable en mode approch\'e?

\item \`A quelle vitesse votre logiciel multiplie-t-il des
grands entiers (en fonction du nombre de chiffres)? 
On pourra tester le temps de calcul $t(n)$ (\verb|time(a*(a+1))[0]|) du produit
de $a \times (a+1)$ pour $a=10^n$ avec $n=10000,20000,40000$. Comment
\'evolue le temps de calcul lorsque le nombre de d\'ecimales double~?

\item Comparer le temps de calcul de $a^n \pmod m$ par la fonction
\verb|powmod| et la m\'ethode ``prendre le reste modulo $m$ apr\`es avoir 
calcul\'e $a^n$''
(vous pouvez aussi programmer la m\'ethode rapide et la m\'ethode
lente, cf. par exemple l'article exponentation rapide de wikipedia).

\item Programmation de la m\'ethode de Horner (TD exercices 12 et 13)\\
Il s'agit d'\'evaluer efficacement un polyn\^ome 
$ P(X) = a_n X^n + ... + a_0 $
en un point.
On pose $b_0=P(\alpha )$ et on \'ecrit~:
\[ P(X)-b_0=(X-\alpha )Q(X) \]
o\`u~:
\[ Q(X) = b_n X^{n-1} + ... +b_2 X + b_1 \]
On calcule alors par ordre d\'ecroissant $b_n$, $b_{n-1}$, ..., $b_0$.
\begin{enumerate}
\item
Donner $b_n$ en fonction de $a_n$ puis pour $i\leq n-1$, $b_i$
en fonction de $a_i$ et $b_{i+1}$. Indiquez le d\'etail des calculs
pour $P(X)=X^3-2X+5$ et une valeur de $\alpha $ enti\`ere non nulle.
\item \'Ecrire un fonction \verb|horn| effectuant ce calcul:
on donnera en arguments le polyn\^ome sous forme de la
liste de ces coefficients (dans l'exemple \verb|[1,0,-2,5]|) et la
valeur de $\alpha $ et le programme renverra $P(\alpha )$.
(On pourra aussi renvoyer les coefficients de $Q$).
\item
En utilisant cette fonction, \'ecrire une fonction qui calcule
le d\'eveloppement de Taylor complet d'un polyn\^ome en un point.
\end{enumerate}

\end{enumerate}

%\pagebreak

\section{TP3: S\'eries enti\`eres}

{\bf Exercice 1.} 
\begin{enumerate}
\item Rappeler le d\'eveloppement de Taylor $T_{2n+1}(x)$ 
  au voisinage de $x=0$ de $f(x)=\sin(x)$ \`a l'ordre $2n$.
\item Tracer sur un m\^eme graphique les graphes des fonctions $f$ et
  $T_1, T_3, T_5, T_7$
\item 
  Graphiquement on voit que $T_7(x)$ approche $\sin(x)$ : sur quel intervalle 
  cette approximation vous para\^{\i}t-elle acceptable ?
\item
  Donner une majoration du reste $R_{2n+1}(x)$ du d\'eveloppement
  de Taylor de $f$ \`a l'ordre $2n+1$, o\`u $f(x)=T_{2n+1}(x)+R_{2n+1}(x)$.
\item
  On prend $T_7(x)$ comme valeur approch\'ee de $\sin(x)$ pour $x \in [-1,1]$. 

  Donner une majoration ind\'ependante de $x$ de l'erreur commise.

  (A titre d'illustration, tracer la diff\'erence $T_7(x)-\sin(x)$.)
\item
  En d\'eduire un encadrement de $\sin(1)$.
\end{enumerate}

\vspace{3mm}

{\bf Exercice 2.} 
On veut approcher $\cos(x)$ \`a \verb|1e-6| pr\`es 
en utilisant des d\'eveloppements en s\'eries enti\`eres.
\begin{enumerate}
\item D\'eterminer le plus petit $k$ tel que:
  \[ T_{2k}(x)=\sum_{j=0}^k (-1)^{j}\frac{x^{2j}}{(2j)!} \]
  r\'ealise cette approximation sur $[0,\pi/4]$.
\item
  \'Ecrire une fonction qui calcule une valeur approch\'ee \`a 
  \verb|1e-6| de $\cos(x)$ sur $[-\pi/2,\pi/2]$ 
en justifiant et en effectuant les
  \'etapes suivantes:
  \begin{itemize}
 \item si $x$ est n\'egatif, on remplace $x$ par $-x$ (que devient $\cos(x)$?)
  \item lorsque $x \in [0,\pi/4]$, on utilise le 
    d\'eveloppement en s\'eries ci-dessus.
  \item lorsque $x \in [\pi/4,\pi/2]$, on se ram\`ene au d\'eveloppement
    de l'exercice pr\'ec\'edent en posant $y=\pi/2-x \in [0,\pi/4]$,
    et en appliquant $\cos(x)=\sin(y)$ 
  \end{itemize}
\item 
Exprimer $\cos(x-k\pi)$ en fonction de $\cos(x)$ pour $k \in \Z$.
Dans quel intervalle se trouve $x-k \pi $ si $k$ est l'entier le plus
proche de $x/\pi$ (fonction \verb|round| de Xcas)~?
 \'Ecrire une fonction qui calcule une valeur approch\'ee \`a 
  \verb|1e-6| de $\cos(x)$ sur $[-100,100]$ en se ramenant au
  programme pr\'ec\'edent.
  Afin de tester votre fonction $f$ et \'eviter d'\'eventuelles erreurs 
  grossi\`eres,
  faites afficher le graphe de $f$, disons sur l'intervalle $[-10,10]$, 
  puis le graphe 
  de la diff\'erence $f-\cos$ o\`u $\cos$ est la fonction d\'ej\`a impl\'ement\'ee dans Xcas. On peut utiliser la commande \verb|seq| pour générer
un échantillonage régulier de valeurs, et \verb|plotlist| pour la
représenter ou \verb|polygonscatterplot| avec la liste des
abscisses correspondantes.
\end{enumerate}

\vspace{3mm}

{\bf Exercice 3} 
\begin{enumerate}
\item Pour $x>0$ exprimer $\arctan(-x)$ en fonction de $\arctan(x)$. 
  Calculer la d\'eriv\'ee de $\arctan(x)+\arctan(1/x)$, 
  en d\'eduire $\arctan(1/x)$ en fonction de $\arctan(x)$ pour $x>0$.
  En d\'eduire que le calcul de $\arctan(x)$ sur $\R$
  peut se ramener au calcul de $\arctan(x)$ sur $[0,1]$.
\item
  Rappeler le d\'eveloppement en s\'eries enti\`eres de $\arctan(x)$ en $x=0$,
  et son rayon de convergence.  Soit $\alpha \in [0,1]$, montrer que
  \[ \alpha-\frac{\alpha^3}{3}+\frac{\alpha^5}{5} - \frac{\alpha^7}{7}
  \leq \arctan(\alpha) \leq \alpha-\frac{\alpha^3}{3}+\frac{\alpha^5}{5} 
  \]
  en d\'eduire que la m\'ethode de Newton appliqu\'ee \`a 
  l'\'equation $\tan(x)-\alpha=0$ avec comme valeur initiale
  $\alpha-\frac{\alpha^3}{3}+\frac{\alpha^5}{5}$ 
  est une suite d\'ecroissante qui converge vers $\arctan(\alpha)$.
\item
  D\'eterminez par cette m\'ethode une valeur approch\'ee 
  \`a \verb|1e-8| pr\`es de $\pi/4= \arctan(1)$.
\item
  On pourrait calculer $\pi/4$ avec la
  m\^eme pr\'ecision en utilisant le d\'eveloppement en s\'eries
  de la formule de Machin
  \[ \frac{\pi}{4} = 4 \arctan(\frac{1}{5}) - \arctan(\frac{1}{239}) \]
  Combien de termes faudrait-il calculer dans le d\'eveloppement des
  deux arctangentes?
\end{enumerate}


{\bf Exercice 4} 
\begin{enumerate}
\item
  \'Ecrire le d\'eveloppement en s\'eries enti\`eres  au voisinage de $x=0$ de:
  \[ g(x)=\frac{e^{-x}-1}{x} \]
\item
  On veut calculer une valeur approch\'ee de
  \[ I=\int_0^1 g(x) \ dx \]
  En utilisant le d\'eveloppement de $g$,
  \'ecrire $I$ sous la forme d'une s\'erie $\sum_{j=0}^\infty v_j$.
  % de terme g\'en\'eral $v_j$.
\item
  Soit $R_n=\sum_{j=n+1}^\infty v_j$ le reste de cette s\'erie.
  Donner une majoration de $|R_n|$.
\item En d\'eduire un encadrement
  de $I$ faisant intervenir $\sum_{j=0}^n v_j$. 
  Calculer explicitement cet encadrement lorsque $n=10$.
\end{enumerate}

\vspace{3mm}

{\bf Exercice 5} \\
Cet exercice reprend les calculs de $\ln(x)$ et $\exp(x)$ discut\'es en cours
dans l'objectif de les illustrer par vos propres exp\'eriences sur ordinateur.
\begin{enumerate}
\item
  La s\'erie altern\'ee $s_n = \sum_{k=1}^n (-1)^{k+1} \frac{1}{k}$ 
  tend vers $\ln(2)$, et les termes cons\'ecutifs donnent 
  des encadrements $s_{2m+1} < \ln(2) < s_{2m}$.
  Jusqu'\`a quel rang faut-il aller afin de garantir un encadrement 
  \`a $10^{-5}$ pr\`es?  Calculer cette approximation de $\ln(2)$ 
  avec Xcas.  M\^eme question pour $10^{-10}$.  Qu'observez-vous?

  On consid\`ere ensuite la s\'erie $\ln(2) = \sum_{k=0}^\infty \frac{2}{(2k+1) 3^{2k+1}}$.
  Jusqu'\`a quel rang faut-il aller afin de garantir une approximation 
  \`a $10^{-5}$ pr\`es?  Calculer cette approximation de $\ln(2)$ avec Xcas.
  M\^eme question pour $10^{-10}$.  Conclusion?

\item
  On se propose d'approcher $\exp(x) = \sum_{k=0}^\infty \frac{x^k}{k!}$
  pour $x = -32$.  Avant de se lancer dans ce calcul, estimer l'ordre de grandeur 
  de $\exp(-32)$ puis l'ordre de grandeur des plus grands termes dans la somme.

  Jusqu'\`a quel rang faut-il aller afin de garantir une approximation \`a $10^{-20}$ pr\`es?  
  Calculer cette approximation de $\exp(-32)$ avec Xcas, d'abord
  en utilisant la pr\'ecision standard de 53 bits, soit 16 d\'ecimales.
  Quel probl\`eme observez-vous?  On pourra augmenter la pr\'ecision 
  des nombres flottants utilis\'es: quelle pr\'ecision est n\'ecessaire, 
  environ, pour raisonnablement effectuer ce calcul?

  Est-ce que ces probl\`emes se posent pour l'approximation de $a_0 = \exp(-1)$?
  Comment en d\'eduire une approximation de $\exp(-32)$ avec un minimum d'op\'erations?
  % Une fois cette valeur calcul\'ee, on peut en d\'eduire
  % $a_1 = a_0^2$, $a_2 = a_1^2$, \dots, $a_5 = a_4^2$
  % avec seulement $5$ multiplications et avec une bonne pr\'ecision.
\end{enumerate}

{\bf Exercice 6}\\
On reprend des id\'ees des exercices 4 et 5 pour impl\'ementer le
calcul de la fonction
sinus int\'egral d\'efinie par~:
\[ \mbox{\bf Si}(x)=\int_0^x \frac{\sin(t)}{t} \ dt \]
\begin{enumerate}
\item Donner un d\'eveloppement en s\'eries enti\`eres de la fonction {\bf Si}, ainsi
que le rayon de convergence, et une majoration du reste en fonction de $x$.
\item Lorsque $x>1$, on a le probl\`eme de la s\'erie qui ``commence par diverger''
(comme pour l'exponentielle de l'exercice 5.2), mais sans possibilit\'e de ``r\'eduire l'argument''.
Combien de chiffres significatifs perd-on lorsqu'on calcule {\bf Si}$(x)$ par la s\'erie
enti\`ere~? (En pratique, on calculera la s\'erie avec ce nombre de chiffres significatifs
en plus).
\item Lorsque $x$ est grand, on pr\'ef\`ere utiliser le d\'eveloppement asymptotique 
de la fonction {\bf Si}. On admettra que
\[ \int_0^{+\infty} \frac{\sin(t)}{t} \ dt  = \frac{\pi}{2}\]
On calcule alors {\bf Si} en faisant des int\'egrations par parties successives, en int\'egrant la
fonction trigonom\'etrique et en d\'erivant la fraction rationnelle. Les termes tout int\'egr\'e
donnent le d\'eveloppement asymptotique, et l'int\'egrale le reste. Par exemple, calculer
le d\'eveloppement asymptotique \`a l'ordre 10 et une majoration du reste pour $|x| \geq 100$.
En d\'eduire une valeur approch\'ee de {\bf Si}(100).
\item En calculant {\bf Si}(100) \`a l'aide du d\'eveloppement en s\'eries enti\`eres, en d\'eduire
une valeur approch\'ee de $\pi$.
\end{enumerate}

\section{TP4: Polyn\^omes}

%\section{Exercices}
{\bf Exercice 1} \\
Donner le d\'etail des calculs avec B\'ezout de la d\'ecomposition
en \'el\'ements simples de~:
\[ f(x)=\frac{1}{(x^2-4)(x-1)}\]
en d\'eduire~:
\begin{itemize}
\item une primitive de $f$
\item le coefficient de $x^n$ du d\'eveloppement en s\'eries
enti\`eres de cette fraction en 0.
\end{itemize}

{\bf Exercice 2}\\ 
Factoriser sur $\Q$ (\verb|factor|) et sur $\Q[i]$ (\verb|cfactor|)
le polyn\^ome
$P(x)=x^6+x^4+x^3+x^2+x+1$. Quels sont les degr\'es des facteurs ?
Factoriser sur $\R$ et sur $\C$ le polyn\^ome $P$ en appliquant
\verb|factor| et \verb|cfactor| \`a \verb|evalf(P)|.
En regroupant les racines (commande \verb|proot|) de $P$, retrouver la factorisation exacte
de $P$ dans $\R$ et $\C$.

{\bf Exercice 3}\\
Trouver une racine approch\'ee du polyn\^ome $P$ ci-dessus en appliquant
la m\'ethode de Newton avec une valeur initiale complexe al\'eatoire.
Donner un encadrement d'une racine de $P$ correspondante.
\'Eliminer cette racine par division
euclidienne, chercher une autre racine, etc. jusqu'\`a obtenir
la factorisation compl\`ete de $P$. Comparer la valeur de $P$
et celle obtenue en d\'eveloppant le produit des $X-$racine.\\
Bonus~:
\'Ecrire une fonction qui cherche une racine d'un polyn\^ome
en utilisant la m\'ethode de Newton. Ajouter un test pour
\^etre s\^ur que la racine du polyn\^ome est simple.
Tester avec le polyn\^ome $P$ ci-dessus.\\
Modifier la fonction ci-dessus pour trouver toutes
les racines, lorsqu'on trouve une racine $r$
on applique une des méthodes suivantes:
\begin{itemize}
\item on divise le polyn\^ome 
par $X-r$, et on relance la recherche de racines sur le
polyn\^ome obtenu,
\item si $P=(x-r)Q$ alors $Q'/Q=P'/P-1/(x-r)$ qu'on applique pour
faire une itération de Newton sur $Q$.
\end{itemize}

{\bf Exercice 4}\\
\'Ecrire une fonction qui d\'etermine les racines rationnelles 
d'un polyn\^ome $P$ \`a coefficients entiers (elles sont
de la forme $p/q$ o\`u $q$ divise le coefficient
dominant de $P$ et $\pm p$ divise son coefficient de plus bas degr\'e).
Tester avec le polyn\^ome $P=12x^5+10x^4-6x^3+11x^2-x-6$.

{\bf Exercice 5}\\
En utilisant les suites de Sturm, d\'eterminer le nombre
de racines du polyn\^ome $P$ ci-dessus sur l'intervalle
$[-3,0]$ (faites le calcul directement avec \verb|sturmab|,
puis en appliquant l'algorithme du cours avec les fonctions
\verb|rem| pour les divisions et \verb|horner| pour \'evaluer
un polyn\^ome en un point). M\^eme question sur $\R$ tout entier.

{\bf Exercice 6}\\
Repr\'esenter sur un m\^eme graphe $\cos(x)$ et
son polyn\^ome interpolateur de Lagrange
en utilisant les 7 points d'abscisses \'equidistantes $\{0,\pi/6,...,\pi\}$.
Donner une majoration de l'erreur entre ce polynome et la fonction
$\cos$ en un r\'eel $x$, repr\'esenter graphiquement
cette erreur pour $x \in [0,\pi]$. O\`u l'erreur est-elle
la plus grande~?

{\bf Exercice 7} \\
\'Ecrire un programme calculant les coefficients du
polyn\^ome d'interpolation de Lagrange par l'algorithme des
diff\'erences divis\'ees.


{\bf Exercice 8}\\
\'Eliminer successivement $a$ et $b$ 
du syst\`eme~:
\[
\left\{\begin{array}{rcl}
a^{3}+b^{3}+c^{3} & = & 8 \\
a^{2}+b^{2}+c^{2} & = & 6 \\
a+b+2c & = & 4
\end{array}\right.
\]
puis trouver les racines du polyn\^ome en $c$, puis calculer les
valeurs de $b$ puis $a$ correspondantes (en cherchant les racines
du PGCD des 2 puis 3 \'equations en $b$ puis $a$ apr\`es remplacement
de $c$ puis $b$ par leurs valeurs).

%\pagebreak

\section{TP5: Int\'egration}
{\bf Exercice 1}~:
Calculer une valeur approch\'ee de
\[ \int_0^1 \frac{dx}{1+x}\]
par la m\'ethode des rectangles, du point milieu et des trap\`ezes
en utilisant un pas de $1/10$ et de $1/100$ (vous pouvez utiliser les fonctions
\verb|plotarea|, \verb|area| avec la m\'ethode en argument, ou utiliser le
tableur ou \'ecrire un programme effectuant ce calcul avec comme arguments
la fonction, la borne inf\'erieure, la borne sup\'erieure et le nombre
de subdivision). Observez num\'eriquement
la diff\'erence entre les valeurs obtenues et la valeur exacte de 
l'int\'egrale.

{\bf Exercice 2} \\
Calculer le polyn\^ome interpolateur $P$ de Lagrange de $f(x)=\frac{1}{1+x^2}$
aux points d'abscisse $\frac{j}{4}$ pour $j$ variant de 0 \`a 4.
Donner un majorant de la diff\'erence entre $P$ et $f$ en un point
$x \in [0,1]$. Repr\'esenter graphiquement ce majorant.
Calculer une majoration de l'erreur entre l'int\'egrale de $f$
et l'int\'egrale de $P$ sur $[0,1]$.
En d\'eduire un encadrement de $\pi/4$.

{\bf Exercice 3}\\
On reprend le calcul de $\int_0^1 \frac{dx}{1+x}$ mais en utilisant
un polyn\^ome interpolateur de degr\'e 4 sur chacune des 
$N$ subdivisions de $[0,1]$ (de pas $h=1/N$). Le premier
polyn\^ome interpolateur est donc calcul\'e en les points
$0, 1/4/N, 2/4/N, 3/4/N,1/N$, le deuxi\`eme en les points
$1/N,1/N+1/4/N, 1/N+2/4/N, 1/N+3/4/N,2/N$, etc.
\begin{itemize}
\item 
Donner en fonction de $N$ une majoration de l'erreur commise en rempla\c{c}ant
l'int\'egrale de $1/(1+x)$ par le polyn\^ome interpolateur
sur la premi\`ere subdivision $[0,1/N]$, puis sur les autres
subdivisions, puis une majoration de l'erreur totale sur $[0,1]$.
\item D\'eterminer une valeur de $N$ telle que la valeur
approch\'ee de l'int\'egrale ainsi calcul\'ee soit proche \`a $10^{-8}$ pr\`es
de $\ln(2)$. En d\'eduire une valeur approch\'ee \`a $10^{-8}$ de
$\ln(2)$. 
\end{itemize}
M\^eme question pour $\int_0^1 \frac{dx}{1+x^2}$
et $\pi/4$ (pour majorer la d\'eriv\'ee $n$-i\`eme de $\frac{1}{1+x^2}$,
on pourra utiliser une d\'ecomposition en \'el\'ements simples sur $\C$).

\section{TP6: Alg\`ebre lin\'eaire}

\subsection{M\'ethode du pivot}
\begin{enumerate}
\item Choisissez 5 vecteurs al\'eatoires exacts dans $\R^3$,
trouvez deux relations lin\'eaires ind\'ependantes 
entre ces 5 vecteurs en calculant
le noyau d'une application lin\'eaire.

\item D\'eterminez le temps mis par votre logiciel pour r\'esoudre
un syst\`eme lin\'eaire de $n$ \'equations \`a $n$ inconnues 
\`a coefficients al\'eatoires num\'eriques puis exacts
de taille $n=5,10,20,40$. Commentez.

\item Soit $M$ une matrice carr\'ee al\'eatoire de taille 3
\`a coefficients entiers, on lui accolle 
\`a droite la matrice identit\'e de m\^eme taille puis on applique
la fonction de r\'eduction sous forme \'echelonn\'ee, soit $N$ la partie
droite de la matrice r\'eduite. Calculez {\tt M * N}.
\'Ecrire une fonction {\tt gaussinv} r\'ealisant ce calcul pour
une matrice carr\'ee $M$ quelconque.
\end{enumerate}

\subsection{R\'eduction des endomorphismes.} 
\begin{enumerate}

\item {\bf Polyn\^ome caract\'eristique par interpolation}\\
Soit $B$ une matrice carr\'ee al\'eatoire de taille $n=20$.
Calculez $A=B \ ^t B $ puis $\det(A-\lambda I)$ pour $\lambda=0,...,n$
puis le polyn\^ome caract\'eristique de $B$ par interpolation
de Lagrange. 
Factorisez le polyn\^ome en mode approch\'e, puis comparez avec les valeurs
propres num\'eriques de $A=B \ ^t B $ (obtenues par la fonction
de calcul de valeurs propres du logiciel).\\
Bonus~: \'Ecrire une fonction qui calcule le polyn\^ome caract\'eristique
d'une matrice par cette m\'ethode.

\item {\bf Polyn\^ome caract\'eristique par puissances}\\
Soit $A$ une matrice carr\'ee al\'eatoire de taille $n=5$
et $v$ un vecteur al\'eatoire de taille 5. 
Calculez la matrice dont les colonnes sont
$v,Av,A^2v,...,A^5v$ puis une base de son noyau. En d\'eduire
le polyn\^ome minimal et le polyn\^ome caract\'eristique de $A$.


\item \'Ecrire un programme mettant en oeuvre la m\'ethode de la
puissance.  Utilisez ce programme pour trouver une valeur approch\'ee 
de la valeur propre de norme maximale par la m\'ethode
de la puissance de $B \ ^t B$ o\`u $B$ est une matrice al\'eatoire.

\item
En utilisant la m\'ethode des it\'erations inverses,
trouvez la plus petite valeur propre de la matrice pr\'ec\'edente.

\item (bonus)\\
Pour trouver les autres valeurs propres/vecteurs propres,
on \'elimine la valeur propre trouv\'ee en remplacant
$A$ par $A'=A-\lambda_1 w_1 \ ^t w_1$. Une fois une valeur
propre de $A'$ trouv\'ee, on peut am\'eliorer
la pr\'ecision en utilisant des it\'erations inverses sur 
la matrice $A$.
Trouvez toutes les valeurs propres de la matrice~:
\[D= \left(\begin{array}{rrr}
 9 & -1 & 2  \\
 -1 & 5 & -2  \\
 2 & -2 & -7 
\end{array}\right) \]

\item {\bf Couple de complexe conjugu\'e de module maximal}\\
Trouver le couple de valeurs propres de plus grand module de la matrice~:
\[E= \left(\begin{array}{rrrr}
 -3 & -8 & -3 & 4  \\
 7 & 8 & 6 & 5  \\
 -1 & 4 & -4 & 1 \\
7  & -4 & -5 & 7 
\end{array}\right) \]
Faites de m\^eme pour le couple de plus petit module.

\end{enumerate}

\end{document}
\pagebreak

{\bf Exercice 1: factorisation num\'erique}\\
On repr\'esente un polyn\^ome par la liste de ses coefficients par
ordre d\'ecroissant. Programmer une fonction calculant le polyn\^ome
d\'eriv\'e d'un polyn\^ome.
Programmer la m\'ethode de Newton pour d\'eterminer une racine d'un
polyn\^ome en utilisant la fonction \verb|horner| pour \'evaluer
le polyn\^ome ou sa d\'eriv\'ee en un point. Programmer ensuite
la recherche de l'ensemble des racines en \'eliminant les racines
trouv\'ees au fur et \`a mesure.

Alternative~: programmer la m\'ethode de la puissance, pour une
matrice \`a coefficients complexes, si la matrice est \`a coefficients
r\'eels avec un couple de valeurs propres conjugu\'ees emp\'echant
la convergence, on ajoutera une constante complexe al\'eatoire.
Testez avec des matrices
de taille assez grandes.

\vspace{0.5cm}

{\bf Exercice 2: int\'egration}\\
On utilise la m\'ethode d'int\'egration suivante sur une subdivision
$[\alpha,\beta]$ (par interpolation en 3 points bien choisis)~:
\[ I(f)= (\beta-\alpha)\left(
\frac{4}{9} f\left(\frac{\alpha+\beta}{2}\right)
+ \frac{5}{18} f\left(\alpha+\frac{1-\sqrt{3/5}}{2}(\beta-\alpha)\right)
+\frac{5}{18}f\left(\alpha+\frac{1+\sqrt{3/5}}{2}(\beta-\alpha)\right) 
\right)
\]
D\'eterminer l'ordre de cette m\'ethode, en d\'eduire une majoration
de l'erreur. Programmer cette m\'ethode pour calculer 
$\int_a^b f(t) \ dt$ en d\'ecoupant l'intervalle $[a,b]$ en $N$
subdivisions. D\'eterminer $N$ pour que avoir une valeur approch\'ee
de l'int\'egrale \`a \verb|1e-8| pr\'es pour $f(x)=1/(1+x^2)$,
$a=0$ et $b=1$.

Alternative~: programmer la m\'ethode de la puissance pour une matrice
r\'eelle sym\'etrique pour avoir la plus grande valeur propre avec
une pr\'ecision moyenne. Utilisez alors la m\'ethode des it\'erations inverses
pour am\'eliorer la pr\'ecision. Testez avec des matrices
de taille assez grandes.

\vspace{0.5cm}

{\bf Exercice 3: int\'egration} \\
On reprend le calcul de $\int_0^1 \frac{dx}{1+x}$ mais en utilisant
un polyn\^ome interpolateur de degr\'e 3 sur $N$ subdivisions de $[0,1]$
(de pas $h=1/N$). D\'eterminer la formule d'int\'egration correspondante~:
\[ I(f)= (\beta-\alpha) \sum_{j=0}^3 w_j f(x_j)\]
sur une subdivision $[\alpha,\beta]$, avec $x_0=\alpha$, 
$x_1=(2\alpha+\beta)/3$, $x_2=(\alpha+2\beta)/3$, $x_3=\beta$,
Indication~: utiliser
\begin{center}
\verb|P:=lagrange([a,(2a+b)/3,(a+2b)/3,b],[y0,y1,y2,y3])|
\end{center}
puis intégrer \verb|P| pour \verb|x=a..b| et factoriser.
Calculer l'ordre de la m\'ethode, puis une majoration de l'erreur.
D\'eterminer une valeur de $N$ telle que la valeur
approch\'ee de l'int\'egrale ainsi calcul\'ee soit proche \`a $10^{-8}$ pr\`es
de $\ln(2)$. En d\'eduire une valeur approch\'ee \`a $10^{-8}$ de
$\ln(2)$. \\
M\^eme question pour $\int_0^1 \frac{dx}{1+x^2}$
et $\pi/4$ (pour majorer la d\'eriv\'ee $n$-i\`eme de $\frac{1}{1+x^2}$,
on pourra utiliser une d\'ecomposition en \'el\'ements simples sur $\C$).

Alternative~: programmer la m\'ethode de la puissance pour une matrice
r\'eelle sym\'etrique pour avoir la plus grande valeur propre. 
Eliminez la plus grande valeur propre
et d\'eterminez toutes les valeurs propres de la matrice.
Testez avec des matrices
de taille assez grandes.

\vspace{0.5cm}

{\bf Exercice 4: int\'egration}\\
On utilise la m\'ethode d'int\'egration suivante sur une subdivision
$[\alpha,\beta]$ (par interpolation en 2 points bien choisis)~:
\[ I(f)= (\beta-\alpha) \left(
\frac{1}{2} f\left(\frac{1+\sqrt{1/3}}{2}\alpha+\frac{1-\sqrt{1/3}}{2}\beta\right)
+ \frac{1}{2}
f\left(\frac{1-\sqrt{1/3}}{2}\alpha+\frac{1+\sqrt{1/3}}{2}\beta\right)
\right)
\]
D\'eterminer l'ordre de cette m\'ethode, en d\'eduire une majoration
de l'erreur. Programmer cette m\'ethode pour calculer 
$\int_a^b f(t) \ dt$ en d\'ecoupant l'intervalle $[a,b]$ en $N$
subdivisions. D\'eterminer $N$ pour que avoir une valeur approch\'ee
de l'int\'egrale \`a \verb|1e-8| pr\'es pour $f(x)=1/(1+x^2)$,
$a=0$ et $b=1$.

Alternative~: Programmer le calcul du polynome caract\'eristique
en recherchant une relation lin\'eaire entre les vecteurs $v$, ...,
$A^nv$ pour un vecteur $v$ al\'eatoire. S'il existe plusieurs
relations non proportionnelles, on essaiera de
changer de vecteur $v$. Si c'est encore le cas, on testera si le
polyn\^ome correspondant annule la matrice. Testez avec des matrices
de taille assez grandes.


\end{document}
{\Large \noindent Mat249 \hfill TP \hfill 2009/2010}

\section{Vrai ou Faux ?}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes renvoient l'entier exact 2~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item        
\verb|1+1:;|
\item
\verb|3-1|
\item        
\verb|1.5+1/2|
\item
\verb|4/2|
\item
\verb|sqrt(4)|
\item        
\verb|evalf(sqrt(4))|
\item
\verb|1^(1+1)+1^(1+1)|
\item        
\verb|(1+1)^(1+1)|
\item        
\verb|1*1^(1+1)|
\item
\verb|1+1*1^1|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes affectent l'entier exact 2
\`a la variable \verb|x|~: vrai ou faux et pourquoi~?
\begin{enumerate}
\item
\verb|x:=2:;|
\item
\verb|x:=2|
\item        
\verb|x==2|
\item        
\verb|x=2|
\item
\verb|x:=4/2|
\item        
\verb|x:=3/1.5|
\item
\verb|x:=(2+2)/2|
\item        
\verb|x:=(2.0+2)/2|
\item        
\verb|x:=2a/a|
\item
\verb|x:=2*a/a|
\item        
\verb|x:=1:; x:=2*x|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes affectent \`a la variable \verb|x| une expression 
valide~: vrai ou faux et pourquoi~?
\begin{enumerate}
\item
\verb|x:=ab|
\item
\verb|x:=a*b|
\item        
\verb|x==a|
\item
\verb|x:= x==a|
\item        
\verb|x:=a+(a*b))/2|
\item        
\verb|x=a+a*b|
\item
\verb|x:=a/b|
\item        
\verb|x->a/b|
\item
\verb|x:=a/0|
\item
\verb|x:=2*a/a|
\item        
\verb|x:=1: x:=2*x|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes affectent la valeur $1$ \`a \verb|b|~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item        
\verb|a:=1:; b=a|
\item
\verb|a:=1:; b:=a|
\item        
\verb|a:=1:; b:='a'|
\item        
\verb|a:=1:; b:="a"|
\item
\verb|b:=a/a|
\item
\verb|b:=a^0|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes retournent l'entier exact 2~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item
\verb|2*a/a|
\item        
\verb|sqrt(4*a^2)/a|
\item        
\verb|simplify(sqrt(4*a^2)/a)|
\item        
\verb|sqrt(4*a^4)/(a*a)|
\item
\verb|simplify(sqrt(4*a^4)/(a*a))|
\item
\verb|texpand(sqrt(4*a^4)/(a*a))|
\item        
\verb|ln(a^2)/ln(a)|
\item
\verb|simplify(ln(a^2)/ln(a))|
\item
\verb|-ln(exp(-2))|
\item        
\verb|1/exp(-ln(2))|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes d\'efinissent la fonction $f$ qui \`a $x$
associe $x^2$~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item
\verb|f(x):=x^2|
\item
\verb|f(a):=a^2|
\item        
\verb|f := x^2|
\item        
\verb|f(x):=a^2|
\item
\verb|f := a->a^2|
\item        
\verb|f(x):=evalf(x^2)|
\item        
\verb|f(x):=simplify(x^3)/x|
\item        
\verb|f(x):=simplify(x*x*a/a)|
\item
\verb|f(x):=unapply(x^2,x)|
\item
\verb|unapply(simplify(x^3/x),x)|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes d\'efinissent la fonction \verb|f| qui au
couple $(x,y)$ associe le produit $xy$~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item        
\verb|f:=x*y|
\item        
\verb|f:=x->x*y|
\item
\verb|f:=(a,b)->a*b|
\item
\verb|f(x,y):=x*y|
\item        
\verb|f(x,y):=xy|
\item        
\verb|f:=(x->x)*(y->y)|
\item
\verb|f:=unapply(x*y,x,y)|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes d\'efinissent la fonction \verb|f1| qui \`a
$x$ associe $2x$~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item        
\verb|f1:=diff(x^2)|
\item
\verb|f1:=unapply(diff(x^2),x)|
\item
\verb|f(x):=x^2:; f1:=function_diff(f)|
\item        
\verb|f(x):=x^2:; f1:=diff(f)|
\item        
\verb|f(x):=x^2:; f1:=diff(f(x))|
\item        
\verb|f(x):=x^2:; f1:=unapply(diff(f(x),x),x)|
\item        
\verb|f(x):=x^2:; f1:=x->diff(f(x))|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes affectent \`a $A$ l'expression $2*x*y$~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item
\verb|A:=diff(x^2*y)|
\item        
\verb|A:=x->diff(x^2*y)|
\item
\verb|A:=diff(x^2*y,x)|
\item        
\verb|A:=diff(x^2*y,y)|
\item        
\verb|A:=diff(x*y^2,y)|
\item
\verb|A:=normal(diff(x*y^2,y))|
\item
\verb|A:=normal(diff(x^2*y^2/2,x,y))|
\item
\verb|A:=normal(diff(diff(x^2*y^2/2,x),y))|
\end{enumerate}
}\end{exo}
%-----------------------------------------
%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes retournent la liste
$[1,2,3,4,5]$~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item
\verb|l:=[1,2,3,4,5]|
\item        
\verb|l:=op([1,2,3,4,5])|
\item
\verb|l:=nop(1,2,3,4,5)|
\item        
\verb|l:=seq(i,i=1..5)|
\item        
\verb|l:=seq(j=1..5)|
\item        
\verb|l:=seq(j,j=1..5)|
\item
\verb|l:=[seq(j,j=1..5)]|
\item
\verb|l:=[k$(k=1..5)]|
\item
\verb|l:=cumSum([1$5])|
\item        
\verb|l:=sort(5,2,3,1,4)|
\item
\verb|l:=[sort(5,2,3,1,4)]|
\item        
\verb|l:=makelist(k,1,5)|
\item
\verb|l:=makelist(x->x,1,5)|
\end{enumerate}
}\end{exo}

%--------------------------------------------------------------
\begin{exo}{\rm
Les commandes suivantes retournent la liste
$[1.0,0.5,0.25,0.125,0.0625]$~: 
vrai ou faux et pourquoi~?
\begin{enumerate}
\item
\verb|0.5^[0,1,2,3,4]|
\item        
\verb|2^(-[0,1,2,3,4])|
\item
\verb|evalf(2^(-[0,1,2,3,4]))|
\item        
\verb|seq(2^(-n),n=0..4)|
\item
\verb|evalf([seq(2^(-n),n=0..4)])|
\item        
\verb|1/evalf(2^n$(n=0..4))|
\item        
\verb|evalf(2^n$(n=0..4))^(-1)|
\item
\verb|[evalf(2^n$(n=0..4))]^(-1)|
\item
\verb|evalf(nop(2^n$(n=0..4))^(-1))|
\item
{\tt a:=[]:; (a:=append(a,0.5\^k))\$(k=0..4):; a}
\item        
\verb|makelist(2^(-k),0,4)|
\item
\verb|f:=x->evalf(2^(-x)):; makelist(f,0,4)|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Soit $l$ la liste $[1,0,2,0,3]$. Les lignes de commande 
suivantes retournent l'entier $10203$~: vrai ou faux et pourquoi~? 
\begin{enumerate}
\item
\verb|l*10^[4,3,2,1,0]|
\item        
\verb|l*10^[0,1,2,3,4]|
\item
\verb|revlist(l)*10^[0,1,2,3,4]|
\item        
\verb|l*seq(10^n,n=4..0)|
\item
\verb|l*nop(seq(10^n,n=(4..0)))|
\item
\verb|l*10^nop(j$(j=4..0))|
\item        
\verb|l*10^(j$(j=4..0))|
\item        
\verb|l*10^(j$(j=4..0))|
\item
\verb|l*nop(10^j)$(j=4..0))|
\end{enumerate}
}\end{exo}
%--------------------------------------------------------------
\begin{exo}{\rm
Soit $n$ l'entier $10203$.
Les lignes de commande suivantes retournent la
liste d'entiers $[1,0,2,0,3]$~: 
vrai ou faux et pourquoi~? 
\begin{enumerate}
\item        
\verb|(floor(n/10^k)-floor(n/10^(k+1))*10)$(k=4..0)|
\item
\verb|[(floor(n/10^k)-floor(n/10^(k+1))*10)$(k=4..0)]|
\item        
\verb|seq(iquo(n,10^k)-10*iquo(n,10^(k+1)),k=4..0)|
\item
\verb|nop(seq(iquo(n,10^k)-10*iquo(n,10^(k+1)),k=4..0))|
\item        
\verb|string(n)|
\item        
\verb|mid(string(n),k,1)$(k=0..4)|
\item        
\verb|[mid(string(n),k,1)$(k=0..4)]|
\item
{\tt [expr(mid(string(n),k,1))\$(k=0..4)]}
\end{enumerate}
}\end{exo}
%-----------------------------------------


\vspace{0.5cm}

{\bf Exercice 5: polynôme caractéristique par interpolation}\\
Soit $B$ une matrice carr\'ee al\'eatoire de taille $n=20$.
Calculez $A=B \ ^t B $ puis $\det(A-\lambda I)$ pour $\lambda=0,...,n$
puis le polyn\^ome caract\'eristique de $B$ par interpolation
de Lagrange en ces $n$ points. 
Factorisez le polyn\^ome en mode approch\'e, puis comparez avec les valeurs
propres num\'eriques de $A=B \ ^t B $ (obtenues par la fonction
\verb|eigenvals(A)|).\\
\'Ecrire une fonction qui calcule le polyn\^ome caract\'eristique
d'une matrice par cette m\'ethode.
Déterminer le nombre d'opérations à effectuer en fonction de la taille $n$.

\vspace{1cm}
Ou -> Algo différences divisées/polynome minimal probabiliste, suites de Sturm.

\pagebreak

\

\pagebreak

{\bf Exercice 5: racine maximale}\\
Soit $P=\sum_{k=0}^{n-1} a_k x^k + x^n$ un polyn\^ome
de degr\'e $n$ \`a coefficients complexes, 
on construit la matrice $n,n$ suivante~:
\[ M=\left(\begin{array}{ccccc}
0 & 0 & ... & 0 & -a_{0} \\
1 & 0 & ... & 0 & -a_{1} \\
0 & 1 & ... & 0 & -a_{2} \\
& & ... & & \\
0 & 0 & ... & 1 & -a_{n-1}
\end{array}\right)
\]
On admettra que le polyn\^ome caract\'eristique de $M$ est $P$
(bonus, vous pouvez le montrer!). On applique la m\'ethode de la
puissance pour trouver la racine de $P$ de module maximal si elle existe.
Mettre en oeuvre cet algorithme par un programme, tester le programme
avec un polyn\^ome al\'eatoire \`a coefficients complexes de degr\'e 4.

\vspace{0.5cm}

{\bf Exercice 6: diagonalisation num\'erique}\\
Soit $A$ une matrice sym\'etrique (donc toutes les valeurs
propres sont r\'eelles). On applique \`a $A$ la m\'ethode
de la puissance pour d\'eterminer la valeur propre de valeur absolue
maximale (on suppose qu'elle est unique). Puis
on \'elimine la valeur propre trouv\'ee en remplacant
$A$ par $A'=A-\lambda_1 w_1 \ ^t w_1$. Une fois une valeur
propre de $A'$ trouv\'ee, on peut am\'eliorer
la pr\'ecision en utilisant des it\'erations inverses sur 
la matrice $A$.
Impl\'ementer cet algorithme, tester avec
la matrice~:
\[D= \left(\begin{array}{rrr}
 9 & -1 & 2  \\
 -1 & 5 & -2  \\
 2 & -2 & -7 
\end{array}\right) \]


\end{document}

\maketitle

\tableofcontents

\section{Introduction}
Un logiciel de calcul formel permet de faire des manipulations
alg\'ebriques sans avoir \`a effectuer d'approximation num\'erique,
par exemple calculer la d\'eriv\'ee ou la primitive d'une fonction,
r\'esoudre certaines \'equations diff\'erentielles, etc. Il permet
\'egalement de faire des calculs num\'eriques, ainsi que des repr\'esentations
graphiques, ...
On en trouve~:
\begin{itemize}
\item Sur ordinateur~:\\
Les logiciels les plus utilis\'es aujourd'hui sont probablement
Maple et Mathematica. Ce sont des logiciels commerciaux, vous devez
payer une licence d'utilisation si vous les utilisez chez vous. Il existe
d'autres logiciels de calcul formel, ceux disponibles \`a l'agr\'egation
de math\'ematiques sont Axiom (libre), Gap (libre, sp\'ecialis\'e),
Giac/Xcas (libre), Mupad (commercial), Maxima (libre), Pari-GP 
(libre, sp\'ecialis\'e), Sage (libre).

Nous utiliserons Xcas qui est libre (donc gratuit) et de plus compatible avec
Maple (pour ceux ayant d\'ej\`a utilis\'e Maple, vous pourrez la plupart du
temps utiliser les m\^emes instructions et le m\^eme langage de programmation).
Vous pouvez le t\'el\'echarger \`a l'URL
\begin{center}
\verb|www-fourier.ujf-grenoble.fr/~parisse/giac_fr.html|
\end{center}
\item Sur calculatrices\\
Les mod\`eles suivants sont capables de faire du calcul formel
\begin{center}
Casio Graph 100 (incomplet), Casio Classpad, HP 40G(S), HP49G(+),
HP50G, TI89 (Titanium), TI 92(+), TI Voyage 200, TI Nspire CAS. 
\end{center}
% Vous pourrez emprunter une HP49G(+) ou une TI89 si vous ne
% disposez pas de calculatrice formelle. L'utilisation de calculatrices
% sera autoris\'ee et utile pour le partiel et l'examen.
% (N.B.: la maitrise d'une 
% calculatrice formelle est exig\'ee au Capes de math\'ematiques).
\end{itemize}


\section{D\'eroulement d'une session.} \label{sec:open}

\subsection{Lancement de Xcas}
\begin{itemize}
\item Sous Windows en installation locale, 
on clique sur l'icone \verb|xcasfr| du bureau.
\item Sous Linux avec Gnome, on clique sur Xcas du menu
Education (ou sur l'icone de Xcas si elle apparait). Sinon, ouvrir un terminal et taper \verb|xcas &|.
\item sur Mac, cliquez sur Xcas dans le menu Applications du Finder.
\item en salle B118~:
\begin{enumerate}
\item Si votre PC est \'eteint, commencez par appuyer sur les boutons 
''power'' de l'\'ecran et de la tour et patientez une bonne minute.

\item Connectez-vous sur Windows. Puis lancez Virtualbox.

%\item 
%Si vous ne voyez pas un \'ecran en mode graphique, tapez simultan\'ement sur
%les touches Control, Alt et F7. 
%Vous devez maintenant voir une fen\^etre
%de login. Entrez votre login et votre mot de passe.
%Tapez la commande~:\\
%\verb|ssh pcm2| ou \verb|slogin pcm2|

\item
Si vous n'avez pas de fen\^etre de commandes ({\tt Konsole} ou {\tt
  xterm}), essayez d'en faire apparaitre une~:
\begin{itemize}
\item en cliquant sur une ic\^one repr\'esentant un \'ecran 
\item en cliquant avec le bouton droit, 
s\'electionnez ``Ex\'ecuter une commande''
taper alors {\tt xterm}.
\item en cherchant dans les menus une application Terminal (dans
  Applications ou Syst\`eme, Shells ou Accessoires...)
\end{itemize}
Dans la suite, lorsqu'on demande de taper une commande, il faut saisir
la commande puis valider en tapant sur la touche Entree (ou Enter sur un
clavier qwerty).

\item
Tapez la commande\\
\verb|  xcas &|
\end{enumerate}

\end{itemize}
Lors de la
premi\`ere utilisation, choisissez {\tt Xcas} lorsqu'on vous demande
de choisir une syntaxe (sauf si vous connaissez le langage Maple).
Nous donnons ici seulement le minimum de l'interface \`a connaitre
pour commencer \`a programmer. On consultera plutot 
le manuel D\'ebuter en calcul formel ou les 
autres manuels (menu Aide) pour apprendre
\`a utiliser les fonctionnalit\'es de Xcas en calcul formel, g\'eom\'etrie,
tableur, etc..



L'interface appara\^\i t comme suit au lancement de {\tt Xcas}.
\vskip 2mm
\begin{center}
\includegraphics[width=\textwidth]{demarr1}
\end{center}
Vous pouvez la redimensionner. De haut en bas cette interface
fait appara\^\i tre~:
\begin{itemize}
\item[$\bullet$]
une barre de menu gris cliquable~: \verb|Fich|, \verb|Edit|,
\verb|Cfg|, \verb|Aide|, \verb|CAS|,
\verb|Tableur|, \verb|Graphe|, \verb|Geo|,\ldots
\index{menus}
\item[$\bullet$]
un onglet indiquant le nom de la session, ou {\tt Unnamed} 
si la session n'a pas encore \'et\'e sauvegard\'ee,
\item[$\bullet$]
une zone de gestion de la session avec un bouton \verb|?| 
pour ouvrir l'index de l'aide
un bouton \verb|Save| pour sauvegarder la session, 
un bouton \verb|Config: exact real ...| affichant la configuration 
et permettant de la modifier,
un bouton \verb|STOP| permettant d'interrompre un calcul trop long,
un bouton \verb|Kbd| pour faire apparaitre un clavier ressemblant \`a celui d'une calculatrice, 
qui peut faciliter vos saisies, et un bouton \verb|x| pour fermer la session
\item[$\bullet$]
une zone rectangulaire blanche num\'erot\'ee 1 (premi\`ere ligne
de commande) dans laquelle vous pouvez taper
votre premi\`ere commande (cliquez si n\'ecessaire pour faire
apparaitre le curseur dans
cette ligne de commande)~: \verb|1+1|, suivi de la touche
"Entr\'ee" ("Enter" ou "Return" selon les claviers).
Le r\'esultat appara\^it au-dessous, et une nouvelle ligne de commande
s'ouvre, num\'erot\'ee 2. 
\end{itemize}
Vous pouvez modifier l'aspect de l'interface et sauvegarder vos
modifications pour les utilisations futures (menu \verb|Cfg|).
\vskip 2mm
Vous n'avez pour l'instant qu'\`a
entrer des commandes dans les lignes de commandes successives. 
Si vous utilisez la
version html de ce cours, vous pouvez copier-coller les commandes
propos\'ees depuis votre navigateur. 
Chaque ligne de commande saisie est ex\'ecut\'ee par la
touche "Entr\'ee". Essayez par exemple d'ex\'ecuter les
commandes suivantes.
\begin{verbatim}
1/3+1/4
sqrt(2)^5
resoudre(x+3=1,x)
50!
\end{verbatim}
Toutes les commandes sont gard\'ees en m\'emoire.
Vous pouvez donc remonter dans l'historique de votre session pour 
modifier des commandes ant\'erieures. Essayez par exemple de changer
les commandes pr\'ec\'edentes en~:
\begin{verbatim}
1/3+3/4
sqrt(5)^2
resoudre(2*x+3=0)
500!
\end{verbatim}

Notez que 
\begin{itemize}
\item pour effacer une ligne de commande, 
on clique dans le num\'ero de niveau
\`a gauche de la ligne de commande, qui apparait alors en surbrillance.
On appuie ensuite sur la touche d'effacement. On peut aussi d\'eplacer
une ligne de commande avec la souris.
\item 
Le menu \verb|Edit| vous permet de pr\'eparer des sessions plus
\'elabor\'ees qu'une simple succession de commandes. Vous pouvez
cr\'eer des groupes de lignes de commandes (sections), 
ajouter des commentaires ou fusionner des niveaux en un seul niveau.
\item
Le menu \verb|Prg| contient la plupart des instructions utiles
pour programmer.
\end{itemize}

\subsection{Aide en ligne}
Les commandes de Xcas sont regroup\'ees par th\`emes dans les
menus du bandeau gris sup\'erieur~: \verb|CAS|, \verb|Graphic|,
\verb|Geo|, \verb|Cmds|, \verb|Phys|, \ldots~ 
Lorsqu'on s\'electionne une commande dans un menu, 
\begin{itemize}
\item soit l'index de l'aide s'ouvre \`a la commande s\'electionn\'ee (par
exemple pour les commandes du menu \verb|CAS|). Cliquez sur le bouton
\verb|Details| pour afficher la page du manuel correspondant \`a la commande
dans votre navigateur.
\item soit une boite de dialogue s'ouvre vous permettant de sp\'ecifier
les arguments de la commande (par exemple pour tracer une courbe
depuis le menu \verb|Graphic|)
\item soit la commande est recopi\'ee dans la ligne de commande. Pour connaitre
la syntaxe de cette commande, appuyez sur le bouton \verb|?| en haut \`a gauche,
ou faites afficher la zone de \verb|Messages| (en utilisant le menu \verb|Cfg|,).
Vous pouvez aussi configurer Xcas (menu \verb|Cfg| puis \verb|Configuration generale|
puis cocher la case \verb|Aide HTML automatique|) 
pour que la page correspondante du manuel 
s'ouvre automatiquement dans votre navigateur.
\end{itemize}
Le menu \verb|Aide| contient les diff\'erentes formes d'aide possible~:
un guide de l'utilisateur (interface), un guide de r\'ef\'erence
(\verb|Manuels->Calcul formel|, aide detaill\'ee sur chaque commande), 
un \verb|Index| (liste des commandes class\'ees par ordre 
alphab\'etique avec une ligne d'entr\'ee permettant de se d\'eplacer
facilement) et une recherche par mots clefs.
\index{aide en ligne}
\index{help@{\verb+help+}}

Si vous connaissez d\'ej\`a le nom d'une commande et que vous d\'esirez
v\'erifier sa syntaxe (par exemple \verb|factor|), vous pouvez
saisir le d\'ebut du nom de commande 
(disons \verb|fact|)
puis taper sur la touche de tabulation
(situ\'ee \`a gauche de la touche A sur un clavier
fran\c{c}ais) ou cliquer sur le bouton \verb|?| en haut \`a gauche. 
L'index des commandes appara\^\i t alors dans une fen\^etre, positionn\'e 
\`a la premi\`ere compl\'etion possible, avec une aide succinte sur chaque
commande. 
Par exemple, vous voulez factoriser un polyn\^ome, vous supposez que le nom de
commande commence par \verb|fact|, vous tapez donc \verb|fact| puis
la touche de tabulation, vous s\'electionnez \`a la souris
\verb|factor| (ou un des exemples) puis vous cliquez sur OK.

Vous pouvez aussi saisir \verb|?factor| pour avoir l'aide succinte
en r\'eponse. Si le nom que vous avez saisi n'est pas reconnu, des
commandes proches vous sont sugg\'er\'ees.


\section{Les objets du calcul formel}
%
\subsection{Les nombres}
%
\index{nombre!exact}
\index{nombre!approch\'e}
Les nombres peuvent \^etre exacts ou approch\'es.
Les nombres exacts sont les constantes pr\'ed\'efinies, les entiers, 
les fractions d'entiers et plus g\'en\'eralement toute  expression 
ne contenant que des entiers et des constantes, comme 
\verb|sqrt(2)*e^(i*pi/3)|.
Les nombres approch\'es sont not\'es avec la notation scientifique 
standard~: partie enti\`ere suivie du point de s\'eparation 
et partie fractionnaire (\'eventuellement
suivie de \verb|e| et d'un exposant).
Par exemple, \verb|2| est un entier exact, 
\verb|2.0| est la version approch\'ee du m\^eme
entier; \verb|1/2| est un  rationnel, \verb|0.5| 
est la version approch\'ee du m\^eme
rationnel.
{\tt Xcas} peut g\'erer des nombres entiers en pr\'ecision arbitraire~: 
essayez de taper \verb|500!| et comptez le nombre de chiffres 
de la r\'eponse.

On passe d'une valeur exacte \`a une valeur approch\'ee par
\verb|evalf|, on transforme une valeur approch\'ee en un rationnel
exact par \verb|exact|
\index{exact@{\verb+exact+}}
\index{evalf@{\verb+evalf+}}
Les calculs sont effectu\'es en mode exact si tous les nombres qui
interviennent sont exacts. Ils sont effectu\'es en mode approch\'e si
un des nombres est approch\'e. Ainsi
\verb|1.5+1| renvoie un nombre approch\'e alors que \verb|3/2+1| 
renvoie un nombre exact.
\begin{verbatim}
sqrt(2)
evalf(sqrt(2))
sqrt(2)-evalf(sqrt(2))
exact(evalf(sqrt(2)))*10^9
exact(evalf(sqrt(2)*10^9))
\end{verbatim} 
\index{sqrt@{\verb+sqrt+}}
\index{precision@pr\'ecision}
Pour les nombres r\'eels approch\'es, la pr\'ecision par d\'efaut est
proche de 14 chiffres significatifs (la pr\'ecision relative est de 53
ou 45 bits pour les r\'eels flottants normalis\'es selon les versions de Xcas). 
Elle peut \^etre augment\'ee, en
donnant le nombre de d\'ecimales d\'esir\'e
comme second argument de \verb|evalf|.
\begin{verbatim}
evalf(sqrt(2),50)
evalf(pi,100)
\end{verbatim}
On peut aussi changer la pr\'ecision par d\'efaut pour tous les
calculs en modifiant
\index{digits@{\verb+Digits+}}
la variable \verb|Digits|.
\begin{verbatim}
Digits:=50
evalf(pi)
evalf(exp(pi*sqrt(163)))
\end{verbatim}

\index{i@{\verb+i+}}
La lettre \verb|i| est r\'eserv\'ee \`a $\sqrt{-1}$ et ne peut \^etre
r\'eaffect\'ee~; en particulier on ne peut pas l'utiliser comme indice
de boucle.
\begin{verbatim}
(1+2*i)^2
(1+2*i)/(1-2*i)
e^(i*pi/3)
\end{verbatim}
\index{nombre!complexe}
\index{infinity@{\verb+infinity+}}
{\tt Xcas} distingue l'infini non sign\'e \verb|infinity| ($\infty$), de
\verb|+infinity| ($+\infty$) et de \verb|-infinity| ($-\infty$).
\begin{verbatim}
1/0; (1/0)^2; -(1/0)^2 
\end{verbatim}
\vskip 2mm
\begin{center}
\begin{tabular}{|ll|}
\hline
\multicolumn{2}{|c|}{\bf Constantes pr\'ed\'efinies}\\
\hline\hline
\verb|pi|&$\pi\simeq 3.14159265359$ \\
\verb|e|&$e\simeq 2.71828182846$  \\
\verb|i|&$i=\sqrt{-1}$  \\
\verb|infinity|&$\infty$  \\
\verb|+infinity|&$+\infty$  \\
\verb|-infinity|&$-\infty$  \\
\hline
\end{tabular}
\end{center}
\index{e@{\verb+e+}}
\index{pi@{\verb+pi+}}
%
\subsection{Les caract\`eres et les cha\^{i}nes}
%
\index{caract\`ere}
\index{cha\^{i}ne}
Une cha\^{i}ne est parenth\'es\'ee par des guillemets ({\tt "}).
Un caract\`ere est une cha\^{i}ne ayant un seul \'el\'ement.
\begin{verbatim}
s:="azertyuiop"
size(s)
s[0]+s[3]+s[size(s)-1]
concat(s[0],concat(s[3],s[size(s)-1]))
head(s)
tail(s)
mid(s,3,2)
l:=asc(s)
ss:=char(l)
string(123)
expr(123)
expr(0123)
\end{verbatim}
\vskip 2mm
\begin{center}
\begin{tabular}{|ll|}
\hline
\multicolumn{2}{|c|}{\bf Cha\^{i}nes}\\
\hline\hline
\verb|asc|&cha\^{i}ne->liste des codes ASCII \\
\verb|char|&liste des codes ASCII->cha\^{i}ne \\
\verb|size|&nombre de caract\`eres \\
\verb|concat| ou \verb|+| &concat\'enation  \\
\verb|mid|&morceau de cha\^{i}ne\\
\verb|head|&premier caract\`ere  \\
\verb|tail|&cha\^{i}ne sans le 1ier caract\`ere\\
\verb|string|&nombre ou expression->cha\^{i}ne  \\
\verb|expr|&cha\^{i}ne->nombre (base 10 ou 8) ou expression  \\
\hline
\end{tabular}
\end{center}%
\subsection{Les variables}
%
\index{variable!formelle}
\index{variable!affect\'ee}
On dit qu'une variable est formelle si elle ne contient aucune valeur~: 
toutes les variables sont formelles tant qu'elles n'ont pas \'et\'e
affect\'ees (\`a une valeur).
\index{affectation}
L'affectation est not\'ee \verb|:=|. Au d\'ebut 
de la session  \verb|a| 
est formelle, elle devient affect\'ee apr\`es l'instruction 
\verb|a:=3|, \verb|a| sera alors remplac\'e par 3 dans tous
les calculs qui suivent, et \verb|a+1| renverra 4. 
{\tt Xcas} conserve tout le contenu de votre session. Si vous voulez que la variable 
\verb|a| apr\`es l'avoir affect\'ee, soit \`a nouveau une variable formelle, il
faut la "vider" par \verb|purge(a)|. Dans les exemples qui suivent, les 
variables utilis\'ees sont suppos\'ees avoir \'et\'e purg\'ees avant chaque
suite de commandes.
\index{purge@{\verb+purge+}}  
\vskip 2mm\noindent
Il ne faut pas confondre
\begin{itemize}
\item[$\bullet$] le signe \verb|:=| qui d\'esigne l'affectation
\item[$\bullet$] le signe \verb|==| qui d\'esigne une \'egalit\'e
  bool\'eenne~: c'est une op\'eration binaire qui retourne 1 ou 0 (1 pour true
qui veut dire Vrai et 0 pour false qui veut dire Faux) 
\item[$\bullet$] le signe \verb|=| utilis\'e pour d\'efinir une \'equation.
\end{itemize}
\index{egalite@\'egalit\'e}
\index{equation@\'equation}
\begin{verbatim}
a==b
a:=b
a==b
solve(a=b,a)
solve(2*a=b+1,a)
\end{verbatim}
\index{assume@{\verb+assume+}}
\index{hypoth\`ese}
On peut faire certains types d'hypoth\`eses sur une variable avec
la commande \verb|assume|, par exemple \verb|assume(a>2)|. Une
hypoth\`ese est une forme sp\'eciale d'affectation, elle efface
une \'eventuelle valeur pr\'ec\'edemment affect\'ee \`a la variable.
Lors d'un calcul, la variable n'est pas remplac\'ee mais
l'hypoth\`ese sera utilis\'ee dans la mesure du possible, par exemple
\verb|abs(a)| renverra \verb|a| si on fait l'hypoth\`ese \verb|a>2|.
\begin{verbatim}
sqrt(a^2)
assume(a<0)
sqrt(a^2)
assume(n,integer)
sin(n*pi)
\end{verbatim}
\index{subst@{\verb+subst+}}
La fonction \verb|subst| permet de remplacer une variable dans une
expression par un nombre ou une autre expression, 
sans affecter cette variable.
\begin{verbatim}
subst(a^2+1,a=1)
subst(a^2+1,a=sqrt(b-1))
a^2+1
\end{verbatim} 

{\bf Remarque}~: pour stocker une valeur dans une variable par r\'ef\'erence,
par exemple pour modifier une valeur dans une liste (un vecteur, une
matrice), sans recr\'eer une nouvelle liste mais en modifiant
en place la liste existante, on utilise l'instruction \verb|=<|
au lieu de \verb|:=|.
Cette instruction est plus rapide que l'instruction \verb|:=|, car
elle \'economise le temps de copie de la liste.
%
\subsection{Les expressions}
%
\subsubsection{D\'efinition}
\index{expression}
Une expression est une combinaison de nombres et de variables
reli\'es entre eux par des op\'erations~: par exemple 
\verb|x^2+2*x+c|. 

Lorsqu'on valide une commande, {\tt Xcas}
remplace les variables par leur valeur si elles en ont une,
et ex\'ecute les op\'erations. 
\begin{verbatim}
(a-2)*x^2+a*x+1
a:=2
(a-2)*x^2+a*x+1
\end{verbatim}
\index{simplifications automatiques}
Certaines op\'erations de simplification sont ex\'ecut\'ees
automatiquement lors d'une \'evaluation~:
\begin{itemize}
\item[$\bullet$] les op\'erations sur les entiers et sur les 
fractions, y compris la mise
sous forme irr\'eductible
\item[$\bullet$] les simplifications triviales comme $x+0=x$,
$x-x=0$, $x^1=x$\ldots
\item[$\bullet$] quelques formes trigonom\'etriques~: 
$\cos(-x)=\cos(x)$, 
$\cos(\pi/4)=\sqrt{2}/2$,
$\tan(\pi/4)=1$\ldots
\end{itemize}
Nous verrons dans la section \ref{sec:simplify} 
comment obtenir plus de simplifications.

\subsubsection{D\'evelopper et simplifier une expression} \label{sec:simplify}
%
\index{developper@d\'evelopper}
\index{simplifier@simplifier}
En-dehors des r\`egles de la section pr\'ec\'edente,
il n'y a pas de simplification syst\'ematique. 
Il y a deux raisons \`a cela. La premi\`ere est que les 
simplifications non triviales sont parfois
co\^uteuses en temps, et le choix d'en faire ou non est laiss\'e 
\`a l'utilisateur~;
la deuxi\`eme est qu'il y a en g\'en\'eral plusieurs mani\`eres de
simplifier une m\^eme expression, selon l'usage que l'on veut en
faire. 
Les principales commandes pour transformer une expression 
sont les suivantes~:
\begin{itemize}
\item[$\bullet$]
\index{expand@{\verb+expand+}}
\verb|expand|~: d\'eveloppe une expression en tenant compte 
uniquement de la distributivit\'e de la multiplication sur l'addition et
du d\'eveloppement des puissances enti\`eres.
\item[$\bullet$]
\index{normal@{\verb+normal+}}
\index{ratnormal@{\verb+ratnormal+}}
\verb|normal| et \verb|ratnormal|~: 
d'un bon rapport temps d'ex\'ecution-simplification, elles
\'ecrivent une fraction rationnelle (rapport de deux polyn\^omes)
sous forme de fraction irr\'eductible d\'evelopp\'ee; \verb|normal|
tient compte des nombres alg\'ebriques (par exemple comme \verb|sqrt(2)|)
mais pas \verb|ratnormal|. Les deux ne tiennent pas compte des relations
entre fonctions transcendantes (par exemple comme \verb|sin| et \verb|cos|).
\item[$\bullet$] 
\index{factor@{\verb+factor+}}
\verb|factor|~: un peu plus lente que les pr\'ec\'edentes, elle
\'ecrit une fraction sous forme irr\'eductible factoris\'ee.
\item[$\bullet$] 
\index{simplify@{\verb+simplify+}}
\verb|simplify|~: elle essaie de se ramener \`a
des variables alg\'ebriquement ind\'ependantes avant d'appliquer
\verb|normal|. Ceci est plus co\^uteux en temps et "aveugle" (on
ne contr\^ole pas les r\'e\'ecritures interm\'ediaires).
Les simplifications faisant intervenir des extensions
alg\'ebriques (par exemple des racines carr\'ees) 
n\'ecessitent parfois deux appels et/ou des hypoth\`eses (\verb|assume|)
pour enlever des valeurs absolues avant d'obtenir la simplification
souhait\'ee.
\item[$\bullet$] 
\index{tsimplify@{\verb+tsimplify+}}
\verb|tsimplify| essaie de se ramener \`a des variables 
alg\'ebriquement ind\'ependantes mais sans appliquer \verb|normal|
ensuite.
\end{itemize}
Dans le menu \verb|Math| du bandeau sup\'erieur, les 4 sous-menus
de r\'e\'ecriture
contiennent d'autres fonctions, pour des
transformations plus ou
moins sp\'ecialis\'ees.  
\begin{verbatim}
b:=sqrt(1-a^2)/sqrt(1-a)
ratnormal(b)
normal(b)
tsimplify(b)
simplify(b)
simplify(simplify(b))
assume(a<1)
simplify(b)   
simplify(simplify(b))
\end{verbatim}
\index{convert@{\verb+convert+}}
La fonction \verb|convert| permet de passer d'une expression \`a une
autre \'equivalente, sous un format qui est sp\'ecifi\'e par le
deuxi\`eme argument. 
\begin{verbatim}
convert(exp(i*x),sincos)
convert(1/(x^4-1),partfrac)
convert(series(sin(x),x=0,6),polynom)
\end{verbatim}
\vskip 2mm
\begin{center}
\begin{tabular}{|ll|}
\hline
\multicolumn{2}{|c|}{\bf Transformations}\\
\hline\hline
\verb|simplify|& simplifier\\
\verb|tsimplify|& simplifier (moins puissant)\\
\verb|normal|& forme normale\\
\verb|ratnormal|& forme normale (moins puissant)\\
\verb|expand|& d\'evelopper\\
\verb|factor|& factoriser\\
\verb|assume|& rajout d'hypoth\`eses\\
\verb|convert|& transformer en un format sp\'ecifi\'e\\
\hline
\end{tabular}
\end{center}

%
\subsection{Les fonctions}
%
\subsubsection{Fonctions usuelles}
De nombreuses fonctions sont d\'ej\`a d\'efinies dans {\tt Xcas}, en
particulier les fonctions classiques. Les plus courantes figurent dans
le tableau ci-apr\`es; pour les autres, voir le menu \verb|Math|.
\vskip 2mm
\begin{center}
\begin{tabular}{|ll|}
\hline
\multicolumn{2}{|c|}{\bf Fonctions classiques}\\
\hline\hline
\verb|abs| & valeur absolue\\
\verb|round| & arrondi \\
\verb|floor| & partie enti\`ere (plus grand entier $\leq$)\\
\verb|ceil| & plus petit entier $\geq $\\
\hline
\verb|abs| & module\\
\verb|arg| & argument\\
\verb|conj| & conjugu\'e\\
\hline
\verb|sqrt| & racine carr\'ee\\
\verb|exp| & exponentielle\\
\verb|log| & logarithme naturel\\
\verb|ln| & logarithme naturel\\
\verb|log10| & logarithme en base 10\\
\hline
\verb|sin| & sinus\\
\verb|cos| & cosinus\\
\verb|tan| & tangente\\
\verb|asin| & arc sinus\\
\verb|acos| & arc cosinus\\
\verb|atan| & arc tangente\\
\hline
\verb|sinh| & sinus hyperbolique\\
\verb|cosh| & cosinus hyperbolique\\
\verb|tanh| & tangente hyperbolique\\
\verb|asinh| & argument sinus hyperbolique\\
\verb|acosh| & argument cosinus hyperbolique\\
\verb|atanh| & argument tangente hyperbolique\\
\hline
\end{tabular}
\end{center}
\index{abs@{\verb+abs+}}
\index{valeur absolue}
\index{round@{\verb+round+}}
\index{arrondi}
\index{floor@{\verb+floor+}}
\index{ceil@{\verb+ceil+}}
\index{partie enti\`ere}
\index{re@{\verb+re+}}
\index{partie r\'eelle}
\index{im@{\verb+im+}}
\index{partie imaginaire}
\index{conj@{\verb+conj+}}
\index{conjugu\'e}
\index{sqrt@{\verb+sqrt+}}
\index{racine carr\'ee}
\index{exp@{\verb+exp+}}
\index{log@{\verb+log+}}
\index{ln@{\verb+ln+}}
\index{logarithme!naturel}
\index{logarithme!en base 10}
\index{log10@{\verb+log10+}}
\index{sin@{\verb+sin+}}
\index{sinus}
\index{cos@{\verb+cos+}}
\index{cosinus}
\index{tan@{\verb+tan+}}
\index{tangente}
\index{sinh@{\verb+sinh+}}
\index{sinus!hyperbolique}
\index{cosh@{\verb+cosh+}}
\index{cosinus!hyperbolique}
\index{tanh@{\verb+tanh+}}
\index{tangente!hyperbolique}
\index{asin@{\verb+asin+}}
\index{arc!sinus}
\index{acos@{\verb+acos+}}
\index{arc!cosinus}
\index{atan@{\verb+atan+}}
\index{arc!tangente}
\index{asinh@{\verb+asinh+}}
\index{argument!sinus hyperbolique}
\index{acosh@{\verb+acosh+}}
\index{argument!cosinus hyperbolique}
\index{atanh@{\verb+atanh+}}
\index{argument!tangente hyperbolique}

\subsubsection{Fonctions alg\'ebriques d\'efinies par l'utilisateur}
Pour cr\'eer une nouvelle fonction, il faut la d\'eclarer \`a l'aide 
d'une expression contenant la variable. 
Par exemple l'expression $x^2-1$ est 
d\'efinie par \verb|x^2-1|. Pour la transformer en la fonction $f$ qui
\`a $x$ associe $x^2-1$, trois possibilit\'es existent~:
\begin{verbatim}
f(x):= x^2-1
f:=x->x^2-1
f:=unapply(x^2-1,x)
f(2); f(a^2)
\end{verbatim}
\index{fonction!d\'efinition d'une}
\index{fonction}
\index{expression}
\index{unapply@{\verb+unapply+}}

On peut d\'efinir des fonctions de plusieurs variables \`a valeurs dans 
$\mathbb R$ comme \verb|f(x,y):=x+2*y| et des fonctions de plusieurs 
variables \`a valeurs dans $\mathbb R^p$
par exemple \verb|f(x,y):=(x+2*y,x-y)| 

\subsubsection{Distinguer expression et fonction}
Si \verb|f| est une fonction d'une variable et \verb|E| est une
expression, \verb|f(E)| est une autre expression.
Il est essentiel de ne pas confondre fonction et expression.
Si on d\'efinit : \verb|E:=x^2-1|, alors la variable \verb|E| 
contient l'expression $x^2-1$. Pour avoir la valeur de cette
expression en $x=2$ il faut 
\'ecrire \verb|subst(E,x=2)| et non \verb|E(2)|
car \verb|E| n'est pas une fonction.
Lorsqu'on d\'efinit une fonction,
le membre de droite de l'affectation n'est pas \'evalu\'e.
Ainsi l'\'ecriture \verb|E:=x^2-1; f(x):=E|
d\'efinit la fonction $f: x \mapsto E$ car \verb|E| n'est pas \'evalu\'e.
Par contre \verb|E:= x^2-1; f:=unapply(E,x)| d\'efinit bien la
fonction $f: x\mapsto x^2-1$ car \verb|E| est \'evalu\'e.

Le signe \verb|'| apr\`es une expression permet de calculer la d\'eriv\'ee d'une
expression ou d'une fonction par rapport \`a la variable \verb|x|. On
l'utilisera si possible. Si on veut d\'eriver par rapport
\`a une autre variable ou plusieurs fois ou par rapport
\`a plusieurs variables, on utilise la commande \verb|diff| qui
s'applique \'a une expression. Pour
d\'eriver une fonction $f$, 
on peut appliquer \verb|diff| \`a l'expression $f(x)$, mais alors le
r\'esultat est une expression. Si on souhaite d\'efinir la fonction
d\'eriv\'ee, il faut utiliser \verb|function_diff|.
\begin{verbatim}
E:=x^2-1
E'
diff(E)
f:=unapply(E,x)
f'
f'(2); f'(x)
diff(f(x))
f1:=function_diff(f)
\end{verbatim}
Il ne {\bf faut pas} d\'efinir la fonction d\'eriv\'ee par
\verb|f1(x):=diff(f(x))|, car \verb|x| aurait dans cette d\'efinition
deux sens incompatibles~: c'est d'une part la
variable formelle de d\'erivation et d'autre part l'argument
de la fonction \verb|f1|. D'autre part, cette d\'efinition
\'evaluerait \verb|diff| \`a chaque appel de la fonction (car
le membre de droite d'une affectation n'est jamais \'evalu\'e), ce 
qui serait inefficace. Il faut donc soit utiliser
\verb|f1:=function_diff(f)|, 
soit \verb|f1:=unapply(diff(f(x)),x)|.

\subsubsection{Op\'erations sur les fonctions}
\index{fonction!composition des}
\index{compos\'ee}
On peut ajouter et multiplier des fonctions,
par exemple \verb|f:=sin*exp|. Pour composer des fonctions, on utilise 
l'op\'erateur \verb|@| et pour composer plusieurs fois une fonction 
avec elle-m\^eme, on utilise l'op\'erateur \verb|@@|.
\begin{verbatim}
f:=x->x^2-1
f1:=f@sin
f2:=f@f
f3:=f@@3
f1(a)
f2(a)
f3(a)
\end{verbatim} 
%

\subsection{Listes, s\'equences, ensembles}
%
\index{liste}
\index{sequence@s\'equence}
\index{ensemble}
{\tt Xcas} distingue plusieurs sortes de collections d'objets, 
s\'epar\'es par des virgules~: 
\begin{itemize}
\item[$\bullet$] les listes (entre crochets)
\item[$\bullet$]  les s\'equences (entre parenth\`eses) 
\item[$\bullet$]  les ensembles (entre pourcentage-accolades)
\end{itemize}
\begin{verbatim}
liste:=[1,2,4,2]
sequence:=(1,2,4,2)
ensemble:=%{1,2,4,2%}
\end{verbatim}
Les listes peuvent contenir des listes (c'est le cas des matrices), 
alors que les s\'equences sont plates (un \'el\'ement d'une s\'equence
ne peut pas \^etre une s\'equence). Dans un ensemble,
l'ordre n'a pas d'importance et chaque objet est unique. 
Il existe une autre structure, appel\'ee table, dont nous
reparlerons plus loin.

Il suffit de mettre une s\'equence entre crochets pour en faire une liste
ou entre accolades pr\'ec\'ed\'ees de \verb|%| pour en faire un ensemble.
On passe d'une liste \`a sa s\'equence associ\'ee par \verb|op|, 
d'une s\'equence \`a sa liste associ\'ee en la mettant entre crochets
ou avec la fonction \verb|nop|.
Le nombre d'\'el\'ements d'une liste est donn\'e par \verb|size| 
(ou \verb|nops|).
\index{op@{\verb+op+}}
\index{nop@{\verb+nop+}}
\index{nops@{\verb+nops+}}
\index{size@{\verb+size+}}
\index{nombre!d'\'el\'ements}
\begin{verbatim}
se:=(1,2,4,2)
li:=[se]
op(li)
nop(se)
nops(se)
%{se%}
size([se])
size(%{se%})
\end{verbatim}
\index{it\'eration}
\index{seq@{\verb+seq+}}
\index{makelist@{\verb+makelist+}}
Pour fabriquer une liste ou une s\'equence, on utilise des commandes
d'it\'eration comme {\tt \$} ou \verb@seq@ (qui it\`erent une
expression) ou \verb@makelist@ (qui d\'efinit une liste \`a l'aide d'une 
fonction).  
\begin{verbatim}
1$5
k^2 $ (k=-2..2)
seq(k^2,k=-2..2)
seq(k^2,k,-2..2)
[k^2$(k=-2..2)]
seq(k^2,k,-2,2)
seq(k^2,k,-2,2,2)
makelist(x->x^2,-2,2)
seq(k^2,k,-2,2,2)
makelist(x->x^2,-2,2,2)
\end{verbatim}
\index{NULL@{\verb+NULL+}}
\index{liste!vide}
\index{sequence@s\'equence!vide}

La s\'equence vide est not\'ee \verb|NULL|, la liste vide
\verb|[]|. Pour ajouter un \'el\'ement \`a une s\'equence il suffit
d'\'ecrire la s\'equence et '\'el\'ement s\'epar\'es par une virgule. 
\index{append@{\verb+append+}}
Pour ajouter un
\'el\'ement \`a une liste on utilise \verb|append|.
On acc\`ede \`a un \'el\'ement d'une liste ou d'une s\'equence gr\^ace 
\`a son indice mis entre 
crochets, le premier \'el\'ement \'etant d'indice 0 (on peut aussi
indicier
en commencant \`a 1 en utilisant des
parenth\`eses au lieu de crochets, mais attention au cas d'ambiguit\'e avec
la d\'efinition d'une fonction
si on modifie un \'el\'ement d'une liste)
\begin{verbatim}
se:=NULL; se:=se,k^2$(k=-2..2); se:=se,1
li:=[1,2]; (li:=append(li,k^2))$(k=-2..2)
li[0],li[1],li[2]
\end{verbatim}

Les polyn\^omes sont souvent d\'efinis par une expression, mais
ils peuvent aussi \^etre repr\'esent\'es 
par la liste de leurs coefficients par ordre
de degr\'e d\'ecroissant, avec comme d\'elimiteurs \verb|poly1[| et \verb|]|.
Il existe aussi une repr\'esentation
pour les polyn\^omes \`a plusieurs variables. Les fonctions
\verb|symb2poly| et \verb|poly2symb| permettent
de passer de la repr\'esentation expression \`a la repr\'esentation
par liste et inversement, 
le deuxi\`eme argument d\'etermine s'il s'agit de polyn\^omes
en une variable (on met le nom de la variable) ou de
polyn\^omes \`a plusieurs variables (on met la liste des variables).
\vskip 2mm
\begin{center}
\begin{tabular}{|ll|}
\hline
\multicolumn{2}{|c|}{\bf S\'equences et listes}\\
\hline\hline
{\tt E\$(k=n..m)} &cr\'eer une s\'equence\\
\verb|seq(E,k=n..m)| &cr\'eer une s\'equence\\
{\tt[E\$(k=n..m)]} & cr\'eer une liste\\
\verb|makelist(f,k,n,m,p)| & cr\'eer une liste\\
\verb|op(li)| & passer de liste \`a s\'equence\\
\verb|nop(se)| & passer de s\'equence \`a liste\\
\verb|nops(li)| & nombre d'\'el\'ements\\
\verb|size(li)| & nombre d'\'el\'ements\\
\verb|sum| & somme des \'el\'ements\\
\verb|product| & produit des \'el\'ements\\
\verb|cumSum| & sommes cumul\'ees des \'el\'ements\\
\verb|apply(f,li)| & appliquer une fonction \`a une liste\\
\verb|map(li,f)| & appliquer une fonction \`a une liste\\
\verb|poly2symb| & polyn\^ome associ\'e \`a une liste\\
\verb|symb2poly| & coefficients d'un polyn\^ome\\
\hline
\end{tabular}
\end{center}
\index{sum@{\verb+somme+}}
\index{somme}
\index{product@{\verb+product+}}
\index{produit}
\index{cumsum@{\verb+cumSum+}}
\index{sommes cumul\'ees}
\index{apply@{\verb+apply+}}
\index{fonction!appliqu\'ee \`a une liste}
\index{map@{\verb+map+}}
\index{poly2symb@{\verb+poly2symb+}}
\index{symb2poly@{\verb+symb2poly+}}
\index{liste!des coefficients}
%

\subsection{Alg\`ebre et analyse}
Les instructions les plus souvent utilis\'ees sont dans le menu \verb|CAS|
(calcul diff\'erentiel, simplification, arithm\'etique, etc.).
Le menu \verb|Cmds| contient d'autres instructions, en particulier
tout ce qui est relatif \`a l'alg\`ebre lin\'eaire.

\subsection{Instructions graphiques} \label{sec:graphique}
Pour g\'en\'erer un graphe de fonction, surface, 
etc. vous
pouvez utiliser les assistants du menu \verb|Graphe|. Pour
les suites r\'ecurrentes, cr\'eez auparavant un niveau
de g\'eom\'etrie 2-d (menu Figure).
Vous pouvez aussi cr\'eer des objets g\'eom\'etriques, en utilisant
les instructions du menu \verb|Geo|,
par exemple \verb|point(1,2)| affiche le point de coordonn\'ees
1 et 2, \verb|droite(A,B)| la droite passant par deux points $A$ et
$B$ d\'efinis auparavant. 
On peut donner des attributs graphiques aux objets graphiques
en ajoutant \`a la fin de l'instruction ayant un r\'esultat graphique
l'argument \verb|affichage=...| dont la
saisie est facilit\'ee par le menu \verb|Graphe->Attributs|.

Lorsqu'une ligne de commande contient une instruction
graphique, le r\'esultat est affich\'e dans un rep\`ere 2-d ou 3-d selon
la nature de l'objet g\'en\'er\'e. On peut controler
le rep\`ere avec les boutons situ\'es \`a droite du graphique,
par exemple orthonormaliser avec le bouton {\tt \_|\_}.
Si une ligne de commande contient des instructions graphiques et non
graphiques, c'est la nature de la derni\`ere instruction qui d\'ecide
du type d'affichage.

L'instruction \verb|A:=click()| permet de 
d\'efinir une variable contenant l'affixe d'un 
point du plan que l'on clique
avec la souris. 


\subsection{Temps de calcul, place m\'emoire}
%
Le principal probl\`eme du calcul formel est la complexit\'e des 
calculs interm\'ediaires. Elle se traduit \`a la fois par le temps
n\'ecessaire \`a l'ex\'ecution des commandes et par la place m\'emoire
requise. Les algorithmes impl\'ement\'es dans les fonctions
de {\tt Xcas} sont performants, mais ils ne
\index{time@{\verb+time+}}
\index{temps de calcul}
peuvent pas \^etre optimaux dans tous les cas. La fonction \verb|time| 
permet de conna\^\i tre le temps d'ex\'ecution d'une commande (si ce temps
est tr\`es court, {\tt Xcas} ex\'ecute plusieurs fois la commande pour
afficher un r\'esultat plus pr\'ecis). La m\'emoire utilis\'ee 
appara\^\i t dans les versions Unix dans la ligne d'\'etat
(en rouge \`a bas \`a gauche). Si le temps d'ex\'ecution d'une
commande d\'epasse quelques secondes, il est possible que vous ayez
commis une erreur de saisie. N'h\'esitez pas \`a interrompre
l'ex\'ecution (bouton orange \verb|stop| en bas \`a droite, il est
conseill\'e de faire une sauvegarde de votre session auparavant).


\section{Programmation}
Comme le texte d\'efinissant un programme ne tient en g\'en\'eral pas
sur une ou deux lignes, il est commode d'utiliser un \'editeur
de programmes. Pour cela, on utilise
le menu \verb|Prg->Nouveau programme| de Xcas. Les boutons
assistants \verb|Fonctions, Test, Boucle| et le menu 
\verb|Prg->Ajouter|
facilitent la saisie des principales structures de controle 
de programmation.

\subsection{Tests}
On peut tester l'\'egalit\'e de 2 expressions en utilisant l'instruction
\verb|==|, alors que \verb|!=| teste si 2 expressions ne sont pas
\'egales. On peut aussi tester l'ordre entre 2 expressions 
avec \verb|<|, \verb|<=|, \verb|>|, \verb|>=|, il s'agit
de l'ordre habituel sur les r\'eels pour des donn\'ees num\'eriques
ou de l'ordre lexicographique pour les chaines de caract\`eres.

Un test renvoie 1 s'il est vrai, 0 s'il est faux. On peut combiner
le r\'esultat de deux tests au moyen des op\'erateurs logiques {\tt \&\&}
(et logique), {\tt ||} (ou logique) et on peut calculer la n\'egation logique
d'un r\'esultat de test {\tt !} (n\'egation logique).
On utilise ensuite
souvent la valeur du test pour ex\'ecuter une instruction
conditionnelle \verb|si ... alors ... sinon ... fsi|.
N.B.~: Xcas admet aussi une syntaxe compatible avec le langage C\\
\verb|if (condition) { bloc_vrai } else { bloc_faux }|.
 
Par exemple, on pourrait stocker la valeur absolue d'un r\'eel $x$
dans $y$ par~:
\begin{center}
\verb|si x>0 alors y:=x; sinon y:=-x; fsi;|
\end{center}
(on peut bien sur utiliser directement \verb|y:=abs(x)|).

Exemples~: Tester si un triangle dont on fait cliquer les 3 sommets \`a
l'utilisateur est rectangle. 

\subsection{Boucles}
On peut ex\'ecuter des instructions plusieurs fois de suite en utilisant
une boucle d\'efinie (le nombre d'ex\'ecutions est fix\'e au d\'ebut) ou
ind\'efinie (le nombre d'ex\'ecutions n'est pas connu).
On utilise en g\'en\'eral une variable de controle (indice de boucle
ou variable de terminaison).
\begin{itemize}
\item Boucle d\'efinie\\
\verb|for(init;condition;incrementation){ instructions }|\\
\verb|for ... from ... to ... do ... od|\\
Exemple, calcul de 10!\\
\verb|f:=1; for (j:=1;j<=10;j++){ f:=f*j; }|\\
\verb|f:=1; for j from 1 to 10 do f:=f*j; od;|\\
{\bf Attention}, vous ne pouvez pas utiliser \verb|i| comme indice
de boucle, car \verb|i| est pr\'ed\'efini (comme $\sqrt{-1}$)
\item Boucle ind\'efinie\\
\verb|while (...) { ... }|\\
Exemple, algorithme d'Euclide\\
\verb|while (b!=0){ r:=irem(a,b); a:=b; b:=r;}|
\end{itemize}
Xcas accepte aussi l'arr\^et de boucle en cours d'ex\'ecution
(\verb|if (...) break;|) dont
l'usage peut \'eviter l'utilisation de variables de controle 
compliqu\'ees.


\subsection{Fonctions (non alg\'ebriques)}
La plupart des fonctions ne peuvent avoir une d\'efinition par une formule alg\'ebrique. On doit souvent calculer des donn\'ees
interm\'ediaires, faire des tests et des boucles. Il faut alors d\'efinir
la fonction par une suite d'instructions, d\'elimit\'ees par \verb|{ ... }|.
La valeur calcul\'ee par la fonction est alors la valeur calcul\'ee
par la derni\`ere instruction ou peut \^etre explicit\'ee en utilisant le 
mot-clef \verb|return| suivi de la valeur \`a renvoyer (N.B.: l'ex\'ecution
de \verb|return| met un terme \`a la fonction m\^eme s'il y a encore
des instructions apr\`es).

Pour \'eviter que les donn\'ees interm\'ediaires n'interf\`erent
avec les variables de la session principale, 
on utilise un type sp\'ecial de variables,
les variables locales, dont la valeur ne peut \^etre modifi\'ee ou acc\'ed\'ee
qu'\`a l'int\'erieur de la fonction. On utilise \`a cet effet le mot-clef
\verb|local| suivi par les noms des variables locales s\'epar\'es par
des virgules.
Si une fonction calcule plusieurs donn\'ees on peut les renvoyer dans
une liste.


Exemple~: le PGCD 
\begin{verbatim}
pgcd(a,b):={
  local r;
  while (b!=0){ 
    r:=irem(a,b);
    a:=b;
    b:=r;
  }
  return a;
}
\end{verbatim}
On clique ensuite sur le bouton OK, si tout va bien, le programme 
\verb|pgcd| est d\'efini et on peut le tester dans une ligne de commande
par exemple par \verb|pgcd(25,15)|.

Dans la section suivante, on va voir comment ex\'ecuter en mode pas \`a
pas un programme, ce qui peut servir \`a comprendre le d\'eroulement d'un
algorithme, mais aussi \`a corriger un programme erron\'e.

\subsection{Ex\'ecuter en pas \`a pas et mettre au point}
La commande {\tt debug} permet de lancer un programme en mode
d'ex\'ecution pas \`a pas. Elle ouvre une fen\^etre permettant
de diriger l'ex\'ecution du programme pass\'e en argument.
Par exemple, on entre le programme~:
\begin{verbatim}
carres(n):={
  local j,k;
  k:=0;
  for (j:=1;j<n+1;j++) {
    k:=k+j^2;
  }
  return k;
}:;
\end{verbatim}
On tape pour debugger le programme {\tt carres} ci-dessus~:
\begin{center}
{\tt debug(carres(5))}
\end{center}
cela ouvre la fen\^etre du debugger.
En cliquant sur le bouton {\tt sst} on peut ex\'ecuter pas \`a pas
le programme en visualisant l'\'evolution des valeurs des variables
locales et des param\`etres du programme. Cela permet de d\'etecter
la grande majorit\'e des erreurs qui font qu'un programme ne fait
pas ce que l'on souhaite. Pour des programmes plus longs, 
le debugger permet de controler
assez finement l'ex\'ecution du programme en placant par exemple
des points d'arr\^et.

Exercice~: ex\'ecuter en mode pas \`a pas le programme \verb|pgcd|
pour quelques valeurs des arguments.

