Académique Documents
Professionnel Documents
Culture Documents
c) Un entier naturel n non nul est dit parfait lorsque la somme de ses diviseurs est égale à 2n.
Écrire une fonction parfait(n) qui renvoie le booléen True si n est parfait, et False dans
le cas contraire.
Par exemple, parfait(6) renvoie True ; parfait(28) renvoie True ; parfait(24) renvoie
False.
d) Soit b un entier naturel non nul.
Écrire une fonction liste_parfait(b) qui renvoie la liste des entiers naturels parfaits de
l’intervalle J1, bK.
Par exemple, liste_parfait(1000) renvoie [6, 28, 496].
Exercice 5 Fractions égyptiennes
On considère une fraction ab telle que a ∈ N, b ∈ N∗ et 0 < ab < 1 ("fraction propre").
L’objectif est de la décomposer en somme de fractions de la forme d1 (avec d ≥ 1).
8 1 1 1805 1
Par exemple, 15
= 2
+ 30
ou 1806
= 2
+ 31 + 17 + 1
43
ou trivialement 2
4
= 12 .
La décomposition n’est en général pas unique : nous proposons un algorithme dit « glouton »
pour réaliser une telle décomposition.
Dans cet exercice, nous supposons avoir déjà importé la fonction ceil qui calcule la valeur entière
directement supérieure à un nombre décimal (par exemple, ceil(3.2) renvoie 4). On l’a fait par
l’instruction : from math import ceil
a) Écrire une fonction simplifie(a, b), avec a supposé non nul et a < b, qui, si b est un
multiple de a, divise par a respectivement le numérateur et le dénominateur de ab , puis
renvoie le tuple des nouvelles valeurs du numérateur et du dénominateur. Par défaut, on
renvoie a et b.
Par exemple, simplifie(3, 9) renvoie (1, 3) et simplifie(1, 3) renvoie (1, 3).
a
Dans toute la suite de l’énoncé, « simplifier » la fraction b
signifie diviser son numérateur et son
dénominateur par a.
La décomposition en fractions égyptiennes que nous adoptons, repose sur le calcul suivant :
si c est le plus grand entier non nul tel que 1c ≤ ab < c−1 1
(donc c = ⌈b/a⌉, valeur entière
a 1 ac−b
directement supérieure à b/a), alors b = c + bc .
Si b n’est pas un multiple de a, alors 1 ≤ ac − b < a : on peut itérer la décomposition en fractions
égyptienne avec ac−b
bc
et constater que celle-ci va s’achever avec un numérateur égal à 1.
Corrigé
Exercice 1 Calculs
a) 2*3 renvoie 2 × 3 = 6 et 2**3 renvoie 23 = 8 ?
b) 24%2 renvoie le reste de la division euclidienne de 24 par 2.
L’instruction 24%2 == 0 teste donc si 24 est pair.
Comme c’est le cas, l’instruction 24%2 == 0 renvoie True.
c)
6 if x >= y :
7 print ( x )
8 else :
9 print ( y )
d) Dans le shell : s1 + s2 + s3
Dans l’éditeur de programme : print(s1 + s2 + s3)
Exercice 2 Boucle sous condition
a)
14 n = 0
15 u = 0
16 while u < 10**15:
17 n = n + 1
18 u = 3** n + n - 1
19 print ( n ) # 32
b)
22 n = 1
23 somme = 1
24 while somme <= 26042:
25 n = n + 1
26 somme = somme + n **2
27 print (n -1) # 42
b)
41 def produit ( t ) :
42 n = len ( t )
43 prod = 1
44 for i in range ( n ) :
45 prod = prod * t [ i ]
46 return prod
47
48 t = [1 , 2 , 3 , 4]; assert produit ( t ) == 24
c)
51 def occurrence (t , x ) :
52 n = len ( t )
53 nbre = 0
54 for i in range ( n ) :
55 if t [ i ] == x :
56 nbre = nbre + 1
57 return nbre
58
59 t = [1 , 2 , 3 , 4]
60 assert occurrence (t , 0) == 0; assert occurrence (t , 1) == 1
61 t = [1 , 2 , 1 , 1]; assert occurrence (t , 1) == 3
d)
64 def uns ( n ) :
65 t = []
66 for i in range ( n ) :
67 t . append (1)
68 return t
69
70 # ou
71 def uns ( n ) :
72 return [1 for _ in range ( n ) ]
73
74 assert uns (4) == [1 , 1 , 1 , 1]
84 n = 1; assert somme_diviseurs ( n ) == 1
85 n = 24; assert somme_diviseurs ( n ) == 60
b)
88 def p l u s _ g r a n d e _ s o m m e _ d i v i s e u r s ( n ) :
89 somme_max = 0
90 k_max = 0
91 for k in range (1 , n +1) :
92 s = somme_diviseurs ( k )
93 if s > somme_max :
94 somme_max = s
95 k_max = k
96 return somme_max , k_max
97
98 assert p l u s _ g r a n d e _ s o m m e _ d i v i s e u r s (24) == (60 , 24)
c)
101 def parfait ( n ) :
102 return somme_diviseurs ( n ) == 2* n
d)
105 def liste_parfait ( b ) :
106 t = []
107 for i in range (1 , b +1) :
108 if parfait ( i ) :
109 t . append ( i )
110 return t
111
112 assert liste_parfait (1000) == [6 , 28 , 496]
b)
128 def pr oc ha in e_ fra ct io n (a , b , c ) :
129 afrac = a *c - b
130 bfrac = b * c
131 afracsimple , bfracsimple = simplifie ( afrac , bfrac )
132 return afracsimple , bfracsimple
133
134 a , b , c = 1805 , 1806 , ceil (1806/1805) ; assert pr oc ha in e_ fr ac ti on (a , b ,
c ) == (1804 , 3612)
c)
137 def d e co m p o s i t i o n _ e g y p t i e n n e (a , b ) :
138 L = []
139 asimple , bsimple = simplifie (a , b )
140 while asimple != 1 :
141 c = ceil ( bsimple / asimple )
142 L . append ( c )
143 asimple , bsimple = pr oc ha in e_ fr ac ti on ( asimple , bsimple , c )
144 L . append ( bsimple )
145 return L
146
147 a , b = 1805 , 1806; assert d e c o m p o s i t i o n _ e g y p t i e n n e (a , b ) == [2 , 3 , 7 ,
43]
148 a , b = 2 , 4; assert d e c o m p o s i t i o n _ e g y p t i e n n e (a , b ) == [2]
d)
152 def d e c o m p o s i t i o n _ e g y p t i e n n e _ g e n e r a l e (a , b ) :
153 return a // b , d e c o m p o s i t i o n _ e g y p t i e n n e ( a %b , b )
154