Al-Khawarizmismes
Dans les années 800, le mathématicien perse Abou Jafar Muhammad Ibn Mūsa al-Khuwārizmī introduit le zéro (indien) dans les chiffres arabes, décrit comment résoudre les équations du second degré, et propose de résoudre certains problèmes mathématiques en répétant une séquence d’opérations jusqu’à ce qu’un « critère d’arrêt » soit satisfait. Au XIIème siècle, les moines latins nomment « algorismus » cette méthode d’Al Khuwarizmi, qui devient « algorithme » en français en 1554.
Pour cette idée fondamentale des mathématiques et indispensable en informatique, Al Khuwarizmi a reçu à titre posthume un cratère lunaire à son nom, et environ 165’000 fautes d’orthographe commises par des ignares qui mettent un y grec à la place d’un ī persan…
Après que des fous aient passé leur vie à calculer à la main des tables de logarithmes ou des décimales de pi, c’est évidemment l’arrivée des ordinateurs qui a donné à l’algorithmique son importance actuelle. Aujourd’hui, vous utilisez des algorithmes tous les jours, sans le savoir. Par exemple lorsque vous cliquez sur le titre d’une colonne sur votre ordinateur, et que les lignes sont triées en un clin d’oeil. Ou lorsque vous demandez votre route à un GPS. A chaque fois que vous téléphonez ou utilisez votre carte de crédit, vous utilisez des algorithmes de cryptographie qui étaient de la science-fiction il y a 50 ans.
Bon, ça c’était l’introduction. En fait cet article est motivé par la coïncidence de trois événements survenus la semaine passée :
- Mes collègues ont (enfin) réussi à faire fonctionner un algo que j’avais pondu pour optimiser les mouvements d’une machine. Un algo assez simple (optimisation gloutonne, évidemment…), bien testé, mais pas suffisamment documenté, donc pas bien utilisé, donc inspirant une certaine méfiance… Mais là ça marche! Vidéo bientôt.
- La découverte de l’existence du Prix J.H. Wilkinson attribué tous les 4 ans aux auteurs d’un logiciel de calcul numérique particulièrement efficace, dont certains que je connaissais depuis peu (FFTW et Triangle) et d’autres à découvrir (deal.II)
- Enfin, sur les liens du jeudi de Neamar, un lien vers la page d’un chercheur listant les algorithmes considérés comme les plus importants par ses collègues et lui. Il y en a 32, assez pour évaluer vos connaissances en la matière ou les rafraichir, et apprendre éventuellement des choses:
- l’algorithme A* trouve le chemin « le plus court ou presque » entre deux noeuds d’ un graphe. Il est utilisé dans les GPS et dans les jeux vidéo pour les déplacements des personnages par « intelligence artificielle »
- Beam Search peut dans certains cas trouver un chemin meilleur qu’A*, mais nécessite plus de calculs.
- La dichotomie est la technique que les enfants utilisent pour chercher un mot dans le dictionnaire : on l’ouvre à la moitié, puis à la moitié de la moitié où se trouve le mot et ainsi de suite jusqu’à trouver la bonne page.
- « Branch and bound » : Séparation et évaluation est une méthode générique d’optmisation combinatoire permettant d’éviter d’évaluer toutes les possibilités.
- L’ algorithme_de_Buchberger est un truc de matheux datant de 1976, qui généralise à la fois le plus ancien algorithme connu, celui du PGCD d’Euclide et celui de l’élimination gaussienne (connue des Chinois dàjà 1700 ans plus tôt…)
- La compression des données omniprésentes dans nos fichiers informatiques. Il existe de nombreux algorithmes spécifiques, parmi lesquels la transformée_de_Burrows-Wheeler me parait particulièrement géniale.
- L’échange des clés Diffie-Hellman permet à deux personnes qui ne se connaissent pas d’échanger des informations confidentielles sur un canal non sécurisé. Indispensable en télécommunications.
- L’algorithme de Dijkstra détermine le chemin le plus court entre deux neouds d’un graphe, sous certaines contraintes expliquées dans l’article sur le GPS encore.
- Les différences finies permettent d’approximer des dérivées, comme dans la formule f’(x) = (f(x+h) – f(x-h)) / 2h. (Je les utilise tous les jours, mais est-ce vraiment des algorithmes ?)
- La Programmation Dynamique est une méthode d’optimisation sous contrainte. Elle permet d’obtenir une solution optimale à partir des solutions optimales de sous-problèmes. Curieusement, en 1976, on amontré que les algorithmes de programmation dynamique sont équivalents à ceux de recherche d’un chemin optimal dans un graphe…
- L’algorithme d’Euclide pour déterminer le plus grand diviseur commun (PGCD) de deux entiers est le plus ancien algorithme connu. Il est paru dans les « Eléments » d’Euclide autour de 300 av J.C et ne nécessite pas de factorisation des nombres.
- L’algorithme « espérance maximisation » est très utilisé en traitement d’images.
- La transformée de Fourier rapide (FFT) est extrêmement utilisée en traitement du signal, et plein d’autres domaines, jusque dans l’étude des succès Hollywoodiens.
- La descente de gradient est l’algorithme le plus connu pour obtenir le minimum d’une fonction à plusieurs variables.
- Les fonctions de hachage permettent de manipuler plus facilement de grosses données en les réduisant à des empreintes. Shazam utilise cette idée de manière spectaculairement efficace. Mais ici aussi, j’hésiterais à parler d’algorithme pour une « simple » fonction…
- Le Tas est une structure de données exploitée dans beaucoup d’algorithmes informatiques très efficaces comme le tri par tas. ( Il faut absolument que je trouve le temps d’étudier le « soft heap« , une structure de données « miraculeuse » découverte en 2000 )
- L‘algorithme de Karatsuba permet de multiplier 2 (grands) nombres plus vite qu’avec la méthode que vous avez apprise à l’école.
- L’algorithme LLL détermine des vecteurs de base « presque » orthogonaux à partir d’un grand nombre de vecteurs. Il est utilisé en cryptographie.
- l’algorithme_de_Ford-Fulkerson permet de résoudre le problème de flot maximum
- Le Tri fusion permet de réarranger rapidement une liste dans un ordre spécifique
- La Méthode_de_Newton permet de trouver une approximation des zéros d’une fonction, des solutions d’une équation à plusieurs variables, ou les minima/maxima.
- Q-learning est une technique d’ »apprentissage renforcé »
- le Crible quadratique est la meilleure méthode de factorisation d’un nombre, à part le crible sur le corps des nombres généralisés qui est à peine meilleur mais beaucoup plus compliqué. Si vous voulez casser une clé RSA, c’est ce qu’il vous faut, en plus de beaucoup de gros ordinateurs…
- RANSAC, pour »RANdom SAmple Consensus » est un algorithme d’ajustement de paramètres à des données qui ignore les données « visiblement complètement fausses »
- RSA, pour Rivest_Shamir_Adleman, est le génial algorithme de cryptographie a clé révélée utilisé dans la plupart des systèmes de sécurité actuels : carte bancaire, commerce électronique etc.
- l’algorithme_de_Schönhage-Strassen effectue des multiplications de grands entiers en utilisant la FFT. Sacrés mathématiciens…
- l’ algorithme_du_simplexe permet de résoudre les problèmes dits de programmation linéaire, dans lesquels on cherche à optimiser la valeurs d’une fonction de plusieurs variables devant satisfaire des contraintes d’inégalités.
- La décomposition_en_valeurs_singulières permet de factoriser des matrices rectangulaires, donc de résoudre des systèmes linéaires surdéterminés (avec plus d’équations que d’inconnues). Elle est utilisée dans de nombreux domaines, de la robotique aux prévisions météo.
- Résoudre des systèmes d’équations linéaires par élimination de Gauss-Jordan ou décomposition de_Cholesky est l’une des opérations les plus communes en analyse numérique, utilisée dans pratiquement tous les domaines de l’ingénierie.
- les « tenseurs de structure » (Structure_tensor en anglais) sont très utilisées en traitement d’image : ils permettent de quantifier l’appartenance d’un pixel à une région homogène. Méritent-ils de figurer dans les algorithmes ? la question est ouverte.
- Union-Find est une structure de données permettant de partitionner des données dans des ensembles disjoints, et de trouver rapidement à quel ensemble appartient une donnée ainsi que de réunir rapidement des ensembles.
- L’algorithme de Viterbi, une retombée de la conquête spatiale permettant de corriger les erreurs de transmission en télécommunication. Il est bien caché dans vos téléphones portables, mais il est là.
Connaissez-vous d’autres algorithmes dignes de figurer dans la liste ? les commentaires sont là pour les proposer.
La reconnaissance vocale est morte : pet à son âme.
D’après « 2001 l’Odyssée de l’Espace », nos ordinateurs devraient comprendre notre voix depuis 9 ans. Depuis 1997, on trouve des logiciels de reconnaissance vocale pour PC, et depuis peu nos téléphones disposent de cette fonction. Mais on ne l’utilise pas. Je ne connais personne qui dicte ses e-mails, et vous ?
Comme tous les geeks j’ai essayé de temps en temps, parfois passé une heure à lire des textes d’apprentissage de la voix la plus monocorde possible à la nouvelle version d’un soft, et puis abandonné devant ses piètres performances. Ca ne marche pas, ou pas assez bien.
Robert Portner analyse cet échec dans »Rest in Peas: The Unrecognized Death of Speech Recognition« , titre subtilement traduit en français dans le présent article.
Le problème, c’est qu’après une phase de progrès rapides à la fin du siècle passé, le taux d’erreur de mots plafonne à 10% depuis 2001 , soit environ le triple du taux d’erreur d’un être humain. Et encore, c’est pour l’anglais « standard ». Le taux d’erreur est bien plus élevé pour d’autres langues, et catastrophique pour une conversation entre supporters de foot à la sortie du match.
Pourtant dans les années 1990, des systèmes très fiables avaient été mis au point pour distinguer quelques mots bien choisis dans des cockpits d’avion ou des chiffres au téléphone, et on s’était légitimement attendus à ce que la Loi de Moore permette de traiter rapidement le langage naturel. Et effectivement, aujourd’hui on sait bien reconnaitre des mots isolés. On sait à peu près éliminer les absurdités non conformes à la grammaire dans des phrases simples comme « le chat ment je la sous rit. » Mais pour distinguer entre « le chas mange la souris », »le chat mange là, sous l’riz » et »le chaman gela, sourit » et , il faut comprendre le sens de la phrase, voire le contexte dans lequel elle est prononcée…
Si l’ordinateur doit connaitre la différence entre un quadrupède carnivore et le trou d’une aiguille pour traiter une phrase triviale, on imagine que ce n’est pas demain qu’on dictera des contrats* ou des rapports à une machine. De gros projets ont été lancés par des poids lourds de l’informatique pour tenter de modéliser la connaissance humaine. Par exemple le projet MindNet de Microsoft [2] a analysé des millions de pages de textes existants pour construire un graphe sémantique gigantesque, duquel il ressort effectivement que dans une phrase comportant « chat » et « souris », le plus probable est que le chat chasse la souris. Un tel graphe peut certainement être utile en traduction automatique car on dispose d’un texte de départ, mais pour la reconnaissance vocale il faudrait étendre le graphe à la structure des phrases utilisées en conversation courante, qui peut être bien distincte du langage écrit. Et pour faire ça automatiquement, il faudrait la reconnaissance vocale…
Comme le note Portner, on pensait au début que la reconnaissance vocale était un premiers pas vers l’intelligence artificielle. Aujourd’hui de nombreux chercheurs estiment que l’intelligence artificielle est indispensable pour atteindre une reconnaissance vocale de qualité acceptable [2]. Les gros projets de recherche ont été abandonnés les uns après les autres, bloqués devant le mur si bien décrit par les Perlisismes sur l’intelligence artificielle comme:
« Une année de travail sur l’intelligence artificielle est suffisante pour vous faire croire en Dieu »
Le nombre de recherches sur « reconnaissance vocale » ou « Dragon Naturally Speaking » sur Google baisse régulièrement depuis 2001. Comme aucune idée fondamentalement nouvelle ne vient relancer la recherche, la reconnaissance vocale est morte, en toute discrétion.
Note* : me rappelle l’histoire de la secrétaire d’un célèbre ingénieur de la génération disctaphone qui avait commandé « 310 mètres d’isolation entre 2 étages » au lieu de « 3 centimètres » . Ca c’est avec les 2% d’erreurs de transcription humaines…
Références:
- The History of Automatic Speech Recognition Evaluations at NIST
- Microsoft Research : MindNet
-
Janet M. Baker et al. « Research Developments and Directions inSpeech Recognition and Understanding« , IEEE Signal Processing Magazine [75] MAY 2009
Optimisation de la Joconde
Cette image me donne enfin l’occasion de consacrer un article marrant au célèbre mais barbant « problème du voyageur de commerce« . Si vous cliquez sur Mona Lisa, vous verrez qu’elle est produite par une seule ligne brisée zig-zaguant entre 100’000 points sans jamais s’entrecouper. De plus la ligne n’a ni début ni fin, elle forme un cycle. Autrement dit, on peut dessiner la Joconde comme un cercle déformé, sans lever le crayon… Je viens de publier une petite applet en processing qui montre ça.
Le dessin a initialement été produit par Robert Bosch, un prof de maths allemand qui étudie l’ « Opt Art », l’utilisation de techniques d’optimisation dans l’art. La méthode est assez simple:
- on prend une image en « niveaux de gris »
- on dispose un grand nombre N de points sur l’image, resserrés dans les zones sombres, plus espacés dans les zones claires. Craig S. Kaplan a eu l’idée d’utiliser l’algorithme « Voronoï Stippler » [2] qui fait ça de manière remarquable.
- Ensuite, il suffit de résoudre le problème du voyageur de commerce à N villes pour obtenir le circuit le plus court entre les N points, donc sans intersection.
Quand vous lisez « il suffit de.. » , il faut vous méfier. C’est souvent sous cette formule lapidaire qu’on cache l’os. En réalité, le problème du voyageur de commerce (« Travelling Salesman Problem » en anglais, TSP dans la suite) est un problème « NP-complet », un de ceux qui nécessite un nombre « non polynomial » d’opérations pour sa résolution, « non polynomial » étant un euphémisme. En l’occurence, il faut en principe mesurer la longueur des N! (N factorielle…) cycles hamiltoniens possibles passant par les N points pour déterminer lequel est le plus court. Au delà de N=20, on oublie.
Mais le TSP a un intérêt certain pour beaucoup d’applications pratiques dans lesquelles N est bien plus grand, ce qui justifie la recherche d’algorithmes efficaces mêmes s’ils ne fournissent pas la solution absolument optimale. Le site TSP de Georgia Tech est une mine d’exemples et d’infos sur les progrès de la résolution du TSP. On y trouve également Concorde, un solveur de TSP open source très performant basé sur la programmation linéaire. Il détient le record du plus gros TSP résolu, pour N=85’500 calculé en 135 années de CPU, mais résout des problèmes raisonnables en un temps qui l’est aussi. J’ai eu l’occasion de m’en servir pour optimiser le parcours d’une perceuse de circuits imprimés où N valait autour de 1000: quelques minutes de calcul permettent d’économiser des secondes de travail par circuit. Il existe d’ailleurs un Concorde en ligne pour résoudre vos (pas trop gros) problèmes de TSP.
Pour revenir à la Joconde, elle fait l’objet d’un petit concours car il n’est pas sur que le chemin affiché dans l’image soit le plus court possible entre les 100’000 points définis par R. Bosch. Ce chemin, calculé par Yuichi Nagata avec Concorde a une longueur de 5’757’191 unités, alors qu’on a pu déterminer que le chemin ne peut pas être plus court que 5’757’044 unités. Il est donc possible qu’il existe un chemin encore plus court de 0.0026% ! Tout ce qu’il vous faut pour le trouver, c’est le fichier mona-lisa100K.tsp, et touiller un peu le code de Concorde ou de son concurrent TSPLib. Ah, et un superordinateur peut être utile aussi. Si vous trouvez le chemin le plus court, vous gagnerez la somme mirobolante de $100 !
Références:
- Robert Bosch, « Opt Art« , Math Horizons, February 2006, pages 6–9.
-
Adrian Secord, « Weighted Voronoi Stippling« , 2002, Proceedings of 2nd NPAR, Annecy, p 37-43
Hardware, software, tabula ?
Au début, tout était clair : un ordinateur était un assemblage de circuits électroniques formant le hardware, piloté par du software définissant la séquence d’opérations à effectuer. Et puis tout est devenu compliqué.
Charles Babbage, inventeur de la première machine programmable, et Ada Lovelace, auteur du premier logiciel
D’une part, pour réaliser des opérations plus complexes, il est apparu plus simple de les « microprogrammer » : les puces des processeurs incorporent du logiciel « figé » qui décompose chaque instruction du langage machine en opérations encore plus simples.
D’autre part, les circuits logiques programmables permettent désormais de réaliser des circuits électroniques très complexes par programmation. A l’aide d’un langage spécifique comme VHDL, on décrit le fonctionnement du circuit, puis un compilateur génère des données que l’on écrit dans le circuit comme dans une mémoire afin de le configurer comme souhaité. De plus en plus de puces trônant dans vos téléphones portables, appareils photo, voitures ainsi que dans toutes les machines industrielles imaginables sont de ce type. On peut ainsi y implanter des fonctions spécifiques à l’application s’exécutant de façon extrêmement rapide, et au besoin adjoindre sur la même puce, par programmation toujours, un « processeur softcore » permettant d’exécuter un logiciel traditionnel. Bref, maintenant on peut programmer un circuit vierge pour qu’il se comporte comme un microprocesseur microprogrammé programmable, vous me suivez ?
Les circuits « PLD » peuvent être programmés une fois pour toutes, éventuellement reprogrammés de temps en temps à l’instar d’une mémoire flash. Les FPGA, plus récentes, se programment comme des mémoires RAM, et sont donc reprogrammables souvent et rapidement.
L’étape suivante pourrait être de les reprogrammer en fonctionnement. C’est ce que propose l’entreprise Tabula avec sa technologie « 3D Spacetime » incarnée dans ses circuits ABAX . Ces circuits peuvent être reprogrammés des milliers de fois par seconde et peuvent donc réaliser sur une seule puce des fonctions qui auraient nécessité plusieurs circuits très différents.
En quelque sort, Tabula réalise l’équivalent de puces « multicouches » en empilant des surfaces de silicium selon la dimension du temps. On peut objecter que ceci réduit d’autant la vitesse des circuits, mais d’autre part, on peut optimiser la surface de silicium réellement utilisée à chaque étape, par exemple pour traiter plus de données en parallèle. Point non négligeable, cette technologie réduit aussi beaucoup le coût de l’interconnexion des puces : on remplace des connecteurs en or et du circuit imprimés multicouches par des bits de données. Bientôt un PC au format d’une boite d’allumette, voire au même prix ?
Plus ça avance, plus la Loi de Moore me semble avoir encore de beaux jours devant elle. Merci à Malcolm pour avoir renforcé mon optimisme en me parlant de Tabula. Et peut-être bien que j’achèterai quelques actions quand ils seront cotés…
Tri réversible ?
En informatique, le tri est une opération incontournable car il est beaucoup plus rapide de rechercher une information dans une liste triée que dans un fouillis. C’est pourquoi j’ai longtemps cru qu’une liste triée contenait plus d’information qu’une liste non triée, car je voyais le tri comme un pré-traitement permettant d’accélérer les opérations suivantes, donc un « plus » par rapport à une situation « moins » performante.
Pris d’un doute il y a quelques années, j’avais posé la question sur un forum consacré à l’informatique théorique :
« est-ce qu’une liste triée contient vraiment plus d’information qu’une liste non triée ?”
Un érudit professeur m’avait répondu simplement ceci :
« ce contient d’ est- information liste liste? non plus qu’ qu’ triée triée une une vraiment ».
J’ai mis un moment à comprendre la profondeur de cette réponse : ma question, une fois les mots triés par ordre alphabétique, était devenue incompréhensible, et contenait donc moins d’information que la phrase originale ! Depuis je sais que l’informatique détruit toujours l’information.
Ce petit concours a reposé la question sous un angle intéressant : est-il possible de programmer un algorithme de tri « réversible », permettant de remettre une liste triée dans son état initial ? Évidemment oui : il suffit de stocker en plus l’information perdue lors du tri, le plus simple étant de mémoriser l’état initial de la liste par exemple en ajoutant à chaque élément trié son numéro d’ordre :
« ce2 contient7 d’10 est-1 information11 liste5 liste14 non15 plus9 qu’3 qu’12 triée6 triée?16 une4 une13 vraiment8 ”.
Pour une liste contenant n éléments, on a besoin de log(n) bits* pour stocker chaque numéro, donc de n.log(n) bits au total.
Peut-on faire mieux? On pourrait se dire que beaucoup d’algorithmes de tri comme QuickSort permutent des éléments après les avoir comparés, et qu’il suffirait donc de stocker le résultat des comparaisons effectuées, soit un bit par test, pour pouvoir ensuite « défaire le tri » en parcourant la liste des bits à l’envers. Combien faut-ils de bits ? ben … au moins n.log(n) aussi puisque c’est justement le nombre de comparaisons qui détermine la « complexité » des algorithmes de tri, et que les bons algorithmes ont une complexité de n.log(n).
Rien ne sert de se casser la tête sur « algorithme de tri réversible », il ne peut pas être plus efficace que de simplement stocker l’ordre initial des données. Etonnant non ?
Le problème, c’est que la donnée du concours spécifie qu’on n’a le droit de stocker que 50% d’information supplémentaire par rapport à la taille des données : si on trie 4K octets, on n’a droit qu’à 2K de données supplémentaires. Or en fonction de ce qui précède on a besoin de 4096*log(4096) bits, soit 6K, plus que les données! En passant, ça signifie qu’en triant beaucoup de petites données, on peut perdre plus de la moitié de l’information contenu dans la liste initiale !
Bref, personne n’a gagné le petit concours parce que ce n’était tout simplement pas possible.,
Note* : en informatique, log(n) dénote évidemment le logarithme binaire ou base 2












