Encadrement exact des racines réelles d’un polynôme avec leur multiplicité: realroot

### 6.32.2 Encadrement exact des racines réelles d’un polynôme avec leur multiplicité: `realroot`

`realroot` a 1 ou 4 arguments : un polynôme et un nombre rèel l et éventuellement deux réels a,b et cherche les racines rèelles du polynôme en utilisant l’algorithme de Vincent-Akritas-Strzebonski (VAS).
On peut aussi utiliser un argument supplémentaire pour dire que l’algorithme utilise les suites de Sturm : on met alors `sturm` comme premier argument. Mais les résultats seront moins précis.
`realroot(P,l,a,b)` et `realroot(sturm,P,l,a,b)` renvoient la liste des intervalles de longueur <=`l` où se trouvent les racines réelles de `P` situées dans `a..b` avec leur multiplicité. `realroot(P,l,a,b)` utilise l’algorithme de Vincent-Akritas-Strzebonski (VAS) alors que `realroot(sturm,P,l,a,b)` utilise les suites de Sturm qui sont moins efficaces.

- Si `realroot` a 1 argument (resp 2 arguments), `realroot(P)` (resp `realroot(sturm,P)`) renvoie la liste des intervalles où se trouvent les racines réelles de `P` avec leur multiplicité en utilisant l’algorithme de Vincent-Akritas-Strzebonski (VAS) (resp en utilisant les suites de Sturm). L’algorithme s’arrête dès qu’il a trouvé un intervalle qui contient une racine.
  On tape :
  `realroot(x```^```3-7*x+7)`
  On obtient :
  `[[[-4,0],1],[[1,3/2],1],[[3/2,2],1]]`
  Ce qui veut dire qu’il y a une racine dans l’intervalle [-4,0] qui est de multiplicité 1, une racine dans l’intervalle [1,3/2] qui est de multiplicité 1 et une racine dans l’intervalle [3/2,2] qui est de multiplicité 1.
  On tape :
  `realroot(x```^```5+2*x```^```4-6*x```^```3-7*x```^```2+7*x+7)`
  On obtient :
  `[[[-5,-1],1],[-1,2],[[1,3/2],1],[[3/2,2],1]]`
  Ce qui veut dire que -1 est une racine de multiplicité 2, les 3 autres racines sont de multiplicité 1 et se trouve dans les intervalles [-5,-1],[1,3/2],[3/2,2].
  On tape :
  `realroot(125*x```^```3-700*x```^```2+1225*x-686)`
  On obtient :
  `[[[1,2],2],[[2,4],1]]`
  Ce qui veut dire qu’il y a une racine de multiplicité 2 dans l’intervalle [1,2] et une racine de multiplicité 1 dans l’intervalle [2,4].
- Si `realroot` a 2 arguments (resp 3 arguments), `realroot(P,l)` (resp `realroot(sturm,P,l)`) renvoie la liste des vecteurs de coordonnées la valeur des racines réelles et exactes du polynôme et leur multiplicité ou des vecteurs de coordonnées un intervalle contenant une racine réelle du polynôme et la multiplicité de cette racine.
  Si l’intervalle renvoyé est [a1,a2] on a |a1−a2|<l et la racine x1 vérifie a1≤ x1 ≤ a2. On tape :
  `realroot(x```^```5+2*x```^```4-6*x```^```3-7*x```^```2+7*x+7,1e-5)`
  On obtient :
  `[[[-1598513/524288,-1598509/524288],1],[-1,2],`
  `[[2845609/2097152,2845625/2097152],1],`
  `[[3548417/2097152,3548433/2097152],1]]`
  ce qui donne en valeurs approchèes :
  `[[[-3.04892158508,-3.04891395569],1.0],[-1.0,2.0],`
  `[[1.35689210892,1.35689973831],1.0],`
  `[[1.6920170784,1.69202470779],1.0]]` On tape :
  `realroot(sturm,x```^```5+2*x```^```4-6*x```^```3-7*x```^```2+7*x+7,1e-5)`
  On obtient :
  `[[[-99907/32768,-399627/131072],1],`
  `[[177851/131072,44463/32768],1],`
  `[[13861/8192,221777/131072],1],[-1,2]]`
  ce qui donne en valeurs approchèes :
  `[[[-3.04891967773,-3.04891204834],1.0],`
  `[[1.35689544678,1.35690307617],1.0],`
  `[[1.69201660156,1.69202423096],1.0],[-1.0,2.0]]`
  On tape :
  `realroot(x```^```3-7*x+7,1e-5)`
  On obtient :
  `[[[-1598513/524288,-1598509/524288],1],` `[[2845609/2097152,2845625/2097152],1],`
  `[[3548417/2097152,3548433/2097152],1]]`
  ce qui donne en valeurs approchèes :
  `[[[-3.04892158508,-3.04891395569],1.0],`
  `[[1.35689210892,1.35689973831],1.0],`
  `[[1.6920170784,1.69202470779],1.0]]`
- Si `realroot` a 4 arguments (resp 5 arguments), `realroot(P,l,a,b)` (resp `realroot(sturm,P,l,a,b)`) ne renvoie que les racines situées dans l’intervalle [a,b].

On tape pour avoir les racines réelles de x3+1 :

`realroot(x```^```3+1, 0.1)`

On obtient :

`[[-1,1]]`

On tape pour avoir les racines réelles de x3−x2−2x+2 :

`realroot(x```^```3-x```^```2-2*x+2, 0.1)`

On obtient :

`[[[-3/2,-45/32],1],[1,1],[[11/8,23/16],1]]`

ou bien

`realroot(sturm,x```^```3-x```^```2-2*x+2, 0.1)`

On obtient :

`[[1,1],[[(-3)/2,(-45)/32],1],[[45/32,3/2],1]]`

On tape pour avoir les racines réelles de x3−x2−2x+2 dans l’intervalle [0;2] :

`realroot(x```^```3-x```^```2-2*x+2, 0.1,0,2)`

ou

`realroot(sturm,x```^```3-x```^```2-2*x+2, 0.1,0,2)`

On obtient :

`[[1,1],[[11/8,23/16],1]]`