• Aucun résultat trouvé

Code et machine universelle

Dans le document COMPLEXITÉ ALGORITHMIQUE (Page 34-47)

Le modèle de calcul

1.2 La machine de Turing

1.2.3 Code et machine universelle

Un ordinateur peut être programmé pour effectuer différentes tâches, alors qu’il semble à première vue qu’une machine de Turing est spécifique à un problème particulier. Nous allons voir qu’il n’en est rien et qu’il existe une machineuniverselle capable d’exécuter un programme qu’on lui fournit en entrée (selon le vocabulaire informatique, cette ma-chine est donc un interpréteur). L’existence d’une telle mama-chine capable d’exécuter tout

« programme » qu’on lui fournit en entrée n’a rien d’évident a priori, et il s’agit d’une des particularités cruciales des machines de Turing (et de nos ordinateurs bien sûr). Cette notion apparaît déjà dans l’article fondateur de Turing [Tur37].

Une telle machine prend en entrée un « programme » et nous devons donc d’abord voir comment coder ce programme, qui n’est rien d’autre que la description d’une machine de Turing. Nous allons donc définir le code d’une machine de Turing : il s’agit essentiel-lement de coder les alphabets d’entrée et de sortie, l’ensemble des états et la fonction de transition.

1-L Définition (code d’une machine de Turing)

SoitM= (Σ,Γ,B,Q,q0,qa,qr,δ)une machine de Turing àk rubans. Nous supposerons sans perte de généralité queΣ={1, 2, . . . ,|Σ|} ⊂N,Γ ={1, 2, . . . ,|} ⊂NetB=|, et queQ={1, 2, . . . ,|Q|} ⊂N,q0=1, qa=|Q| −1etqr =|Q|(ainsi, la seule donnée des tailles deΣ,Γ etQnous permettra de connaîtreΣ,Γ,B,Q,q0,qaetqr).

Pour décrire la machineM, on spécifiera en unaire le nombrek de rubans ainsi que|Σ|,

|et|Q|, tandis que la fonction de transitionδsera codée par un motuδdonnant toutes les transitions possibles.

1.2. La machine de Turing 15

Plus précisément, lecodedeM est le mot〈M〉=1k01|Σ|01|01|Q|0uδ sur l’alphabet{0, 1}, oùuδ est défini comme suit :

– tout d’abord, pour tout élément s = (q,γ1, . . . ,γk1) (Q\ {qa,qr})×Γk−1, si δ(s) = (r,γ2, . . . ,γk,d1, . . . ,dk)alors on code la transition par le mot

us=1q01γ101γ2. . . 01γk−101r01γ201γ3. . . 01γk01d101d2. . . 01dkdi=0sidi=G,1sidi=Set2sidi=D;

– on notes1, . . . ,st les éléments de(Q\{qa,qr})×Γk−1(disons dans l’ordre lexicogra-phique, mais peu importe) ;

– on définit alorsuδ=us

10us

20 . . . 0us

t qui encode toutes les transitions possibles.

Nous avons donné une définition précise du code〈M〉d’une machine de TuringMmais il suffit de retenir qu’un tel code est simple et découle directement de la définition deM. Il y aurait bien d’autres codes possibles, notamment faisant intervenir des codages binaires plus compacts — mais cela n’est pas nécessaire. Il faut simplement que le code, en tant que mot sur{0, 1}, soit manipulable aisément sur le ruban d’une machine de Turing.

Afin de préparer la construction d’une machine universelle ci-dessous, nous allons voir que l’on peut réduire la taille de l’alphabet sans trop nuire à l’efficacité de la machine : en effet, on peut construire une machine « équivalente » sur un alphabet restreint. Nous devons d’abord définir la notion de machines équivalentes : nous dirons qu’une machine en simule une autre si elle a le même comportement à un codage près des entrées/sorties.

Pour coder les entrées/sorties, nous utiliserons un morphisme, c’est-à-dire une application φ:ΣΣ′⋆ telle queφ(uv) =φ(u)φ(v)(en d’autres termes, il s’agit de coder chaque lettre deΣpar un mot surΣ, et l’image d’un mot deΣest alors la concaténation des images de ses lettres). Un morphismeφpréserve les longueurssi∀u,vΣ,|φ(u)|=|φ(v)|: cette notion est utile pour inverser aisément le morphisme (décoder).

1-M Définition (simulation)

SoitM une machine de Turing d’alphabets d’entréeΣet de travailΓ. Une machineM (d’alphabets d’entrée Σ et de travailΓ) simuleM s’il existe un morphisme « d’entrée » φ:ΣΣ′⋆et un morphisme « de sortie »injectif et préservant les longueursψ:ΓΓ′⋆

tels que, pour toute entréexΣ,M(x)s’arrête ssiM(φ(x))s’arrête, et dans ce cas : – M(x)accepte ssiM(φ(x))accepte (même acceptation),

– et de plusM(x) =ψ−1(M(φ(x)))(même résultat de calcul).

Bien que la simulation soit une notion concernant les machines, sixest un mot, on dira par abus de langage que le calcul deM surφ(x)simule le calcul deM sur x (ou plus simplement queM(φ(x))simuleM(x)).

16 Chapitre 1. Le modèle de calcul 1-N Remarque Le lemme suivant montre qu’on peut se ramener à des machines sur l’alphabet binaire (le symbole blanc en plus bien sûr). On pourrait se contenter de l’idée de la démonstration esquissée ci-dessous, mais la démonstration relativement for-melle que nous proposons ensuite poursuit deux objectifs : d’abord, montrer que l’on peut manipuler formellement les machines de Turing, puis illustrer par la complexité des détails nécessaires comparativement à la simplicité des idées qu’il est inutile de le faire une fois qu’on a appréhendé les capacités des machines de Turing. Par la suite, nous n’en-trerons plus dans tant de détails lorsqu’il s’agira de manipuler les machines de Turing car ils obscurcissent les idées sous-jacentes.

1-O Lemme (réduction de l’alphabet)

SiM= (Σ,Γ,B,Q,q0,qa,qr,δ)est une machine de Turing, alors il existe une machineM d’alphabet d’entréeΣ={0, 1}et d’alphabet de travailΓ={0, 1,B}, qui simuleM (avec un morphisme d’entréeφ:ΣΣ′⋆) et telle que :

– siM(x)s’arrête en tempstalorsM(φ(x))s’arrête en temps6tlog|Γ|; – siM(x)utilise un espaces, alorsM(φ(x))utilise un espace2slog|Γ|.

De plus, les deux machines ont le même nombrek de rubans et il existe une machine de Turing fixée (indépendante deM) qui calcule le code deMà partir du code deM. Idée de la démonstration Chaque lettre de l’alphabetΓ sera codée en binaire et

occu-peralog|cases sur les rubans deM(voir la figure1.4). La machineMconsidérera alors ces blocs de cases comme une seule lettre deΓ et pourra effectuer la transition deM qui convient. Les têtes effectuent à la volée les opérations de codage/décodage qui ne nécessitent qu’une mémoire finie puisque le nombre de lettres est fini.

a b c d B

0 0 0 1 1 0 1 1 B B

Figure 1.4 – Changement de l’alphabet{a,b,c,d,B}en{0, 1,B}sur un ruban : chaque lettre est codée sur deux bits.

Démonstration Soitγ(0), . . . ,γ(|Γ|−2),B les éléments deΓ etψ:ΓΓ′⋆le morphisme qui àγ(i) associe le code binaire dei surb =⌈log(|Γ| −1)⌉bits (en ajoutant des zéros en tête si nécessaire) et qui àBΓ associeBb Γ′⋆ : ce sera le morphisme de sortie,

1.2. La machine de Turing 17 tandis que le morphisme d’entréeφ:ΣΣ′⋆est simplement la restriction deψàΣ (rappelons en effet queΣΓ).

La machineMa le même nombrekde rubans queMet chaque ruban aura le même rôle que dans M (c’est-à-dire qu’on fait une simulation ruban par ruban). Chaque ruban deM est divisé mentalement en « blocs » de b cases correspondant chacun au code des lettres se trouvant sur les rubans deM. Pour simuler une transition de M, les têtes de M se trouveront sur la première case des blocs correspondant aux cases lues parM, elles liront ce bloc de la gauche vers la droite en retenant le mot lu au fur et à mesure, puis reviendront en début de bloc en écrivant le nouveau mot (correspondant à la nouvelle lettre deΓ à écrire) de la droite vers la gauche, et enfin se déplaceront éventuellement à gauche ou à droite deb cases pour se positionner en début du nouveau bloc et simuler la transition suivante.

Lors d’un déplacement à droite debcases à la fin de la simulation d’une transition, il faut prêter attention au ruban de sortie en écriture seule. Sur ce ruban comme sur les autres, lorsqu’on les survole on aimerait laisser inchangées les cases du bloc que l’on vient de traiter, mais on ne peut pas les lire et on doit quand même écrire quelque chose à la place (par définition, toute transition doit écrire un symbole dans la case où se trouve la tête). Pour remédier à ce problème, dans les états de déplacement on indiquera ce que la tête de sortie doit écrire.

Une étape deM sera alors simulée par au plus3b2étapes deM. Il nous faudra de nombreux états supplémentaires pour retenir le mot à lire ou à écrire dans le bloc et pour les déplacements. Ainsi, à chaque étatq deM, on associera les états suivants :

– l’état de lecture qlecu1,...,uk−1 (pour tous mots u1, . . . ,uk−1 Γ′⋆ de taille b1) signifie que les préfixes des blocs lus jusqu’à présent de gauche à droite sur les k1premiers rubans (le ruban de sortie est en écriture seule) sontu1, . . . ,uk−1; – l’état d’écritureqecru2,...,uk pour tous motsu2, . . . ,ukΓ′⋆de tailleb1signifie qu’il faut encore écrire, de droite à gauche, les préfixesu2, . . . ,uk dans les blocs desk1derniers rubans (le ruban d’entrée est en lecture seule) ;

– l’état de déplacementqdepi1,...,ik;x pour−b ijb etxΓ′⋆(|x|b1) signifie qu’il faut encore se déplacer de|ij|cases (à gauche siij<0et à droite sinon) et que le mot qu’il reste à écrire sur le ruban de sortie dans l’ordre des déplacements estx;

– on ajoute un état d’acceptation noté qacc et un état de rejet noté qrej (à ne pas confondre avec les étatsqaetqr deM) ;

– enfin, l’état initial est rlecε,...,ε(oùεdésigne le mot vide), pourr=q0l’état initial deM.

Les transitions deMse déduisent alors aisément :

– pour un état de lecture, tant qu’on n’est pas à la fin du bloc (|ui|<b1), on lit la case courante qui complète le préfixe et on se déplace à droite :

δ(qlecu1,...,uk−1,(a1, . . . ,ak−1)) = (qlecu1a1,...,uk−1ak−1,(a2, . . . ,ak−1,B),(D, . . . ,D));

18 Chapitre 1. Le modèle de calcul – lorsqu’on arrive en fin de bloc (c’est-à-dire|ui|=b1), il faut effectuer le

chan-gement d’état correspondant à la transition deMet commencer à écrire de droite à gauche le nouveau mot sur le bloc.

Plus précisément, si on noteδ(q,(γ1, . . . ,γk−1)) = (r,(γ2, . . . ,γk),(d1, . . . ,dk)), et ψ(γi) =uiai (pour|ui|=b1etai Γ) etψ(γi) =vibi (pour|vi|=b1et biΓ) alors :

δ(qlecu1,...,uk−1,(a1, . . . ,ak−1)) = (recrv2,...,vk,(b2, . . . ,bk),(G, . . . ,G));

– pour un état d’écriture, tant qu’on n’est pas au début du bloc, on écrit la dernière lettrebi dans la case courante :

δ(recrv2b2,...,vkbk,(a1, . . . ,ak−1)) = (recrv2,...,vk,(b2, . . . ,bk),(G, . . . ,G));

– lorsqu’on arrive en début de bloc, si r est un état terminal deM alors on passe dans l’étatqacc ouqrej selon que r est acceptant ou rejetant : ainsi, si b2, . . . ,bk sont des symboles deΓalors

δ(recrb2,...,bk,(a1, . . . ,ak−1)) = (qacc,(b2, . . . ,bk),(S, . . . ,S)) sir=qa(et de manière similaire sir=qr).

Si en revancher n’est pas terminal, alors on écrit la lettre correspondante et on passe dans un état de déplacement, en effectuant le premier mouvement de ce déplacement.

Ainsi, si comme précédemmentδ(q,1, . . . ,γk−1)) = (r,2, . . . ,γk),(d1, . . . ,dk)), alors on définit :

ij=−b+1sidj=G,

ij=0sidj=S,

ij=b1sidj=D,

et pour gérer le ruban de sortie, siψ(γk) =ψ1. . .ψb :

sidk=Galorsx=Bb−1(on écrira des blancs en allant vers la gauche),

sidk=Salorsx=ψ1b−1(il faut toujours écrireψ1car on reste sur place),

sidk=Dalorsx=ψ2. . .ψb (il faut écrireψ(γk)car on va à droite).

On a alors

δ(recrb2,...,bk,(a1, . . . ,ak−1)) = (rdepi1,...,ik;x,(b2, . . . ,bk),(d1, . . . ,dk));

– pour un état de déplacement, il s’agit de se déplacer d’un bloc vers la gauche ou la droite (b cases) ou de rester sur place.

Si toutes les têtes sont arrivées à destination (début du bloc pour la transition suivante), c’est-à-dire siij=0pour tout jet x=ε, alors on passe dans l’état de lecture en effectuant le premier déplacement à droite :

δ(rdep0,...,0;ε,(a1, . . . ,ak1)) = (rleca1,...,ak−1,(a2, . . . ,ak1,B),(D, . . . ,D)).

1.2. La machine de Turing 19 Si les têtes sont encore en route, on continue leur trajet : on définit

dj=Getij=ij+1siij<0,

dj=Setij=0siij=0,

dj=D etij=ij1siij>0, et alors

δ(rdepi1,...,ik;x1...xm,(a1, . . . ,ak−1)) = (rdepi1,...,ik;x2...xm,(a2, . . . ,ak−1,x1),(d1, . . . ,dk)).

Chaque étape deMest ainsi simulée par3b2étapes deM(b1étapes pour lire le bloc de gauche à droite,b1pour écrire les nouveaux symboles de droite à gauche etb pour se déplacer d’un bloc vers la gauche ou la droite). Puisque

b=⌈log(|Γ| −1)⌉2 log|Γ|,

le temps mis parMest6tlog|. De même, puisque chaque case deMest remplacée parb cases deM, l’espace utilisé parMest2slog|.

Nous venons d’écrire explicitement la fonction de transition de M en fonction de celle deM. La machine de Turing, indépendante deM, qui suivrait ces instructions calculerait donc le code deMà partir de celui deM. Il serait bien sûr fastidieux mais tout à fait faisable de donner le code d’une telle machine. ⊓⊔

Cette réduction d’alphabet est cruciale pour les machines universelles que nous construi-sons maintenant. En guise d’échauffement, nous propoconstrui-sons l’exercice suivant.

. 1-P Exercice

Montrer qu’une machine de Turing àk>1rubans de travail fonctionnant en temps t peut être simulée par une machine de Turing à un seul ruban de travail fonction-nant en tempsO(t2). D’où vient la perte de temps ?

Indication : cf. figure1.6.

Dans la plupart des cas, nous n’avons pas besoin d’une machine universelle très perfor-mante : c’est pourquoi nous en présentons d’abord une dont le principe est simple et qui est capable de simuler une machine avec une perte quadratique en temps. Nous ne donnerons que l’idée de la preuve car nous verrons ensuite une machine plus efficace : on simulera enO(tlogt)étapes une machine fonctionnant en tempst.

1-Q Proposition (machine universelle simple mais non optimale)

Il existe une machineU à 5 rubans, sur l’alphabet d’entréeΣU ={0, 1}et l’alphabet de travailΓU={0, 1,B}, telle que pour toute machineM sur les alphabetsΣM etΓM :

20 Chapitre 1. Le modèle de calcul

– il existe un morphismeφM:ΣM ΣU tel que pour tout mot xΣM, le calcul de la machineU sur le couple(〈M〉,φM(x)), notéU(〈M〉,φM(x)), simuleM(x); – il existe une constanteαM telle que pour toutxΣM, siM(x)s’arrête en tempst

et utilise un espaces, alorsU(〈M〉,φM(x))s’arrête en tempsαM(1+s t)et utilise un espaceαM(1+s).

Idée de la démonstration Le lemme1-Opermet de travailler non surM directement, mais sur la machine équivalente M ayant pour alphabetΓU ={0, 1,B} (via un mor-phismeφM) : il suffit de calculer dans un premier temps le code de la nouvelle machine.

En outre, par commodité, on peut d’abord construire une machine universelleUsur un alphabet plus grand (utilisant, par exemple, des délimiteurs ou des marqueurs), puis se ramener à l’alphabetΓU par le lemme1-O.

(ruban de sortie) sortie deM

(ruban de travail 3) état des têtes et contenu des cases lues

(ruban de travail 2) contenu des rubans deM

(ruban de travail 1)

〈M

(ruban d’entrée)

〈M〉,φM(x)

Figure 1.5 – Machine universelle à 5 rubans simulantM(x).

Voici le principe de notre machine universelleU(cf. figure1.5) :

– le ruban d’entrée sert à lire le motxencodé sur l’alphabetΓUsous la formeφM(x): il se comportera comme le ruban d’entrée deM;

– sur le premier ruban de travail, on a calculé le code de la machineMéquivalente àMmais travaillant sur l’alphabetΓU;

– sur le deuxième ruban de travail, on encode les(k2)rubans de travail deM en utilisant des blocs consécutifs de(k2)cases (cf. figure1.6) et on conserve la position de chaque tête par un marqueur spécial (sur la figure, en travaillant donc sur l’alphabetΓUU× {⋆})) : tout se passe comme si l’on disposait de tous les rubans de travail deM« en parallèle » sur un unique ruban deU; – à chaque instant,Uconserve sur son troisième ruban de travail l’état des têtes

deM;

– le ruban de sortie se comporte comme celui deM;

– pour simuler une étape de calcul deM, la machineUparcourt son deuxième

1.2. La machine de Turing 21

0 0 1 0 1 1 1

0 0 0 0 0

1 1

1 1 0 1 0 0 1

1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 1 1 0

⋆ ⋆

tête 3 tête 1 tête 2

ruban 2

ruban 1 ruban 3

Figure 1.6 – Encoder 3 rubans sur un seul.

ruban de travail à la recherche des têtes deM, recopie sur le troisième ruban de travail le contenu des cases pointées par les têtes deM:Udispose maintenant de l’état deMet du contenu des cases sous les têtes, donc elle va lire dans le code de Mla transition à effectuer et effectue cette transition en changeant l’état inscrit sur le troisième ruban de travail, en modifiant le contenu des cases concernées et en déplaçant le symbole de repérage des têtes deMsi nécessaire.

Pour simuler chaque transition de M, la machine U fait deux allers-retours sur le ruban codant les rubans de travail deM, ce qui coûte un temps linéaire en le nombre maximal de cases utilisées. Puisque M utilise au plus 2slogM| cases, on obtient un temps totalO(s tlogM|)pour simuler les t étapes. À ce temps de simulation il convient d’ajouter le temps de calcul du code deM(une constante dépendant deM), d’où un coûtαM(s t+1).

De même pour l’espace, siM ak rubans, l’espace utilisé par notre machine est une constante (dépendant de|〈M〉|) sur le premier ruban de travail,O((k−2)slogM|)sur le deuxième et une constante (dépendant de|〈M〉|) sur le troisième : on obtient au

total un espaceαM(s+1). ⊓⊔

1-R Remarque Puisqu’une machine fonctionnant en tempst ne peut pas utiliser un espace supérieur àt, la machine universelle de la proposition précédente fonctionne en tempsαM(1+t2), c’est-à-direO(t2).

Nous allons maintenant décrire une machine universelle dont le principe est plus com-pliqué mais qui est capable de simuler une machine avec une perte en temps seulement logarithmique. Cette construction est due à Hennie et Stearns [HS66].

1-S Théorème (machine universelle avec perte de temps logarithmique)

Il existe une machineU à 6 rubans, sur l’alphabet d’entréeΣU ={0, 1}et l’alphabet de travailΓU={0, 1,B}, telle que pour toute machineM sur les alphabetsΣM etΓM :

22 Chapitre 1. Le modèle de calcul

Idée de la démonstration Nous ne pouvons plus nous permettre comme précédem-ment de parcourir tous les rubans à chaque étape pour trouver la position des têtes.

L’idée est d’effectuer les calculs autour de la position0et de ramener à cet emplacement l’information nécessaire contenue sur les rubans : dès qu’on doit lire une nouvelle case, on va chercher le contenu de la case et tout son voisinage pour le rapatrier autour de la case0. L’intérêt de ramener également le voisinage est de limiter le nombre de tels rapatriements (car ceux-ci prennent du temps) : si l’on a ramené un voisinage de taille m, alors on peut ensuite effectuer au moins m/2 transitions sans rapatrier d’autres blocs⁵.

En adaptant la taille du voisinage à chaque transition, on peut simuler une étape deM parlogt étapes deU en moyenne: il s’agit d’un coût amorti sur l’ensemble du calcul, certaines transitions requérant plus de temps pour rapatrier de grands blocs, tandis que d’autres ne nécessitent qu’un temps constant.

Démonstration

Description informelle Tous les rubans de travail deM seront regroupés sur un seul ruban de travail deU en les intercalant comme à la figure1.6, de sorte qu’on peut les traiter les uns après les autres. Le contenu de chaque ruban de travail deMse retrouve sur le ruban deU dans le même ordre, mais un symbole particulierpeut venir s’in-tercaler entre les cases (ce qui nous permettra de gérer le rapatriement de blocs). La simulation de toute étape deM s’effectue d’abord en déplaçant un groupe contigu de cases afin d’amener en position0la case du ruban deM qui doit être lue : pour cela, on recopie ces cases autour de la position0et on efface les cases originales grâce au symbole (on dira qu’on « rapatrie un bloc »). On est ensuite à même d’effectuer la transition puisqu’on dispose de la bonne case à lire. Pour éviter de perdre trop de temps dans les rapatriements, plus la case à ramener est loin, plus on rapatrie un bloc de grande taille autour d’elle : cela permet d’avoir autour de la position0 l’informa-tion nécessaire pour effectuer un grand nombre de transil’informa-tions sans aller chercher une nouvelle case lointaine.

Le ruban est virtuellement découpé en « zones » de plus en plus grandes qui permettent de savoir quels blocs rapatrier. Lorsqu’on rapatrie un bloc, la construction est telle qu’entre ce bloc et la position0il n’y a que des cases contenant le symbole, de sorte qu’on n’écrase aucun contenu lors du rapatriement. Les zones sont définies de sorte que les blocs de taille m sont à distance O(m) et donc leur déplacement prend un tempsO(m)en utilisant un ruban de travail auxiliaire : une fois leur rapatriement assuré, on montre qu’il est alors possible de simuler O(m) transitions sans avoir à

5. Attention, il s’agit seulement de l’intuition, ce ne sera pas exactement ce qui se passera dans la démons-tration car à chaque étape on rapatriera des blocs, petits la plupart du temps.

1.2. La machine de Turing 23 rapatrier un nouveau bloc si grand, ce qui permet d’obtenir en analyse amortie la complexité de l’énoncé.

Passons maintenant à la démonstration formelle, dans laquelle la gestion des blocs est assez technique.

Alphabet et rubans Le morphismeφM sera simplement celui du lemme1-Ocodant l’alphabetΓM surΓU ={0, 1,B}; la machine travaillant surΓU équivalente àM don-née par ce lemme sera notéeM. Par commodité, nous aurons besoin d’un symbole supplémentairepour représenter une case laissée volontairement vide : nous décri-rons donc une machine U travaillant sur l’alphabet{0, 1,□,B}. Il conviendra alors d’appliquer le lemme1-Opour se ramener à l’alphabetΓU.

Dans un premier temps, notre machineUcalcule le code deMà partir de celui deM et l’écrit sur son premier ruban de travail. Comme à la proposition1-Q, le ruban d’en-trée deUcontenant(〈M〉,φM(x))servira à lire le motφM(x)et se comportera comme le ruban d’entrée deM; le premier ruban de travail deUcontiendra le code deM; le deuxième ruban de travail contiendra le contenu de tous les rubans de travail deM; le troisième ruban de travail contiendra l’état des têtes deM (ainsi que d’éventuels compteurs pour délimiter les zones mentionnées après) ; le quatrième ruban de travail servira de zone de stockage temporaire pour copier les blocs à rapatrier ; enfin, le ruban de sortie se comportera comme celui deM. En résumé, le rôle des rubans est comme à la figure1.5sauf un ruban de travail supplémentaire pour recopier temporairement les blocs à rapatrier.

Simulation d’une transition Une transition de M sera simulée comme suit : aller chercher sur le deuxième ruban de travail les cases de M à lire et les ramener à la

Simulation d’une transition Une transition de M sera simulée comme suit : aller chercher sur le deuxième ruban de travail les cases de M à lire et les ramener à la

Dans le document COMPLEXITÉ ALGORITHMIQUE (Page 34-47)