Informatique tronc commun TP 8

publicité
Informatique tronc commun TP 8
5 janvier 2015
Note : après la séance, vous devez rédiger un compte-rendu de TP par groupe et le faire
parvenir à votre enseignant, au plus tard une semaine après la séance de TP.
Ce compte-rendu sera pour cette séance le fichier python contenant le code demandé (avant
chaque question, on reportera en commentaire le numéro de la question),
Le nom de votre fichier python sera impérativement de la forme tp07_dupond_dupont.py
pour le groupe dupond et dupont (à remplacer par vos noms, en minuscules (même la première
lettre) et sans caractère accentué ni espace.
Dans la mesure du possible, on justifiera le code demandé par des invariants.
1 Conversion dans des bases
On veut convertir une chaîne de caractères représentant un nombre, écrit en base 10 en un
entier python. Cela existe déjà en python et peut se faire par la fonction int. Ainsi après
l’exécution du code suivant, s a pour valeur la chaîne de quatre caractères ’1234’ et n a pour
valeur l’entier 1234.
s = '1234'
n = int(s)
NB : ces deux objets sont bien différents. Essayez par exemple de demander à Python ce que
valent s+s, n+n et s+n pour vous en convaincre.
On peut transformer un entier en chaîne de caractère avec la fonction str (essayez str(n)).
On veut récrire les fonctions int et str pour ensuite les adapter à d’autres bases.
Commençons donc par écrire ces fonctions dans le cas de la base 10.
Pour cela, on se donne un dictionnaire python qui associe, à chacun des caractères '0', . . . ,
'9', la valeur associée 0, . . . , 9 :
chiffres_decimaux = {
'0' : 0,
'1' : 1,
'2' : 2,
'3' : 3,
'4' : 4,
'5' : 5,
'6' : 6,
'7' : 7,
1
}
'8' : 8,
'9' : 9
Un dictionnaire est une table qui associe . . . des valeurs à un ensemble de clés. Dans la définition
ci-dessus on associe 0 à la clé ’0’, . . . , 9 à la clé ’9’. Si d est un dictionnaire et c une clé du
dictionnaire, alors d[c] désigne la valeur associée à la clé et l’instruction d[c] = w remplace
cette valeur par w. Autrement dit, les dictionnaires sont une généralisation des tableaux où les
indices ne sont pas nécessairement des entiers. Le tableau ci-dessus nous permet d’écrire une
fonction transformant un caractère l’entier qu’il désigne :
def valeur_chiffre_decimal(c):
"""Retourne l'entier représentant la valeur du chiffre c,
où c est un caractère."""
return chiffres_decimaux[c]
1. Écrire une fonction valeur_decimale(s) prenant en argument une chaîne de caractères
s et retournant sa valeur.
2. Écrire une fonction representation_decimale(n) prenant en argument un entier n et
retournant sa représentation en base 10 sous forme d’une chaîne de caractères.
3. Écrire une fonction valeur_hexadecimale(s) prenant en argument une chaîne de caractères s représentant un nombre en hexadécimal et retournant sa valeur en décimal.
4. Écrire une fonction representation_hexadecimale(n) prenant en argument un entier
n et retournant sa représentation en hexadécimal sous forme d’une chaîne de caractères.
5. Écrire une fonction valeur_binaire(s) prenant en argument une chaîne de caractères s
représentant un nombre en binaire et retournant sa valeur en décimal.
6. Écrire une fonction representation_binaire(n) prenant en argument un entier n et
retournant sa représentation en binaire sous forme d’une chaîne de caractères.
2 Un grand entier
Les nombres premiers de Mersenne sont des nombres premiers de la forme 2p − 1. On sait à
l’heure actuelle que 257885161 − 1 est un nombre premier de Mersenne.
1. Écrire une fonction nb_chiffres_bin_mersenne(p) retournant le nombre de chiffres dans
la représentation en base 2 de 2p − 1. On veut que cette fonction marche et retourne un
résultat en temps raisonnable (inférieur à 10 secondes) pour des valeurs de p allant jusqu’à
1013 .
2. Écrire une fonction nb_chiffres_mersenne(p) retournant le nombre de chiffres dans la
représentation en base 10 de 2p − 1. On veut que cette fonction marche et retourne un
résultat en temps raisonnable (inférieur à 10 secondes) pour des valeurs de p allant jusqu’à
1013 .
3. Dans cette question, on s’intéresse aux fonctions repr_bin_mersenne(p) et repr_dec_mersenne(p)
retournant sous forme de chaîne de caractères la représentation repectivement en bases
2 et 10 de 2p − 1. Écrire l’une de ces fonctions de façon à ce qu’elle retourne un résultat
en temps raisonnable (inférieur à 10 secondes) pour des valeurs de p allant jusqu’à 108 .
Attention : mieux vaut bien choisir la fonction que vous implanterez : l’une s’écrit sans
difficulté, l’autre est théoriquement possible mais demande plusieurs heures de travail.
2
Téléchargement