1 Rendre la monnaie 2 Calcul de la puissance ni`eme

publicité
1ère Année ENSEIRB
Algorithmique et structure de données –
TD 1 : Algorithmes simples
1
Rendre la monnaie
On se propose d’écrire un algorithme permettant d’obtenir la suite des billets totalisant une
somme donnée (dont on suppose qu’elle est un multiple de 10). Les espèces disponibles sont
des billets de 50, 20 et 10 euros. Le principe est de donner le billet de valeur la plus grande
possible inférieure ou égale à la somme à rendre et de poursuivre la même stratégie avec la
somme restante jusqu’à ce que la somme restante soit nulle.
1. Écrire cet algorithme en utilisant les structures de contrôle suivantes : while , if et
else if . L’algorithme utilisera une variable nommée s qui contiendra la somme
restant à rendre au fur et à mesure de la remise de billets au client. On n’utilisera
comme opérations arithmétiques que des additions ou des soustractions. Le résultat
sera l’affichage de la suite des nombres de billets à rendre.
Par exemple si la somme est 180, l’affichage devra être :
3 billets de 50 euros
1 billet de 20 euros
1 billet de 10 euros
2. Déterminer le nombre de soustractions effectuées par l’ algorithme, on donnera une
formule faisant intervenir des divisions entières par les nombres 50, 20 et 10.
3. Généraliser votre algorithme au cas où les valeurs de billets ou pièces disponibles sont
en nombre quelconque et figurent dans un tableau à valeurs décroissantes val[0] >
val[1] > ... > val[k-1]. Ainsi dans l’exemple considéré plus haut on aurait : k
= 3 et val[0] = 50, val[1] = 20, val[2] = 10.
4. Montrer qu’ il existe des valeurs de billets et une somme à rendre pour lesquels cet
algorithme ne donne pas le nombre minimum de billets ou de pièces à rendre.
2
Calcul de la puissance nième
1. Écrire un algorithme permettant de calculer rapidement la puissance nième d’un nombre entier a en s’inspirant de l’algorithme vu en cours pour la représentation d’un
nombre en base 2.
On se servira de l’écriture en base 2 de n :
1
n=
p
X
xk 2k
k=1
k
où les xk ont pour valeur 0 ou 1. Et on utilisera les puissances a2 de a et les valeurs
de xk pour effectuer le calcul.
2. Donner l’ordre de grandeur du nombre de multiplications à effectuer en fonction de n.
3
Anagrammes
On vous propose maintenant d’écrire un algorithme permettant de vérifier si deux mots
(représentés sous la forme de tableaux de caractères) sont l’anagramme l’un de l’autre.
C’est à dire contiennent exactement les mêmes caractères mais dans un ordre différent.
Par exemple Marion est anagramme de Romain, arbre est anagramme de barre. Pour simplifier, on supposera que les caractères sont des nombres de 0 à 25 et on notera f et g les
tableaux représentants les deux mots.
Annexe
L’exercice 2 est motivé par l’algorithme d’échange de clés Diffie-Hellman, du nom de ses
auteurs Whitfield Diffie et Martin Hellman. Il s’agit d’une méthode par laquelle deux personnes nommées conventionnellement Alice et Bob peuvent se mettre d’accord sur un nombre (qu’elles peuvent utiliser comme clé pour chiffrer la conversation suivante) sans qu’une
troisième personne appelée Eve puisse découvrir le nombre en écoutant leur conversation.
Cet algorithme est décrit ci dessous.
• Alice et Bob ont choisi un nombre g connu de tous,
• Alice choisit un nombre au hasard a qu’elle tient soigneusement caché, élève g à la
puissance a, et donne à Bob la valeur de g a ,
• Bob fait de même avec le nombre b, donnant à Alice la valeur de g b ,
• Alice, en élevant le nombre reçu de Bob à la puissance a, obtient g ba .
• Bob fait le calcul analogue et obtient aussi g ab . Eve ne peut pas découvrir facilement
a et b, donc ne peut pas calculer g ab .
En pratique les calculs se font modulo un nombre premier p et Bob envoie donc g b mod p.
Alice l’élève alors à la puissance a et obtient (g b mod p)a mod p = g ab mod p. La sécurité
de ce protocole réside dans la difficulté du problème du logarithme discret : pour que Eve
retrouve g ab à partir de g a et g b , elle doit élever l’un ou l’autre à la puissance b ou à la
puissance a respectivement. Mais déduire a (resp. b) grâce à g a (resp. g b ) est un problème
que l’on ne sait pas résoudre efficacement. Eve est donc dans l’impossibilité (calculatoire)
de déduire g ab .
Un algorithme pour calculer une clef secrète nécessite de pouvoir élever à la puissance de
façon rapide.
2
Téléchargement