Présents à la réunion, en fonction de l'ordre d'arrivée
Kai,
Emmanuel,
Sébastien,
Théo,
Anthony,
moi,
Julien,
Jérôme,
Laurent,
Xavier,
Stéphane,
Bruno,
Nicolas,
et Éric.
Impossible de mémoriser le nom kurde des plats
que nous avons consommés. Quant aux boissons,
nous avons bu de la Kilkenny, de la Guiness,
une bière au nom allemand, un Porto
et beaucoup de Coca-Cola.
La table centrale avec 10 places était réservée...
par un autre groupe. Nous nous sommes donc agglutinés
à six sur une table à 4 places. Julien a été
hébergé à la table d'à côté, qui avait 4 places pour
un groupe de 3. Lorsque Jérôme et Laurent sont arrivés,
ils sont restés un certain temps debout, jusqu'à
ce que Kai propose à Laurent d'échanger sa place
assise contre une place debout. Heureusement,
en fin de soirée, nous avons pu nous installer
sur une table plus étendue.
Julien est actuellement sur une mission où il doit
utiliser .NET et C#. Heureusement pour lui, il existe
un mécanisme en .NET générant des assemblies,
qui permet d'interfacer des modules indépendants,
éventuellement écrits dans
des langages différents [ Ceux qui pratiquent .NET
de temps en temps comprendront ce que Julien voulait
dire. Moi je n'ai pas compris. ].
Bien entendu, pour Julien,
construire une assembly,
cela signifie réunir quelques modules de
CPAN
et les interfacer avec .NET.
D'autres qui ont parfois moins de chance, ce sont ceux qui
travaillent sur
Solaris.
Bruno raconte qu'il a travaillé sur un système
disposant de
Sun Studio
et d'un Perl compilé avec
gcc
(à moins que ce soit l'inverse). Du coup, impossible
d'utiliser des modules utilisant
XS,
puisqu'il faut le même compilateur et les mêmes options.
Pour résoudre ses problèmes, Julien utilise CPAN, en privilégiant
les modules se terminant par Simple. Néanmoins,
dans certains cas, il ne cherche même pas si CPAN
offre une solution. Par exemple, pour analyser
du CSV simpliste, il utilise un bête
split
ou une expression rationnelle
avec capture. C'est vrai que dans le cas signalé,
chaque ligne du fichier à analyser contient exactement
cinq champs séparés par des points-virgules. D'autre part,
le contenu de ces champs ne justifie pas les précautions
habituelles du genre encadrement par des quotes (doubles ou simples)
ou échappement avec un backslash.
Nicolas a raconté qu'il a analysé les règles de filtrage IP
avec un module Perl pour les afficher ensuite avec
Graphviz.
Même si l'on imprime le graphe obtenu sur une feuille A0,
on obtient un graphe très touffu.
Une bonne raison de regretter la
disparition des Perl Power Tools :
cela permet de corriger certains bugs ou de compenser certaines
limites des outils Unix. C'est arrivé à Théo.
Il avait besoin de rechercher une chaîne de caractères
dans un fichier. Le problème semblait simple, mais
Théo n'est pas arrivé à le résoudre avec
grep.
Puis il a essayé avec :
perl -n-e'print if /reg-exp/'
Et cela fonctionne !
La raison ? Le fichier à analyser contenait des
"\0", qui stoppaient l'analyse par le grep
de GNU, mais qui ne gênent en rien les expressions rationnelles de Perl.
Xavier a
de nouveau
évoqué Sympa,
en remarquant que les
Mongueurs de Perl
utilisent
Mailman,
écrit en Python.
Emmanuel explique que cela montre que nous avons
l'esprit large. Xavier préfère Sympa, car le volume
de messages qu'il doit traiter est nettement plus
important que celui des Mongueurs et Sympa supporte
beaucoup mieux la montée en charge que Mailman.
Pour compiler le moindre programme sur AIX, cela
prend énormément de temps. Mais ce n'est pas forcément
mieux de demander des programmes préinstallés.
Quelqu'un a commandé à IBM un serveur AIX en
précisant bien qu'il voulait disposer
d'Apache
et de PHP
(sans même demander mySQL,
ça sera pour la prochaine fois).
Il a eu beaucoup de difficultés à obtenir
une machine avec ces deux logiciels.
Il est question de quelqu'un qui avait à sa disposition
un vieux PC avec 128K de mémoire. Qu'est-ce qu'on peut
en faire ? Il est quand même possible d'y installer
Linux. Évidemment, pas question d'y mettre X-Window
et OpenOffice.org !
Il existe une
distribution
de taille extrêmement réduite.
Lors de la réunion, c'est le nom de
Peanut Linux
(maintenant aLinux)
qui a été donné, mais au vu des caractéristiques,
il semblerait que ce soit une erreur, étant donné que
cette distribution comporte
plusieurs logiciels multimédia.
Pour en revenir à la machine avec 128K de mémoire,
une fois Linux installé, elle a servi de serveur
Internet, c'est-à-dire, si je me souviens bien,
serveur de courrier (POP, IMAP et Webmail), passerelle et pare-feu,
peut-être même LDAP.
Nicolas évoque un point passé inaperçu dans son
article sur svk :
la mention à redMine.
C'est un logiciel de gestion de projet écrit en
Ruby.
C'est un logiciel très fourni, avec de
nombreuses fonctionnalités,
dont certaines épateront les décideurs pressés, comme le
diagramme de Gantt.
Ce n'est pas un camembert 3-D en couleurs, mais c'est quand
même un schéma en couleurs, qui fait bien dans les
présentations Powerpoint.
Emmanuel nous raconte comment il s'est construit
une machine perso. En se déplaçant dans Boulogne-Billancourt,
il est tombé sur le seul Chinois de Boulogne-Billancourt
qui tienne un magasin d'informatique (tous les autres
Chinois de cette ville tiennent un restaurant). Là il a trouvé
l'ultime exemplaire d'un boîtier de dimension réduite.
Il l'a aussitôt acheté, une telle occasion risquant
de ne pas se renouveler. Ultérieurement, comme il travaillait
chez un client dans le 12e arrondissement,
il en a profité pour passer rue Dugommier (là, les Chinois
vendeurs d'informatique ne manquent pas) et il a acheté
tout ce qu'il faut pour remplir son boîtier, en prenant
soin de choisir des ventilateurs aussi silencieux
que possible. C'est ainsi qu'il utilise un ordinateur
qui se laisse oublier, tellement il est silencieux et
peu encombrant.
Julien évoque un sujet de programmation particulier,
la planification du travail dans les ateliers de peinture chez
Ford
(c'était longtemps après l'époque de la
Ford T,
pour laquelle l'acheteur pouvait choisir n'importe quelle couleur,
du moment qu'il choisissait le noir).
Un gros problème pour les ateliers de peinture est
que lorsqu'un atelier doit changer de couleur, cela occasionne
une grosse perte de temps, car il faut vider les réservoirs
de peinture et nettoyer les tuyaux avant de réapprovisionner
avec la nouvelle couleur. Donc des informaticiens de culture
mathématique ont écrit un super-programme d'optimisation
qui permettait d'obtenir la solution optimale absolue.
Seulement, le programme prenait 6 heures pour établir
la planification de la journée et d'autre part, les informaticiens
avaient oublié que les machines des ateliers
de peinture pouvaient tomber en panne de temps en temps.
Puis d'autres informaticiens, avec une culture venant plutôt
des sciences physiques, ont mis au point un nouveau
processus, basé sur le calcul d'une grandeur que l'on peut
interpréter comme une énergie ou comme un coût, et lorsqu'un
atelier a terminé de peindre un lot de voitures, il
« achète » un nouveau lot de voitures
en minimisant la dépense. [ On retrouve donc
deux des principales forces qui font bouger l'univers : l'énergie
et le fric. ]
Julien évoque d'autres
algorithmes d'optimisation,
comme l'optimisation consistant à simuler le
déplacement des fourmis d'une colonie.
Les fourmis doivent aller chercher de la nourriture
en partant de la fourmilière. Au début, elles se déplacent complètement
au hasard. Lorsqu'une fourmi trouve de la nourriture, elle
revient en laissant une trace olfactive. Ultérieurement,
les fourmis continuent à se déplacer au hasard, mais en
privilégiant le ou les chemins marqués par l'odeur d'une
fourmi. Et lorsqu'elles prennent ce chemin au retour, leur
odeur renforce l'odeur des fourmis qui les ont précédées.
Mais cette préférence n'est pas absolue et il reste
quand même la possibilité de choisir un chemin inutilisé
ou peu utilisé. De la sorte, si la situation évolue et
si un obstacle apparaît sur un chemin utilisé, les fourmis
peuvent adopter un itinéraire bis déjà marqué.
Julien évoque un autre domaine liant la programmation et les
mathématiques,
le calcul rapide des racines carrées.
La fonction part d'une constante particulière choisie selon des
critères qui dépassent l'entendement de Julien et le mien,
puis effectue un calcul itératif. Comme la constante a été
très bien choisie, il suffit d'une ou deux itérations
pour obtenir une très bonne approximation de la racine carrée,
donc autant développer la boucle pour écrire l'unique
itération ou les deux itérations nécessaires.
Julien nous renvoie à
l'article de Wikipedia sur John Carmack.
Et je vous renvoie
en fin de compte-rendu
où vous pourrez trouver quelques considérations
mathématiques sur le sujet. Rassurez-vous, c'est du
niveau terminale C (ou terminale S, comme on dit maintenant).
Faisant écho à Julien
il y a quelques mois,
Nicolas évoque un cauchemar :
l'encodage des textes. À force de travailler
sur plusieurs machines, il consulter des
textes encodés dans tous les principaux encodages
connus. Jérôme regrette qu'il n'y ait pas de
méta-informations dans les systèmes de fichiers
disponibles sous Unix et Linux.
Un sujet analogue, c'est comment convertir un
nombre gros-boutiste en petit-boutiste et inversement.
Julien évoque un moyen très rapide de faire cela,
en moins d'un cycle machine !
Si j'ai bien compris, cela consiste à utiliser
une mémoire avec un mode d'adressage astucieux.
Lorsque l'on stocke un nombre dans une orientation
donnée, on lit ensuite à une autre adresse associée
à la précédente (du genre on stocke à une adresse paire
et on lit à l'adresse impaire qui suit) et on obtient
le même nombre dans l'orientation qr/(?:gros|petit)-boutiste/
inverse.
À plusieurs occasions lors des réunions précédentes,
Nicolas et quelques autres se sont fait les ardents
défenseurs de
zsh.
Cette fois-ci, c'est Xavier qui nous donne son opinion. Oui,
zsh
est meilleur. Mais bash lui suffit amplement,
à quoi bon consacrer du temps à apprendre des
nouvelles fonctionnalités qui ne lui serviront pas ?
Julien, qui connaît à la fois Perl et C# nous signale
que les hachages, cela existe aussi en C#.
Mais alors que Perl permet d'initialiser un
hachage avec :
ou bien en copiant-collant un message du même
Julien quelques jours plus tôt :
using System;
using System.Collections;
public class SamplesHashtable {
public static void Main() {
// Creates and initializes a new Hashtable.
Hashtable myHT = new Hashtable();
myHT.Add("First", "Hello");
myHT.Add("Second", "World");
myHT.Add("Third", "!");
// Displays the properties and values of the Hashtable.
Console.WriteLine( "myHT" );
Console.WriteLine( " Count: {0}", myHT.Count );
Console.WriteLine( " Keys and Values:" );
PrintKeysAndValues( myHT );
}
public static void PrintKeysAndValues( Hashtable myHT ) {
Console.WriteLine( "\t-KEY-\t-VALUE-" );
foreach ( DictionaryEntry de in myHT )
Console.WriteLine("\t{0}:\t{1}", de.Key, de.Value);
Console.WriteLine();
}
Julien a également évoqué
TCL.
Peu de participants avaient entendu parler
de ce langage. C'est un langage de script
de la même génération que Perl,
mais qui n'a pas eu autant de succès.
La principale marque de TCL, c'est d'avoir
permis la création de l'interface utilisateur
Tk,
qui a été ensuite adaptée pour donner
Perl/Tk,
Python/Tk
et ainsi de suite.
Julien se compare à un borgne. En effet, il estime que
son niveau est nettement inférieur à celui de certains
participants à nos réunions. En revanche, s'il se compare
avec certains informaticiens qu'il côtoie tous les jours,
alors « au pays des aveugles, les borgnes sont rois ».
Un grand (?) projet à venir, c'est l'installation
d'Ubuntu
à l'Assemblée Nationale.
Deux questions se posent. Est-ce un projet si
grand qu'on veut bien le dire ? Après tout,
cela concerne un peu plus de 500 députés,
ainsi que l'assistant parlementaire de chaque
député, soit au total juste un millier de postes
à installer. D'autre part, certains regretteront
que les institutions politiques françaises
aient choisi une distribution étrangère, au
lieu d'adopter
Mandriva.
Mais il faut signaler que l'Assemblée
Nationale s'est adressée à une société
de service en logiciel libre française.
Emmanuel a profité de la présence de Xavier
pour lui parler des développeurs
d'OCS Inventory NG,
qui sont des collègues de Xavier,
puisque, comme pour
Lemonldap::NG::Handler
« NG » signifie « Nationale Gendarmerie ».
Mais il en avait déjà parlé au mois de février.
Il y a quelques années, lorsque le système de fichiers
reiserfs
est sorti, nombreux sont ceux qui ont prédit que ce serait
un ext2fs-killer.
Maintenant, lorsque l'on accole le nom de
Reiser
et le terme
killer,
ce n'est plus pour les mêmes raisons.
J'ai eu un moment d'hésitation en voyant Anthony, compte
tenu de la longueur de ses cheveux, qui a nettement augmenté
depuis qu'il a quitté la région parisienne et la Gendarmerie
Nationale pour rejoindre la Bretagne et l'Armée de Terre.
Contrairement à ce que laisserait supposer cette phrase,
la longueur des cheveux ne dépend pas d'un particularisme
local ou d'un règlement différent pour le personnel civil
des différentes forces armées françaises. C'est simplement
parce que c'est la compagne d'Anthony qui lui coupe les
cheveux et comme elle est actuellement enceinte, elle a
de la difficulté à accomplir cette tâche.
Quant à la vie professionnelle d'Anthony, il n'est
plus développeur, mais formateur. Il tient à préciser
que son boulot consiste à enseigner l'informatique,
pas à réinitialiser des disques durs et des
disquettes.
Non seulement Anthony habite en Bretagne, mais en plus
il habite dans un site calme et plaisant. Sa maison
est au bord d'un canal qui ne sert plus que pour
le tourisme fluvial en été. Donc, en dehors de cette
saison, il peut courir sur le chemin de halage,
faire un peu de kayak dans le canal, pêcher son
repas de midi, et ainsi de suite.
Sans aller jusqu'en Bretagne, il est possible
d'habiter en province et de travailler à Paris.
Avec le
TGV,
ceux qui habitent à
Vendôme
par exemple, ne sont qu'à une heure de Paris.
Et ce sera le cas bientôt pour les habitants de
Reims.
Alors pourquoi habiter en banlieue ?
À cela, on peut répondre que 1 heure de gare
à gare, cela ne veut pas dire 1 heure de porte
à porte. Dans un cas extrême, le mien, j'en ai
pour 3 minutes de gare à gare
précédé de 10 minutes à pied de mon domicile
à la gare de Bécon-les-Bruyères suivi
d'une demi-heure de marche ou de bus
de la gare de Clichy-Levallois jusqu'à mon travail,
à la limite entre Clichy-la-Garenne et Saint-Ouen.
Cela me prend à peine plus de temps à pied qu'en
bus, car mon trajet pédestre est en ligne droite,
tandis que le bus doit faire des détours pour passer
devant les gares SNCF et les stations de métro.
De plus, parmi les usagers, il y a assez souvent
des mères de famille avec poussette. Et lorsque
les autres usagers ne se préoccupent pas de laisser
le passage aux poussettes, les arrêts durent
assez longtemps, le temps que tout le monde puisse
monter.
Nous discutons de la place de la gent féminine
dans l'informatique. Il existe des femmes qui
sont de bonnes programmeuses, il existe
des femmes qui font de l'administration
système, mais il n'y en a pas beaucoup
qui ont l'esprit geek.
Et le troll est arrivé là où on ne l'attendait
pas. Doit-on dire « une femme administrateur
système » (par analogie avec « docteur »),
une « administrateure système »
(par analogie avec « un auteur, une auteure »)
ou une « administratrice système »
(par analogie avec la quasi-totalité des noms
en « teur », y compris « administrateur »
de biens, de société, etc.) ?
S'il y a des informaticiennes compétentes, voire brillantes,
il existe également des informaticiennes incompétentes.
J'en ai connu une qui devait rédiger une doc
et notamment, donner combien de temps
un job avait pris sur différentes architectures.
On lui demandait le temps CPU en
secondes, mais la machine MVS avait indiqué
0,16 minute. Ma collègue savait que pour convertir
les minutes en secondes, la première étape consistait
à ouvrir la calculette Windows, mais ensuite,
que fallait-il faire ? Précisons que cette
collègue avait un niveau bac+4, avec une maîtrise
en mathématiques appliquées et informatique.
Kai a récemment visité Taïwan. Il trouve que c'est
un pays de geeks. La plupart des gadgets
qu'il avait il y a quelques années étaient
d'origine japonaise, tandis que ceux qu'il a maintenant
sont d'origine taïwanaise.
Parmi ses gadgets, nous avons pu remarquer le
vélo de Kai,
plié dans un coin de la salle et qui n'encombrait
quasiment pas. Kai assure pouvoir déplier son vélo
en 5 secondes, mais il n'a pas dit combien le
pliage lui prenait de temps. Je rappelle que déjà,
Gaston Lagaffe
avait perfectionné le
vélo pliant
en ajoutant un ressort pour faciliter le dépliage
et un autre ressort pour faciliter le pliage.
Sachant que le ressort de dépliage était suffisamment
puissant pour tendre le ressort de pliage en même temps
qu'il dépliait le vélo et que le ressort de pliage était
lui aussi suffisamment puissant pour tendre le ressort de
dépliage lors du pliage du vélo. Julien aurait entendu
ces explications, il aurait fait remarquer qu'un physicien
aurait tout de suite détecté qu'il y avait un problème dans
le bilan énergétique de ce concept innovateur.
Pas besoin d'aller à Taïwan pour se dépayser. Kai nous
donne une adresse nettement plus proche, la
Maison des Trois Thés.
Kai ayant d'abord dit qu'elle se trouvait place Monge,
Sébastien a consulté Internet sur son téléphone portable
pour vérifier. Mais il n'a pas trouvé. En effet,
la Maison des Trois Thés
se trouve en réalité dans
une rue adjacente à la place Monge, mais cela, les
annuaires électroniques ne sont pas capables de le
comprendre. On peut y consommer de nombreuses
variétés de thés, contrairement à ce que le nom
de l'établissement semble indiquer. D'autre part,
le thé est servi selon le Gong Fu Cha, un art
traditionnel pour ce breuvage.
Tout d'abord, une rectification. Julien a évoqué le
calcul des racines carrées, alors qu'en fait,
il est question du calcul de l'inverse de la racine
carrée, fastInvSqrt. Mais lorsque l'on dispose d'une valeur, on
obtient facilement l'autre. Il suffit de calculer
au choix
1 / fastInvSqrt(x)
ou
x * fastInvSqrt(x)
Cela fait juste une opération de plus, c'est quand même
assez rapide.
Voici tout d'abord la fonction de calcul, légèrement
adaptée pour suivre le déroulement des calculs. De plus,
j'y ai mis trois itérations alors que deux suffisent largement
d'habitude.
#include <stdio.h>
#include <stdlib.h>
float fastInvSqrt(float x)
{
float xhalf = 0.5f * x;
int i = *(int*) &x;
printf("%g\n%08X\n", x, i);
i = 0x5f375a86 - (i >> 1);
x = *(float*) &i;
printf("%08X\n%g\n", i, x);
x = x * (1.5f-xhalf * x * x);
printf("%g\n", x);
x = x * (1.5f-xhalf * x * x);
printf("%g\n", x);
x = x * (1.5f-xhalf * x * x);
printf("%g\n----\n", x);
return x;
}
main ()
{
// printf("sizeof int = %d\n", sizeof (int));
fastInvSqrt(6e23);
fastInvSqrt(6.626e-34);
fastInvSqrt(1);
fastInvSqrt(2);
fastInvSqrt(3);
fastInvSqrt(4);
fastInvSqrt(1024);
exit(0);
}
Voici ensuite le résultat, remis sous forme tabulaire par
un programme Perl (j'ai fait assez de C pour l'instant, revenons
à un langage évolué).
Nombre
6e+23
6.626e-34
1
2
3
4
1024
i initial
66FE1C21
085C2FC6
3F800000
40000000
40400000
40800000
44800000
i final
2BB84C76
5B0942A3
3F775A86
3F375A86
3F175A86
3EF75A86
3CF75A86
x0
1.30952e-12
3.86353e+16
0.966225
0.716225
0.591225
0.483113
0.0301945
x1
1.29059e-12
3.88468e+16
0.998308
0.70693
0.576846
0.499154
0.0311971
x2
1.29099e-12
3.88485e+16
0.999996
0.707107
0.57735
0.499998
0.0312499
x3
1.29099e-12
3.88485e+16
1
0.707107
0.57735
0.5
0.03125
Et maintenant, quelques explications mathématiques sur le calcul.
Tout d'abord, la manipulation passant par la variable i.
Un float est représenté par une mantisse et un exposant
en base 2. Les 17 premiers bits sont l'exposant de la puissance
de 2, avec un décalage de 00111111 (qui explique le 3F8
pour la valeur 1, qui devrait avoir un exposant de 0).
En réinterprétant les octets comme un entier puis en appliquant
un décalage à droite, cela divise l'exposant (et sa constante
de décalage) par 2. Puis le résultat est soustrait à une constante,
pour deux raisons :
l'exposant change de signe, ce qui revient à calculer l'inverse,
cela rétablit la bonne constante de décalage, après le décalage et le changement de signe.
Si cela justifie le 5F3 de la constante, je ne sais pas comment
a été choisi le reste de cette constante pour que le calcul donne
une valeur approchée relativement bonne de la mantisse. D'ailleurs,
si vous comparez
les deux versions,
de la fonction,
vous constatez que la constante n'est pas la même :
0x5f375a86 contre 0x5f3759df.
Maintenant, considérons les calculs qui suivent.
C'est en fait la méthode de Newton appliquée à la
fonction
x -> 1/x2 - a
qui s'annule en 1/sqrt(a). La méthode de Newton
consiste à partir d'une approximation x0,
à repérer le point (x0, y0)
sur la courbe, à tracer la tangente en ce point, trouver le point où
cette tangente coupe l'axe des X et prendre l'abscisse comme
nouvelle approximation x1. Et on itère le
processus.
La dérivée de
x -> 1/x2 - a
est la fonction
x -> -2/x3
donc l'équation de la tangente en xn est :
y = -2x/xn3 + 3/xn2 - a
L'élément suivant de la liste est donc donné par :
-2xn+1/xn3 + 3/xn2 - a = 0
soit :
xn+1 = xn(3/2 - axn2 / 2)
où vous reconnaissez la formule de fastInvSqrt, à condition de savoir
distinguer les a et les x dans la fonction C.
Julien a évoqué une « spirale » à propos de la méthode
de Newton. En fait cela ne s'applique pas au calcul présent.
Voici la représentation graphique de la méthode de Newton,
pour le calcul de la racine carrée inverse, en prenant une valeur
initiale relativement éloignée.
Le premier schéma montre la fonction dont on cherche le zéro.
On part d'une première valeur, on trace un segment vertical jusqu'à la courbe,
puis on redescend obliquement le long de la tangente au point de la courbe.
Puis on recommence l'itération avec un nouveau segment vertical et un nouveau
segment oblique tangent. Cela fait penser à des dents de scie.
Le second schéma représente la fonction dont on
cherche le point fixe. On part de la valeur initiale, on monte par un
segment vertical jusqu'à la courbe, puis on rejoint la diagonale d'équation
y = x par un segment vertical, puis on
repart à la verticale. Dans ce cas, cela donne un genre d'escalier.
Avec une fonction décroissante, on aurait eu une spirale comme le
suggérait Julien.
On part d'une faible valeur de x. On monte verticalement
jusqu'à la valeur (relativement élevée) correspondante de y.
On rejoint la diagonale par un segment horizontal, donc à une abscisse x
assez élevée. On redescend vers la courbe, pour trouver un y
de valeur faible, quoique supérieur au premier x. On revient
à la diagonale par un segment horizontal. Ces quatre segments constituent la
première spire de la spirale. On continue avec un segment vertical et ainsi
de suite, ce qui donne une spirale convergeant vers le point fixe de la
fonction.
Le choix de la valeur initiale x0 est très important pour avoir une convergence
rapide, mais en général, presque toutes les valeurs initiales permettent de converger.
Il existe toutefois quelques cas pathologiques. Par exemple, avec