Vous êtes sur la page 1sur 5

IPEI EL MANAR Module II : Environnement de développement Python 3 Année universitaire : 2018/2019

Correction partielle Série des exercices : Les structures composées

Exercice 13 :

Tout entier naturel non premier se décompose en un produit de facteurs premiers, cette décomposition est unique.
Par exemple :
Décomposer 150 et 45 en produits de facteurs premiers :
150 2 45 3
75 3 15 3
25 5 5 5
5 5 1
1
150=2*3*52 45=3 2 *5
Méthode :

 On divise le nombre donné par le premier de ses diviseurs. On recommence avec le quotient obtenu jusqu'à
ce que le quotient soit égal à 1.
 Pour être sûr de ne rien oublier, il faut essayer les divisions par les nombres premiers dans l'ordre croissant.
Écrire un programme python qui lit un entier n>1 et renvoie une liste de tuples représentant les facteurs premiers de
n comptés avec leur multiplicité. Les facteurs premiers apparaitront en ordre croissant.
 La décomposition de 12est 12 = 2*2*3le programme renvoie [(2,2), (3,1)]
 La décomposition de 1500est1500 = 2*2*3*5*5*5le programme renvoie [(2, 2), (3, 1), (5, 3)].

Correction :

N= int(input('donner un nombre '))


L=[]
P=2
while (N != 1):
if N % P == 0 :
L.append(P)
N//=P
else:
P+=1
while (True): #cette boucle permet de trouver le second nombre premier de P
premier= True
for i in range (2, (P//2)+1):
if P%i ==0 :
premier=False #s'il a un diviseur je quitte la boucle je passe au suivant
break
if premier==False:
P+=1

else:# c'est un nombre premier retour au boucle principale


break

print(L)
L=[(X, L.count(X)) for X in set(L)] # je cherche X dans un ensemble (unicité)
print(L)

Exercice 14:« ISBN »

Classe : 1ère Année MP, PC, PT Page 1


IPEI EL MANAR Module II : Environnement de développement Python 3 Année universitaire : 2018/2019

Les livres publiés sont marqués d’un code appelé code ISBN (pour International Standard Book Number) qui existe
en deux versions. On étudie ici le fonctionnement de la clé de codage de la première norme : ISBN10.
Le code est constitué d’un identifiant de 9 chiffres suivis d’une clé qui peut être un chiffre ou la lettre X (qui
représente la valeur 10 conformément à la numérotation romaine).

On note ainsi un tel code :

La clé est toujours calculée telle que :∑ [ ]

C’est à dire :

Exemples :

Le code 2-7117-4809-X, on a a10 = 2, a9 = 7, . . ., a 2 = 9 et K = 10 et

Le code 3-5405-8662-8, on aa10 = 3, a9 = 5, . . .,a 2 = 2 et K = 8.


Écrire un programme en python permettant de :

 Saisir une chaine de 9 caractères qui représentent tous les chiffres.


 créer une liste L de 9 nombres qui représentent chacun des chiffres de la chaine.
 saisir K qui représente un chiffre [0..9] ou le caractère ’X’ qui représente le nombre 10.
 Calculer la somme .
 vérifier si le code ISBN est valide ou non et si le code ISBN est valide l’affichage sera comme
suita10 -a9 a8 a7 a6 -a5 a4 a3 a2 -k
Pour tester faire :

>>> donner la chaine de taille [9] : 960600910


>>> donner la clé K[0-X]:X
ISBN valide : 9-6060-0910-X

Correction :
ch=(input("donner le code ISBN et 9 caracteres "))
while (not ch.isdigit()) or len(ch)!=9:
ch=(input("donner le code ISBN et 9 caracteres "))

K= input("donner k € [1..9] ou X ")


while ( ( ( K.isdigit()) or (K!='X')) and (len(K)!=1 )) :
K= input("donner k € [1..9] ou X ")
l=[]
ch=ch+ K
l=list(ch)
print(l)
s=0
print(len(l))
for i in range(10,0,-1):
print("# ",l[10-i]," * ",i," s= ",s)
if (l[10-i].lower()=='x'):
s+=(10*i)
else:
s+=int(l[10-i])*i

print(s)

Classe : 1ère Année MP, PC, PT Page 2


IPEI EL MANAR Module II : Environnement de développement Python 3 Année universitaire : 2018/2019

print(l[-1])
if (s%11 in range(0,11)):
ch= "".join(str(l[0]))+"-" + "".join(str(x) for x in l[1:5])+"-" +
"".join(str(x) for x in l[5:9])
if l[-1]==10: ch=ch+'-X'
else :ch=ch+"-"+str(l[-1])
print(" ",ch," est valide = ", s, " %11 == ",s%11 ," €[0..10]")

Exercice 15: « Le codage de Vigenère»


La manière la plus simple pour crypter un texte de substituer chaque occurrence d'une lettre par une autre. Par
exemple :
- chaque a est remplacé par t,
- chaque b est remplacé par y,
- chaque c est remplacé par e,
...
Le code de ce type le plus connu est le « code de César » où chaque lettre est remplacée par celle qui vient 3 lettres
plus loin dans l'alphabet. De manière similaire, on peut faire un décalage arbitraire (entre 1 et 25) pour crypter un
texte. Tous les autres caractères (espaces, ponctuation, chiffres, caractères accentués, . . .) ne seront pas modifiés.
Exemple :
Message : CHIFFRE DE CESAR
Message crypté : FKLII UHGHF HVDU

Le « code de Vigenère » agit comme un code de César, mais tous les caractères ne sont pas décalés de la même
valeur. Les décalages utilisés dépendent d'une clé, en générale donnée par un mot ou une phrase.
Par exemple, si la clé est "BONJOUR", les lettres du message seront décalés de :
· 2 lettres ('B' est la deuxième lettre de l'alphabet)
· 15 lettre ('O' est la quinzième lettre de l'alphabet)
· 14 lettres ('N' est la quatorzième lettre de l'alphabet)
· 10 lettres ('J' est la dixième lettre de l'alphabet)
· 15 lettres ('O' est la quinzième lettre de l'alphabet)
· 21 lettres ('U' est la vingt et unième lettre de l'alphabet)
· 18 lettres ('R' est la dix-huitième lettre de l'alphabet).

Pour coder le message "vive les topinambours", on répète la clé autant de fois que nécessaire et procède donc
comme suit :
CODE DE VIGENERE
+ BONJ OU RBONJOUR
-------------------------
EDRO SZ NKVSXTMW
Pour simplifier, nous allons supposer que la clé ne contient que des lettres en majuscule.
Travail demandé : Ecrire un programme python qui saisit une clé et une chaîne de caractères et affiche la
chaîne codée en utilisant le code de Vigenère.

Correction :
msg=input("donner un message")
Classe : 1ère Année MP, PC, PT Page 3
IPEI EL MANAR Module II : Environnement de développement Python 3 Année universitaire : 2018/2019

cle=input("donner la clé")
alpha='ABCDEFGHIJKLM NOPQRSTUVWXYZ'
res=''
i=0
for caractere in msg:
if ord(caractere) in range(ord('A'), ord('Z')+1):
debut=alpha.find(cle[i])
pos=alpha.find(caractere)
indice=pos+debut+1
if indice>25:
indice-=26
res+=alpha[indice]
i+=1
if i>=len(cle):
i=0
else :
res+=caractere
print(res)
Exercice 16:
L’objectif de ce problème est la manipulation de polynômes creux à une variable (plusieurs coefficients nuls).
Un polynôme est représenté par un dictionnaire dont la clé est le degré d et la valeur est le coefficient a.
Exemple :
Le polynôme P = -x4-8x2-5x est représenté par le dictionnaire {2 :8,1 :-5,4 :-1}

Ecrire un programme python qui permet de:


- Ajouter un monôme saisi au clavier (en faisant les contrôles nécessaires).
- Retourner le degré de polynôme.
- Saisir un réel v et affiche P(v)
- Créer deux dictionnaireD1 représentant un polynôme P1, et D2 représentant un polynôme P2, et d’afficher
le dictionnaire représentant le polynôme P avec P = P1 + P2.
Remarque : aucun monôme nul ne doit apparaitre dans le polynôme résultat.
- Créer deux dictionnaireD1 représentant un polynôme P1, et D2 représentant un polynôme P2, et d’afficher
le dictionnaire représentant le polynôme P avec P = P1 * P2.
- Créer et afficher la chaine représentant l’expression du polynôme ordonné par ordre décroissant.
Correction :
d={2:-8,1:-5,4:-1}
#question 1
##while (True):
## coef=int(input('donner le coefficient'))
## degre=int(input('donner le degre'))
## if coef!= 0 and degre >=0:
## d[degre]=coef
## break
#question 2
print('le degre est ', max(d.keys()))
#question 3
V=float(input('donner une reel'))
PV=0
for X in d.items():
PV+=X[1]*(V**X[0])
print(X[1])
print(PV)
#question 4
Classe : 1ère Année MP, PC, PT Page 4
IPEI EL MANAR Module II : Environnement de développement Python 3 Année universitaire : 2018/2019

d1={2:3,1:-5,0:3}
d2={3:4,2:-5,1:5,0:7}
d_som={}
d_som.update(d2)
d_som.update(d1)
#print(d_som)
for X in d_som:
d_som[X]=0
if X in d1:
d_som[X]+=d1[X]
if X in d2:
d_som[X]+=d2[X]
# verion 2 effacement des zero
while (0 in d_som.values()):
for X in d_som:
if d_som[X]==0 :key=X
del d_som[key]
#verion 2 compacte
d_som={key:val for key, val in d_som.items() if val != 0}
print(d_som)
#question 5
d1={2:3,0:-1}
d2={1:4,0:1}
d_prod={}
for X in d1:
for Y in d2 :
if X+Y in d_prod: d_prod[X+Y]+=d1[X]*d2[Y]
else: d_prod[X+Y]=d1[X]*d2[Y]
#question 6

print(d_prod)
ch=""
for i in sorted(d_prod.keys(),reverse=True):
if i==1 :
if d_prod[i]==1 :ch+="X"
elif d_prod[i]==-1 :ch+="-X"
elif d_prod[i]<0: ch+=str(d_prod[i])+"X"
else : ch+="+"+str(d_prod[i])+"X"
if i==0 :
if d_prod[i]<0: ch+=str(d_prod[i])
else : ch+="+"+str(d_prod[i])
elif i >1:
if d_prod[i]==1 :ch+="+X^"+str(i)
elif d_prod[i]==-1 :ch+="-X^"+str(i)
elif d_prod[i]<0: ch+=str(d_prod[i])+"X^"+str(i)
else : ch+="+"+str(d_prod[i])+"X^"+str(i)
if ch[0]=='+': ch=ch[1:]
print(ch)

Classe : 1ère Année MP, PC, PT Page 5

Vous aimerez peut-être aussi