Historique
du Quinto
par Gérard A. Langlet
ou
un exemple d’amélioration du schmilblic par
Compression Algorithmique
La
Compression algorithmique consiste, étant donné un problème quelconque, à
réaliser les actions suivantes :
a)
Trouver une solution au problème et écrire le programme ou l'ensemble de
programmes (fonctions définies en APL, sous-programmes ou procédures en
FORTRAN, PASCAL, C++ et tutti quanti) sans bogues, résolvant le maximum de cas
qu'englobe le problème dans sa définition.
b)
Itérer, même si cela prend des mois ou des années, la procédure suivante,
indépendante du problème, et déjà décrite, bien avant la naissance de
l'informatique, par Nicolas Boileau (Art Poétique, 1674) :
Cent fois sur le métier, remettez votre
ouvrage,
Polissez-le sans cesse et le repolissez.
Traduisons
en langage clair et pragmatique : il s'agit de ne jamais se contenter de l'état
actuel d'un programme - appelons-le "schmilblic", mais
d'intervenir régulièrement pour essayer de l'améliorer.
La
règle sera, en gros, que la version suivante d'un programme devra, si possible,
permettre de traiter des sous-cas du problème non envisageables à l'aide de la
version courante (par manque d'espace, par lenteur ou coût trop élevé). Il
n'est pas interdit de chercher en outre à réduire :
la taille du programme lui-même
(encombrement),
la taille maximale intermédiaire de la
mémoire nécessaire
(surtout si le programme est
dynamique, cas avec APL) ,
le temps d'exécution, même pour les petits
cas.
Pour
parvenir à ces fins, TOUS les moyens (intellectuellement honnêtes) seront bons
- on conseillera notamment d'apprendre APL rien que pour s'habituer à penser en
vecteurs, en tableaux (et, si possible, au parallélisme, dans un futur proche).
Durant
des années, j'ai appliqué cette méthodologie réductionniste à l'ensemble
des programmes et des sujets abordés. Après plus de 20 d'une telle pratique, il
avait surgi une question, à la fois physique et philosophique, somme toute
triviale:
Un
programme, comme un gaz parfait, est-il infiniment compressible ?
On
peut se douter que la réponse est NON.
Alors,
on pouvait se proposer comme objectif, lorqu'on effectue de la recherche, de
trouver le(s) noyau(x) algorithmique(s) incompressible(s), et de répondre en
parallèle à la question subsidiaire :
Si un programme P a été réduit en P puis en P
puis en P et si un programme Q (n’ayant
apparemment rien à voir avec le précédent) a été réduit en Q puis en Q puis en
Q, qu'y-a-t-il de commun entre P et Q ?
Notes.
Il vaut mieux que le problème posé corresponde à quelque chose
d'utile.
Il importe, pour une meilleure
crédibilité, que le problème soit posé par un tiers et non par soi-même.
Ce
numéro du journal essaye de proposer une sorte de passage depuis l'ère de
l'Intelligence Artificielle à celle de l'Intelligence Naturelle; nous rappellerons qu'un périodique tel que Les Nouvelles d'APL
est fait pour apporter et pour recevoir de l'information (de et à toute une
communauté passionnée d’améliorations, sympathique, internationale - même
mondiale, et d'un niveau mathématique nettement supérieur à celui des
programmeurs moyens; c'est peut-être pour cela aussi qu'APL ne peut connaître le
succès d'un simple BASIC). Dès 1989, j'avais soupçonné que la réponse aux
questions posées plus haut s'écrivait ¬\ (et ne pouvait donc pas être déduite
aisément par des chercheurs en mathématiques, en physique ou informatique, ne
connaissant pas APL). Même dans la sphère APL, cet idiome surprenant restait
assez peu connu : il est absent, ou à peine mentionné, dans la plupart des
manuels et livres, quels que soient leurs auteurs.
D'après
[Br88], l'IA couvre la résolution des puzzles. C'est bien ce que pensait aussi
JJ. Girardot, lorqu'il soumit, dans le numéro 6 [JJG93] le puzzle appelé
"Inversion Diabolique" et proposa un logiciel en APL90 "qui
analyse les coups du joueur (et les siens propres) et acquiert ainsi une
connaissance progressive des configurations; en tant que joueur, il devient de
plus en plus difficile à battre...").
Alors, je me dis que résoudre le puzzle
en se servant des propriétés de ¬\
prouverait la puissance des concepts que je cherchais à faire admettre - très
difficilement - par ailleurs.
Je
me mis à l'œuvre, compte tenu des résultats obtenus par la recherche sur la
compression algorithmique, et dès le numéro 7, je pus donner une solution
directe - avec laquelle l'ordinateur ne peut jamais perdre s'il joue en premier
- cette solution se résume à une demi-ligne d'APL-ISO (Lan93). La résolution du
même problème, appelé MAGIC en Angleterre, fit aussi l’objet d’un article de ma
part (The Fractal Magic Universe) publié dans VECTOR en juillet 1993. Pour les
lecteurs connaissant le livre, en français, de Maurice Dalois, relatif à
APL*PLUS PC (d’ailleurs toujours disponible, avec sa disquette, auprès
d’Uniware), signalons que le jeu appelé « MERLIN » au Québec est
encore ... une variante du même jeu.
C'est
alors qu'intervint Michel Dumontier, dans le numéro 8 avec le jeu du Quinto,
dont il donnait la solution pour N ¹ 3 5 en corrigeant les aberrations du
domino par une fonction capable d'inverser numériquement une matrice à
déterminant nul. Michel affirmait que ce Quinto était un
"super-puzzle" et que l'inversion matricielle binaire - initialement
utilisée pour résoudre l'inversion diabolique avant que l'on trouve, par
symétrie, une solution évitant l'inversion - ne saurait le résoudre dans
tous les cas. Effectivement, si on en reste au jeu de
JJG, l'inversion diabolique n’oblige pas à traiter des matrices à déterminant
nul, simplement parce que le vecteur des masques ou inverseurs forme une base
vectorielle de même rang que le jeu; mais on peut proposer des jeux plus
subtils, avec des masques inverseurs redondants donc non indépendants, tels que
des choix de différentes séries de ces masques permettraient de passer d'une
certaine configuration de départ à un certain but. Alors, la matrice aurait un
déterminant effectivement nul modulo 2. Et je n’ai jamais compris que pour
résoudre un problème posé en binaire pur, il faille utiliser une méthode faite
pour l’arithmétique flottante. Il manquait - et il manque toujours - en APL, la
primitive « domino modulo 2 » (mais, à ma connaissance, cette
primitive - ou procédure intégrée - n’existe pas non plus dans les autres
langages de programmation).
Il
faut dire que je m'intéressais plus à l’algorithmique de cette inversion
matricielle modulo 2 qu'aux puzzles en général, mais là, un certain défi se
devait d'être relevé. Michel reçut, le lendemain, par Fax, les solutions du
Quinto, jusqu'à N=20, qu'il ne connaissait pas ! Dans le numéro suivant, il le
mentionne et montre que la méthode du domino flottant corrigé ne parvient
pas à trouver la solution pour N=18 (ce qui confirme la faillite de
l'arithmétique en virgule flottante à cause de ses troncatures inévitables;
pourtant 18 n'est manifestement qu'un tout petit nombre).
Devant
organiser une table ronde ("Workshop") à APL94 sur l'algèbre binaire
et ses immenses potentialités inconnues, même de la plupart des APListes, je
décidai que le Quinto, royalement rebaptisé "Quin" en anglais,
servirait de support thématique; grâce à l’aide de Louis Métayer, à Saclay, je
pus sortir des solutions jusque N=54, et surtout montrer qu'il était possible,
en APL, de calculer juste avec un micro-ordinateur, car la résolution exigeait
d'inverser une matrice (à déterminant nul) de 544 termes sans
tolérer une erreur sur un seul bit.
Je
ne cherchai pas plus avant à "réduire" la résolution du puzzle, ayant
fait remarquer, aussi bien dans les Nouvelles d'APL que dans APL-CAM Journal,
dans l'article en anglais destiné à la table ronde, que les matrices à inverser
étaient des matrices-bandes diagonales à motifs répétitifs, donc très creuses,
pour lesquelles il suffirait d’adapter modulo 2 les algorithmes en vigueur pour
les matrices numériques (Cholevsky, Lanczos etc...) si l'on voulait réduire
drastiquement la dimension des matrices à traiter (donc le problème, donc le
temps consommé).
L'important
est qu’avec l’inversion généralisée, on pouvait imaginer des problèmes avec des
règles très compliquées (un clic sur une case pouvant inverser un nombre
quelconque de cases un peu partout, et un clic sur une autre case inverser un
jeu de cases sans rapport avec le premier, etc...) et qu'il faudrait alors bien
inverser une matrice de dimension N2 par N2 dans le cas
général pour voir s'il existait alors des solutions. En outre, le damier peut
ne pas être carré mais prendre une forme quelconque; il peut même se composer
d'éléments (sous-damiers) non connexes, avec des cases ne servant à rien.
Le
Quinto était presque oublié lorsque je reçus de St Pétersbourg fin décembre
1994, un fax bizarre, manifestement chiffré (pour un profane), mais dans lequel
je reconnus (et vérifiai) qu'il s'agissait de la solution du Quinto 100.
Les explications de l'auteur, assez laconiques, me permirent néanmoins
d’identifier l’émetteur et de comprendre comment ce zélé jeune homme (voir sa
photo dans le numéro 14 p. 110 - une page prédestinée pour un as du binaire)
avait opéré, très intelligemment et matriciellement. Je lui demandai de bien
vouloir transformer son Fax en article, en lui proposant de le publier en
France, en français et en primeur. Les délais d’écriture, de correction et de
traduction ne nous permirent pas d'inclure ledit article dans le dernier numéro
14, d'autant plus qu'aucune fonction APL n'était jointe au premier envoi.
L'article
d’Ilya montre clairement qu'un schmilblic peut en cacher un autre, et
qu'avec APL mis entre les mains des jeunes - ce qui se pratique en Russie et
pas assez chez nous - nous n'avons pas
fini de comprimer les algorithmes.
(Déjà, il n'apparaît presque plus autre
chose que le symbole ¬,
comme prévu, et les boucles ne sont que des propagations...).
Mais
nous allons profiter de la circonstance - tout à fait fortuite - pour répondre
en toute impartialité, par exemple à M. Henriod, à propos de l'efficacité de
l’utilisation d’APL étendu (indépendamment du constructeur).
En
outre, lors de la première réunion du Bureau d’AFAPL à peine élu (le 22 mars
1995), il fut convenu que l’un des sujets à aborder lors de la prochaine
demi-journée d’exposés et de débats, concernerait justement les avantages et
inconvénients de la programmation en APL étendu par rapport à celle respectant
l’APL-ISO, normalisé depuis 1989, en bref l’APL tout court.
J'avais
écrit à Ilya Mironov que nous nous efforcions (sauf cas particuliers) de
publier des listes de programmes de préférence en APL-ISO, d'abord parce que
c'est la seule norme actuellement en vigueur (et à peu près respectée), ensuite
parce que cela permet à tout lecteur de se servir des fonctions publiées,
quelle que soit l'implantation à laquelle il a accès, mais surtout parce
que c'est souvent beaucoup plus efficace, alors que les expressions APL
nécessaires ne sont pas nécessairement plus longues.
Autrement
dit l’utilisation, apparemment simple, de symboles tels que › œ et
¨ , peut coûter cher si on ne la pratique pas à bon escient (sans
essayer les équivalents vectoriels ou matriciels dans lesquels APL excelle
depuis toujours).
A
preuve ce qui suit.
Reprenons
les deux fonctions IGEN et IQUIN de l'article d'Ilya Mironov:
Construction
de la ligne N+1 à partir de la ligne 1 (argument X):
’ X„IGEN X;D;I;Z;ŒIO
[1] D„½Z„X^I„~ŒIO„1
[2] IT:X„~(Z„X)¬Z¬(1‡X,0)¬0,¯1‡X ª
…IT—¼D¬I„I+1
’
Résolution du QUIN ou Quinto N×N. Le résultat Y est la première
ligne de la solution :
’
Y„IQUIN N;X;X0
[1]
X„›X0„IGEN Y„N½0 ª Y„X0 SEGœX¬IGEN¨›[ŒIO]N N½1,Y
’
Note. En APL DYALOG\W standard, la syntaxe correspond à celle
d'APL*PLUS II et la fonction IQUIN devient par exemple IQUIND:
’
Y„IQUIND N;X;X0
[1]
X„›X0„IGEN Y„N½0 ª Y„X0 SEG†X¬IGEN¨‡[ŒIO]N N½1,Y
’
Transformons IGEN en IGENM avec un argument et un résultat M
matriciels tel que chaque ligne de M (matrice non nécessairement carrée) soit
un vecteur X. Cela prend moins d'une minute:
’
M„IGENM M;D;I;Z;ŒIO
[1] D„1†½Z„M^I„~ŒIO„1
[2] IT:M„~(Z„M)¬Z¬(0 1‡M,0)¬0,0 ¯1‡M ª
…IT—¼D¬I„I+1
’
Alors, la fonction IQUIN se transforme aisément en ISOQUIN:
’
Y„ISOQUIN N;A;X0
[1]
X0„IGEN Y„N½0 ª N„N,N ª A„N½X0 ª Y„X0 SEG A¬IGENM N½1,Y
’
Cette nouvelle fonction paraîtra familière à tout APListe ne
connaissant pas encore APL2 (et s'exécutera en I-APL comme en APL*PLUS I et
dans tous les APL étendus)
Puis, objectivement, mesurons les résultats dans plusieurs
implantations d'APL compatibles avec APL2, à l'aide de la fonction MESURE
(elle-même en APL-ISO) qui fournit comme résultat le temps en secondes mis pour
exécuter son argument droit, lequel contient une expression APL (ici en
TryAPL2, version gratuite, compactée et francisée):
N„10 ª
MESURE'R„IQUIN N' ª MESURE 'RR„ISOQUIN N' ª RRR
0.55
0.22
1
Cet
intéressant résultat permet de voir que la résolution du Quinto est devenue
presque instantanée (une demi-seconde pour N=10), et que le retour à la norme
ISO8485 a effectivement encore divisé le temps d'exécution, dans ce cas, par un
facteur 2,5.
Opérons
alors systématiquement:
Expression
APL : |
R„IQUIN
N |
R„ISOQUIN
N |
Implantation
: TryAPL2 sur IBM 450DX2 (486 à 33
MHz) |
Temps
(s) N„10
0.55 N„20
1.98 N„100
48.6 |
Temps
(s) 0.22 0.55 10.9 |
Expression
APL : |
R„IQUIN
N |
R„ISOQUIN
N |
Implantation
: APL*PLUS III (sur la même machine) |
N„10
0.22 N„20
0.82 N„100
19.7 N„1000 (non mesuré) |
0.05 0.22 5.4 3902. |
Implantation
: DYALOG APL/W (sur
la même machine) |
N„100 37.6 (IQUIND N) |
12.85 |
Implantation
: APL.68000 Niv. II sur
Macintosh SE 1/40 |
N„10
4.87 N„20
17.85 N„50
127.3 N„100
667. |
2.69 9.35 87.7 608. |
Sous
TryAPL2 et APL*PLUS III, le gain est considérable (facteur 4); il est moindre
en DyalogAPL/W et en APL.68000 Level II.
En
ce qui concerne les derniers essais, il ne faut pas comparer en absolu les
temps obtenus sur un Macintosh dont la vitesse ne dépasse pas celle d'un PC-AT
80286.
Mais
il semblerait que l'extension, compatible avec APL2, de l'APL.68000 "Level
II" soit, par rapport à l'APL-ISO ("Level I") mieux programmée
que celle d'APL2 et d'APL*PLUS III.
En
général, la gestion des tableaux (vecteurs ou matrices) binaires composantes de
tableaux généralisés, est encore mal optimisée, en place-mémoire et en vitesse,
dans toutes les implantations des APL étendus; (ce qui est une condiion
nécessaire pour que les futures versions puissent devenir, d’année en année, de
plus en plus efficaces)
Tout
jugement comparatif doit se trouver modulé en fonction du contexte.
Exemple
: Ce n'est pas parce que les mesures effectuées en APL.68000 Niveau II
fournissent des temps à peu près du même ordre de grandeur pour N=100, qu'il
faudrait en conclure que la syntaxe de type APL2 va redevenir plus performante
pour N élevé, car les comparaisons n'ont pas été effectuées non plus dans le
même environnement : Si, en TryAPL2 (une application DOS), on dispose d'une
mémoire libre d'environ 250 kilo-octets, les mesures en APL*PLUS III ont été
effectuées avec une mémoire libre de plus d'un Méga-octet (ce qui permet
d'obtenir le résultat du Quinto 1000 pendant le déjeûner). La mémoire
disponible, donnée par ŒWA dans cet essai sur ce Macintosh n'était que de 30
kilo-octets environ - ce qui n'empêche pas d'obtenir le résultat du Quinto 100
pendant le petit déjeûner.
Or,
le calcul effectué par ISOQUIN 100 fabrique temporairement des matrices
de 10000 items, invisibles par l'utilisateur, matrices dont la présence exige
une réorganisation dynamique de la mémoire gruyérisée de la zone de
travail (en anglais ce regroupement des trous de mémoire, effectué à l’insu de
l’utilisateur s’appelle "garbage collection"). Un effet, de type relativiste,
se produit dans toutes les implantations d'APL; il est moindre lorsque la
mémoire disponible est grande par rapport à la mémoire déjà occupée. En outre,
d'autres effets, pernicieux, apparaissent parfois, lorsqu'une zone de travail
contient beaucoup d'objets, avec une table de symboles frisant l'apoplexie.
(On
peut parfois rendre plus rapide une fonction aux dépens des autres, en
utilisant des noms de variables locales débutant par A, B ou C plutôt que par
X, Y ou Z, simplement parce que la recherche dans chaque expression interprétée
trouve l'adresse en machine plus vite si la table des symboles possède une
organisation - cachée à l'utilisateur - de type alphabétique. En APL.68000, les
fonctions vont plus vite, en outre, si les noms ne dépassent pas trois
caractères, car, autrement, la recherche du nom s'effectue par double adressage
!).
La
zone utilisée pour le test sur Macintosh comprenait plus de 600 fonctions avec
une table des symboles - bien remplie - de l'ordre de 2000 symboles.
En
conclusion, aurait-on pu prévoir, en 1993, que l'on pourrait résoudre le Quinto
100 en moins de 6 secondes en APL ? Et le Quinto 253 (entièrement affichable
sur l'écran) avec TryAPL2 gratuit ? Et le Quinto 1023 avec moins d'un
Méga-octet de mémoire ?
Sans l'intervention d'Ilya Mironov, il est bien clair que la
réponse est NON.
Mais, on ne sait jamais, l'amélioration du schmilblic n'a
peut-être pas encore atteint le nec plus ultra... Et nous serons fiers d’avoir,
grâce à APL, introduit le néologisme øìèëü-áëèê en russe comme un
super-synonyme de Quinto, a priori extensible à TOUT problème.
Références [Voir aussi les
références données par I. Mironov].
[Br88] J.A. Brown, S. Pakin
& R. Polivka, APL2 at a Glance, Prentice
Hall, N.J. (1988),
ISBN
0-13-038670-7, p. 359.
[JJG93]
J.J. Girardot, L’Inversion Diabolique, Les Nouvelles d’APL N° 6 (mars
1993), p.55.
[Lan93]
G.A. Langlet, La Rétroversion de l’Inversion Diabolique, Les Nouvelles d’APL N° 7 (juin 1993), p. 123,
et The Fractal MAGIC Universe, VECTOR, (BAPL, UK), Vol. 10
No 1 (juillet 1993), pp.137-142.
[Dum93] M.J. Dumontier, Un « super-puzzle »,
le Quinto, Les Nouvelles d’APL N°7 (oct.1993). Voir aussi les numéros
suivants.