2
TD – Problème 1
Contexte
Lors d’une discussion à la cantine de votre entreprise, vous avez évoqué avec votre équipe de travail
le paradoxe des anniversaires1 , puis le paradoxe du paradoxe des anniversaires2 . Malheureusement
pour vous, le Directeur du département Recherche et Développement vous a entendu, et comme il
a toujours de bonnes idées, il a décidé, malgré vos protestations, que votre équipe serait désormais
responsable du calcul probabiliste, suscitant aussitôt l’admiration de vos collègues.
Vous devez écrire une procédure Proba qui reçoit deux arguments : n (la ligne contient 2n+1 cases)
et t temps de mesure, et affiche la probabilité de présence de la particule dans chaque case à l’instant t.
Un cabinet d’audit externe, grassement rémunéré, vous propose la ligne de conduite suivante :
1. Calculer à la main p(i, t) pour t = 1, 2, 3, 4 et une valeur de n suffisamment grande.
2. Trouver la formule de récurrence permettant de calculer p(i, t + 1) en fonction des p(_, t). Le
cabinet vous fournit les conditions initiales : p(i, 0) = 0 pour i 6= n + 1 et p(n + 1, 0) = 1.
3. Écrire le programme demandé
Suite de l’histoire
Lors de la démonstration de votre programme avec n = 5 000 et t = 20 000, votre chef a trouvé que le
temps de réponse était un peu long et il s’inquiète de savoir si votre algorithme tiendra la route pour
les applications ayant besoin de valeurs de t au delà du million.
Il vous demande donc d’évaluer deux grandeurs de votre programme en fonction de n et t, supposés
assez grands (les approximations raisonnables sont les bienvenues) :
1. la taille mémoire nécessaire
2. le temps de calcul
Quelques pistes sommaires :
4
TD – Problème 2
Dès midi, les organisateurs des J.O. ont lancé un appel d’offre pour réécrire intégralement le logiciel de
chronométrage des épreuves de natation. Le délai est de 18 heures, car il faut être prêt pour l’épreuve
du 400 mètres nage libre ayant lieu demain.
En vacances avec quelques collègues de l’INSA, vous décidez de répondre à cet appel d’offre pour
occuper constructivement votre après-midi et encaisser au passage les 15 000 £.
Objectifs Écrire un programme qui demande le nom des nageurs, chronomètre chaque nageur, dé-
tecte les faux départs, compte les aller-retours jusqu’à 400 mètres, et affiche les noms des nageurs
dans l’ordre d’arrivée, avec leur numéro d’arrivée.
Une piscine olympique fait 50 mètres de long. Elle peut avoir un nombre quelconque de couloirs
utilisés (en général 8). Pour spécifier le nombre de couloirs, il suffira de modifier une seule ligne de
votre programme.
Capteurs Les capteurs envoient des signaux qui sont immédiatement enregistrés puis peuvent être
récupérés par la fonction Attend_Signal (voir dans l’acteur Capteurs ci-dessous).
◦ Lorsque le nageur de la ligne numéro i quitte son plot de départ, le capteur situé dans le plot envoie
un signal de type Un_Evenement, dans lequel Emetteur = Capteur_Depart, Num = i, et Date = la date
de l’évènement en secondes.
◦ De même, lorsque le nageur de la ligne numéro i touche l’un des bords du bassin, les capteurs
optiques envoient un signal. Les plots de départ sont sur le côté Nord. Le capteur étant très sensible,
plusieurs signaux peuvent être envoyés d’affilée pour un seul toucher du nageur.
◦ Le signal de départ est signalé par le capteur Capteur_Feu.
Conseils techniques
◦ Commencez par faire un algorigramme sur papier !
◦ Un type record ne peut contenir que des chaînes (String) de taille fixée, ce qui s’écrit String (1..12)
pour une chaîne de 12 caractères.
Vous pourrez utiliser la fonction Normalise (X, N) de GAda.Text_IO, qui prend une chaîne X et renvoie
une chaîne de taille N en la tronquant ou en la complétant avec des espaces.
5
◦ Pour arrêter le programme au milieu d’un bloc, vous pouvez utiliser l’instruction raise Program_Error ;
Mission complémentaire
Pour chaque nageur, repérer son meilleur temps de parcours de 50m (sur une longueur de piscine).
À la fin de l’épreuve, lorsque tous sont arrivés, afficher un classement des nageurs les plus rapides sur
50m.
capteurs.ads
package Capteurs is
Énumération des différentes sortes de capteurs
| Capteur_Depart : capteur situé sur le plot de départ
| Capteur_Nord : capteur situé à l’extrémité Nord du bassin
| Capteur_Sud : capteur situé à l’extrémité Sud du bassin
| Capteur_Feu : signal émis au moment du départ
type Un_Capteur is (Capteur_Depart, Capteur_Nord, Capteur_Sud, Capteur_Feu) ;
Un évènement est un signal émis par un capteur
Numero est le numéro de couloir du capteur (pour les capteurs Depart, Nord, Sud)
Date est la date de l’évènement, en secondes depuis minuit.
type Un_Evenement is record
Emetteur : Un_Capteur ;
Num : Integer ;
Date : Float ;
end record ;
Attend jusqu’à ce qu’un évènement se déclenche
et renvoie l’évènement qui s’est produit.
Les évènements arrivent forcément dans l’ordre chronologique.
function Attend_Signal return Un_Evenement ;
end Capteurs ;
6
TD – Problème 3
Contexte : Bioinformatique
Voici un extrait d’un génome humain (chromosome 18, position 53 464 656) :
. . .A T G A G T A C A G A A A G A G A C T C A G A A A C G A C A T T T G A C G A G G A T T C T C A G C C T A A T G A C G A A G T G G T T C C C T A C A G T G A T G A T G A A A C A
GAAGATGAACTTGATGACCAGGGGTCTGCTGTTGAACCAGAACAAAACCGAGTCAACAGGGAAGCAGAGGAGAACCGGGAGCCATTC
AGAAAAGGTAACCACATGAAGTCCCGGTGACTAGGTCGCTTATAAATCCTCATGTGGGTCATGGCCACACGTGCCAAAGATGATCGGT
CTATTTTGCGTGGTCTAGGAGAGAATCTTCTCTGATCTCTTCTTAGGATGCGACTGACAGAATGGTGGATGGGCTTGGACAAGTACCC
ATTGTCCTTAGTAAGAAGGGCTGGGAGAGCATATCTGACAAGTTCTGCAGAGAAAATACATTAAGGTCTTTGTTAGTGTGTGTATATAT
A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A ...
Pour information, le gène ci-dessus (dont vous ne voyez qu’un court extrait) est l’ “ATPase, Class I, type
8B, member 1”. Il code une enzyme lié au cycle de l’ATP.
À chaque triplet de bases (p. ex. “ATT”) est associé un acide aminé (ici “Ile”, c.-à-d. Isoleucine).
Ala GCT, GCC, GCA, GCG Lys AAA, AAG
Arg CGT, CGC, CGA, CGG, AGA, AGG Met ATG
Asn AAT, AAC Phe TTT, TTC
Asp GAT, GAC Pro CCT, CCC, CCA, CCG
Cys TGT, TGC Sec TGA
Gln CAA, CAG Ser TCT, TCC, TCA, TCG, AGT, AGC
Glu GAA, GAG Thr ACT, ACC, ACA, ACG
Gly GGT, GGC, GGA, GGG Trp TGG
His CAT, CAC Tyr TAT, TAC
Ile ATT, ATC, ATA Val GTT, GTC, GTA, GTG
Leu TTA, TTG, CTT, CTC, CTA, CTG
Note : ce tableau n’est pas totalement universel : il existe des petites variantes de codage dans les mitochondries
et chez certaines espèces de bactéries, algues, etc. .
Mission
En utilisant l’acteur Genome (ci-après), écrire un programme qui remplit le cahier des charges suivant :
◦ Votre programme lit deux fichiers "chromosome" et "proteine". Le premier contient la séquence ADN
d’un chromosome, le second contient une séquence d’acides aminés.
◦ Votre programme cherche dans le chromosome une séquence qui code la protéine indiquée.
◦ S’il la trouve, il affiche sa position, sinon un message indique qu’il ne l’a pas trouvée.
◦ Quand vous avez terminé, évaluez le temps d’exécution de votre programme en considérant le pire
cas et le cas moyen (à vous de faire les estimations raisonnables). La taille du chromosome 18 est de
77 millions de paire de bases. La protéine que l’on cherche est l’ “Amiloride-sensitive cation channel
1, neuronal” ; elle contient 512 acides aminés (cette protéine est un canal à ions sodium présent
dans les neurones qui permet de créer un courant électrique).
Marche à suivre
La difficulté principale est de déterminer comment décomposer ce problème en tâches simples. Une
fois la décomposition faite, les algorithmes à écrire sont petits.
+ Première étape : écrire une fonction qui prend en argument trois bases et qui renvoie un acide
aminé. (Écrivez seulement le code pour deux acides aminés, la suite sera semblable).
+ Pour vous aider à démarrer, cherchez à la main la séquence Glu–Thr dans l’extrait de génome
ci-dessus.
7
genome.ads
package Genome is
Une base ADN et une séquence ADN
type Une_Base is (A, C, G, T) ;
type Une_Sequence_ADN is array ( Integer range <>) of Une_Base ;
Un acide aminé et une séquence d’AA
type Un_AA is (Ala , Lys, Arg, Met, Asn, Phe, Asp, Pro, Cys, Sec,
Gln, Ser, Glu, Thr , Gly , Trp , His , Tyr , Ile , Val , Leu) ;
type Une_Sequence_AA is array ( Integer range <>) of Un_AA ;
Lit un fichier d’ADN et renvoie son contenu (le tableau commence à 1)
function Lire_ADN (Nom_Fichier : String ) return Une_Sequence_ADN ;
Lit un fichier d’acide aminés et renvoie son contenu (le tableau commence à 1)
function Lire_AA (Nom_Fichier : String ) return Une_Sequence_AA ;
end Genome ;
Remarque technique
Dans un sous-programme, il est possible d’ajouter use Genome ; avant le begin pour ne pas avoir à
ajouter le nom de l’acteur devant les valeurs énumérées. Il est alors possible d’écrire A au lieu de
Genome.A (de type Une_Base).
8
9
GATCTCTGATCAAAGCTAAAGGTAATCATGAAGGCTACAATTCTGTGCATCGCTTTCCTTATTGCTGTTGTCGCCTCCGAGAGGTGTAC
ATTCTTCCACCACGAGTGTTCCGGTACCACCTGCTCTGATGGAGCCCCTCACTGTGTGTTGGGAACCTGCAGATGCACGCAAAACACC
GGAAAAGCTTGTACCACCGCCTCTGATTGCACAGAGCACTGCGCCCTCTTCGGAGATCAGCACTGTGTTGACGGTTTCTGTCATTGCC
CATTTGACAGCGTCCTTCCTGGCGTAGGAAAATAAATATCTTAATAAACAATGACACAACGTTGTCATAATATGGGAAACTCGGTGCCA
TGTATCATTGTGGAACCGTTTCAGATAGACGAGAAGACCCCTGTTCCCTCATCTTCGATGCCATTTTTTATGGGAACAAGAACGAGGTT
CAGCAGTTGATTTCTGGCGGAGTGGACAAGAATGTCGTCACGCATCGTCATGTGCGCTGGGATAGCGCGAGTGCGCTTGGCGCTGCC
GCCTACGAAGGTCACATGGACATAGTGCGTTATCTGATTGACATCGGGACATCAGTGAATTTCTCCGACCCCTGTCAAAGACGGACGC
CTCTACACTGGGCCTGCCTTGGCAACCAGTATCAGGCGGCCGCTTACCTCATCAAACACGGTGCTGACGTCAACCACAGGGATTTGG
AGCAGACGACACCCATACTTCGCGCTGCCTTAGGAAGAAATATAGACTTAGTGAAATGTTTGATTGAAAACGGTGCTGATGTTCGACAT
ATTGATATTCTTGGTTGCTCTGTTCTCCATTACGCTTGTGTTCATGGCGACAAGAAACTGATAAATACTGTCATCCGAGCAGGGTGTAT
TTCTAACAATGTCGCTGTGATAGGGAAAGCCACGCCTTTACAAACGCTATCCAAAAAGAACGACCGCGAAAACGTGTCACAGCTACTG
GCAGCCGGGTACAACCTAGAAAACGACCAGAACTGGGTCAACTCTTTATCTCCTCCAATCACGTGCTCTAACCCTACGCTGGAATATG
TGGTTCGATTTGCCAAAACTCGACCCTTAAGCTTGAAAGGACTCTGCAGGAAAACGATAAGGAACGAAATGAGAGGAGTGAAAGTGGA
ACAGATGTTAAACAACTTTCCTTGTCCAGCATTAATTCGGCAGTATCTAATACTGGATCATCTGTGATATTGTTCAGACACAACGTTGTC
ATAATATGGGAAACTCGGTGCCATGTATCATTGTGGAACCGTTTCAGATAGACGAGAAGACCCCTGTTCCCTCATCTTCGATGCCATTT
TTTATGGGAACAAGAACGAGGTTCAGCAGTTGATTTCTGGCGGAGTGGACAAGAATGTCGTCACGCATCGTCATGTGCGCTGGGATAG
CGCGAGTGCGCTTGGCGCTGCCGCCTACGAAGGTCACATGGACATAGTGCGTTATCTGATTGACATCGGGACATCAGTGAATTTCTCC
GACCCCTGTCAAAGACGGACGCCTCTACACTGGGCCTGCCTTGGCAACCAGTATCAGGCGGCCGCTTACCTCATCAAACACGGTGCT
GACGTCAACCACAGGGATTTGGAGCAGACGACACCCATACTTCGCGCTGCCTTAGGAAGAAATATAGACTTAGTGAAATGTTTGATTG
AAAACGGTGCTGATGTTCGACATATTGATATTCTTGGTTGCTCTGTTCTCCATTACGCTTGTGTTCATGGCGACAAGAAACTGATAAAT
ACTGTCATCCGAGCAGGGTGTATTTCTAACAATGTCGCTGTGATAGGGAAAGCCACGCCTTTACAAACGCTATCCAAAAAGAACGACC
GCGAAAACGTGTCACAGCTACTGGCAGCCGGGTACAACCTAGAAAACGACCAGAACTGGGTCAACTCTTTATCTCCTCCAATCACGTG
CTCTAACCCTACGCTGGAATATGTGGTTCGATTTGCCAAAACTCGACCCTTAAGCTTGAAAGGACTCTGCAGGAAAACGATAAGGAAC
GAAATGAGAGGAGTGAAAGTGGAACAGATGTTAAACAACTTTCCTTGTCCAGCATTAATTCGGCAGTATCTAATACTGGATCATCTGTG
ATATTGTTCAGAGTGACAGGAAAAGGAGCAATATAAAAGATGAAGCATGCTGGATTATTTGCCGTTTCCATCTCTGTATTGGTGATGTT
CACCCTTGTCCACGAAGGACTTTCAGCCACTACCACAACAACAACACCAAGTGGAGGTGGTGGAGGTGGTGGAGGTGGTGGGATACG
GAAAAATGAAAAAGAATGACGGATAAACGTACGCGTAGCATTACCTACCTGGGACTTCTATTTATTTTCTTAACGAAGCTTCCTGTGTT
GGCGTCTTCTACAGCATGTATCACTTCAAGAGAAACCGCAGAAATAGTGACAGAATGTCCCCAAACACAATTGGCATGGGAAGAAGCA
GCGGTAAAGAAAAATTGTGAAAGGACGCAAAACCCCTGTTCTTCTTTTGTTTATCACTGTGTAATGAATACATGGAAAAATCAGACTAT
TGAAGTGTGTGCCCCGAAACAGATGATTCTCGGAAAAAACTGTGCAGAATATAATTTTCTTGGAGCCAAAGTCCAACGCAATTCTAAAG
TGAAATGCAGCAAATGTCCTATTGTGTATAATTCAACTGACGCTTTTAAATATCAAGAATGCTACAGAAGTGTTATCCCTACAGCTAATC
CTGATAACACAACTTATCAATTACGTATTTCATTTGTTGAGACAACAAGCAGAACGACAAATTCATCTACACCTCATGATAAACCCGAAT
ATTTAGTTCAAAATCAAGTTTTGGACGACAAGAAAAACAAATCTTATAAACATATATATTTTGGAGGATTTTGTGTGGTATGATGGTCAC
CCTATTAATGGCCGCCTCCATGATATTGTAAACATTTAAAAAATGCCAGCAGAAAATATGACTGATAAAAAAGACAAGAAGAAAGAAGA
GGTGCCCCCGCCCCCCACTAAAGGGGTCTACATCTTCCCGAATGGAGACAAATATGACGGAGAATACCAGCATGGCAGTGACGGATC
ACTGGAGCGGAACGGTTATGGTGTCCATACCACGACGGAAGGGGCCGTGTATGAAGGCGAGTGGAAGGGGGACAAAATGAACGGCA
GGGGAAAATTAGCCCACCCCTCAGGCGCCCTGTACGAGGGAGAGTTTGTCAATAATCAGTTCCACGGCCAGGGAAAATACACATGGA
AGAACAACTCTTTTTACGAAGGACAGTTCAAAGAAAATAAGATGGAGGGTACGGGCCAGTTCACCGACACGGAGGGACAGATGTGGAC
GGGGACATTCCGATACAAGGCGGCGCCAGGACTGAGATTTGAACTCAAGATGAATTAATGCTAAGCTGCTTACGTTCTGTATGAAAAG
TTTCATCAATCGGACCCATCCACGTCATCTGCACATCGCTCTGGTGGTGTGATTCATTGTGTTAGCAAATGTTGAATGAATGTGTGTGT
AATTGTTAAACATAATAAAAATACACTGTACATTTTACTGAACAAAAAAAGAGAAAGAGCAAGTAAGTAGGCATTATAGGAGCACCTAGT
TAGGAAACAGAAGGAGGGGAGCATCATGACTTGGGCTAGGATCTCGCTGTTGGTTTTGTGTGTGGTGGTGGCTGTTAATGCATCCCCA
GTGTCTAACCAGTGCCCGGATGAGGACGACTTCATGTGTATGTCCGACGGTCAGTCTGCCTGCTTCCCGAACAACTGGAAATGTGACG
GTGAACCCGACTGTGACGGCAACGTCGATGAGCATGGCTGTCCCCCAGTTACCTGTGAAGCCGACGAGTTCTCATGCGACAATACCT
GTATCCCTGCAACATTCGTCTGTGATGGTGATTACGATTGCTATGACAACAAAGATGAGGCCATGTGTCCTGCTGTGTGGGTGAAGCC
AGATTCCAAAGAAAACACGCGAGAGCGCCGCCTAGTGCCTGGCATAATGTCTCCGCCCCTTCCTGTGTTCCTTCATCATCTGATATCT
CATTTCGTCATTAAGAACTTCCATTCACTCTGTGATATGTTTTGAGATTGTAATATTTTTTTGTTGTTTAGTAAAAAAGGGTGTTCTATTG
TAATGTTACATATAGACTGATTTATCTGCAGTCTATACAAATAAATAACAAAATGATGACAAA