Lyc ´ee Thiers
PYTHON - DEVOIR SURVEILLÉ 2
Exercice 1-Algorithme probabiliste de recherche du k-i`eme plus petit ´el´ement dune liste
On considère une liste Lde longueur nne comportant que des valeurs distinctes, prises dans l’en-
semble [[1,N]] (nN).
Soit k[[1,n]], on souhaite écrire une fonction qui renvoie le k-ième plus petit élément de cette liste.
Description de l’algorithme.
On choisit une valeur dans la liste au hasard;
On partage alors la liste en 2 sous-listes, celle des éléments strictement inférieurs à l’élément choisi
et celle des éléments strictement supérieurs.
Si la première liste comporte k1 éléments, on a de la chance, on renvoie l’élément choisi car c’est
le bon.
Si la première liste comporte kéléments ou plus, on remplace notre liste départ par cette liste et on
retourne au premier point.
Si la première liste comporte k2 éléments ou moins, notons `sa longueur, on remplace notre liste
par la deuxième liste, kpar k1`et on retourne au premier point.
On s’arrête lorsque la liste a une longueur k1 et on renvoie le dernier élément tiré au hasard.
[Qu. 1]
1) Écrire une fonction listeValeursDistinctes(n,N) qui retourne une liste de nvaleurs distinctes
choisies dans l’intervalle [[1,N]].
On pourra, pour cela, s’inspirer d’un algorithme que l’on a déjà utilisé à plusieurs reprises et
qui réalise npermutations d’éléments de la liste L=[1,2,...,N].
Un exemple :
>>> liste2ValeursDistinctes(10,100)
[13 , 77, 94, 22, 12, 64, 82, 42, 58, 53]
2) Soit x[[1,N]] et Lune liste renvoyée par la fonction précédente. Définir une fonction partageInfSup(L,x)
qui renvoie un couple de listes infL,supL infL est la liste des valeurs strictement inférieures
àxprésentes dans la liste Let supL, la liste de celles qui sont strictement supérieures à x.
Voici un exemple :
>>> L=liste2ValeursDistinctes(10,100)
>>> L
[1, 38, 4, 86, 58, 55, 47, 95, 82, 90]
>>> partage (L ,58)
([1 , 38, 4, 55, 47], [86, 95, 82, 90])
On remarquera dans cet exemple que, bien que xsoit présent dans la liste, cette valeur ne se
retrouve pas dans les deux listes renvoyées.
PYTHON - DEVOIR SURVEILLÉ 2 2
3) Ecrire une fonction maj(k,L1,L2), qui étant données deux listes L1,L2 et un entier k, renvoie le
couple (L1,k) si la longueur de la liste L1 est inférieure ou égale k-1 et le couple (L2,k-1-len(L1))
sinon.
[Qu. 2] En utilisant les fonctions précédentes, définir une fonction kiemePlusPetit(L,k) qui renvoie,
lorsque la valeur de kest inférieure ou égale à la longueur de L, le k-ième plus petit élément de la liste
L.
[Qu. 3] L’exécution de listeValeursDistinctes(n,N) renvoie une liste L.
Cette liste peut-être considérée comme résultat de l’expérience aléatoire consistant à eectuer ntirages
avec remise dans une urne contenant Nboules numérotées de 1 à N, en notant le numéro obtenu
après chaque tirage.
Pour kfixé, l’exécution de la fonction kiemePlusPetit(L,k) nécessite un certain temps ;). Ce temps,
étant une fonction de L, s’apparente à une variable aléatoire dont nous souhaitons estimer l’espérance.
Espérance qui elle, sera alors une fonction de n,Net k. On souhaite, Net kétant fixés, estimer cette
fonction de npour mesurer l’ecacité de l’algoritme utilisé.
Pour cela on utilise le module time et dans ce module la fonction perf_counter().
Si dans un script on utilise l’instruction t0=perf_counter(), puis plus loin t1=perf_counter(), alors
t1-t0 est égale au temps exprimé en secondes qui s’est écoulé entre ces deux instructions.
1) Ecrire une fonction estimTempsMoyen(m,k,nombreExp) qui :
α) réalise, pour chaque entier i[[1,10]],nombreExp exécutions de l’instruction
kiemePlusPetit(liste2ValeursDistinctes(i*m,100*m),k) ;
β) renvoie une liste de longueur 10 dont les valeurs sont les estimations des temps moyens
d’exécution de kiemePlusPetit(liste2ValeursDistinctes(i*m,100*m),k) pour i[[1,10]]
obtenues à partir du α) .
2) Tester la fonction plot du module matplotlib.pyplot en saisissant dans le shell, après avoir
importé cette fonction, plot([1,3,5],[4,6,0]).
En utilisant la liste renvoyée par estimTempsMoyen(100,10,300), représenter graphiquement le
temps moyen estimé d’exécution de kiemePlusPetit(liste2ValeursDistinctes(i*100,10000),10)
pour i[[1,10]] en fonction de i*100.
Quelle conjecture pouvez-vous faire sur la nature de cette fonction?
Exercice 2 - POO pour la r´esolution d´equations polynomiales dans Q
On se propose de construire une classe pour manipuler des polynômes à coecients entiers. Un
polynôme sera un objet ayant un unique attribut : la liste de ses coecients. Par exemple, le polynôme
défini par :
P(x)=3x47x34x2+14x4
sera représenté par un objet Ptel que :
>>> P.coeffts
[-4, 14, -4, -7, 3]
On souhaite notamment mettre au point une méthode permettant de dresser la liste (éventuellement
vide) des racines rationnelles d’un polynôme à coecients entiers.
On aura ainsi :
>>> P.racinesQ()
[(2, 1), (1, 3)]
PYTHON - DEVOIR SURVEILLÉ 2 3
Ce dernier résultat signifie que les racines rationnelles de Psont 2 et 1/3,ce qui est correct puisque,
pour tout x:
3x47x34x2+14x4=(x2) (3x1)x22
[Qu. 1] Etant donné deux entiers uZet nN,on souhaite calculer la liste h1,u,u2,· · · ,uni.
1) Ecrire une fonction listePuissances(u, n) qui fasse cela, en une seule instruction Python. Com-
bien de multiplications cette fonction eectue-t-elle ?
2) Ré-écrire cette fonction en faisant en sorte qu’elle eectue, en tout et pour tout, nmultiplications
(ou n+1 à la rigueur).
[Qu. 2] Définir la classe polyn et la méthode __init__ d’une manière appropriée (3 lignes de code) de
telle sorte que, pour définir le polynôme Pdu début de l’énoncé, on exécute la commande suivante :
>>> P = polyn([-4, 14, -4, -7, 3])
[Qu. 3] Evaluation “naïve” d’un polynôme.
En s’inspirant de Qu. 1-2), écrire une méthode eval telle que P.eval(a) renvoie P(a).On rappelle la
forme de l’en-tête de définition :
def eval(self, a):
...
Combien de multiplications cette fonction eectue-t-elle ?
[Qu. 4] Il n’est pas nécessaire de traiter cette question pour aborder les deux suivantes.
Etant donnés un polynôme P(x)=
n
X
k=0
ckxk(avec n>1 et c0,· · · ,cnentiers) et un entier a,on admet
qu’il existe des entiers q0,· · · ,qn1tels que :
P(x)=(xa)
n1
X
k=0
qkxk+P(a)
1) Pour tout k{0,· · · ,n},exprimer cken fonction des qiet de a.On distinguera trois cas : k=n,
16k6n1 et k=0.
2) En déduire une méthode pour calculer P(a)qui requiert en tout nmultiplications.
3) Ecrire une méthode evalBis, telle que P.evalBis(a) renvoie P(a)en appliquant cette méthode.
[Qu. 5] Pour savoir si un rationnel u/v(u,ventiers et v,0) est racine d’un polynôme P(x)=
n
X
k=0
ckxk,
on peut calculer une expression qui ne fasse intervenir que des entiers et dont la valeur soit aussi un
entier.
1) Préciser cela.
2) En déduire une méthode admetLaRacine telle que P.admetLaRacine(u, v) renvoie True si Pu
v=
0 et False sinon. On pourra utiliser la fonction listeDesPuissances (cf. Qu. 1).
PYTHON - DEVOIR SURVEILLÉ 2 4
[Qu. 6] On rappelle le principe du test des racines rationnelles pour la résolution d’une équation
algébrique :
Etant donnés nN?et a0,· · · ,anZ,avec an,0 et a0,0,on s’intéresse à l’équation
anxn+· · · +a1x+a0=0 (1)
On peut montrer à l’aide du théorème de Gauss 1, que si (1) possède une solution rationnelle p
q(mise
sous forme irréductible, c’est-à-dire avec p,qZ×N?et pq=1),alors :
p|a0et q|an
1) Ecrire une fonction divPos qui renvoie la liste des diviseurs positifs d’un entier. En déduire une
fonction diviseurs qui renvoie la liste de tous les diviseurs (positifs et négatifs) d’un entier. On
aura ainsi :
>>> divPos(12)
[1, 2, 3, 4, 6, 12]
>>> diviseurs(12)
[1, 2, 3, 4, 6, 12, -1, -2, -3, -4, -6, -12]
2) Ecrire une fonction mixList qui, étant données deux listes Net Dd’entiers non nuls, renvoie la
liste des couples ni,djniest un terme de Net djun terme de D.
3) Programmer le test des racines rationnelles sous la forme d’une méthode racinesQ. Cette mé-
thode, appliquée à un polynôme P,devra renvoyer une liste de couples (u,v)d’entiers (v,0) de
telle sorte que les fractions u/vsoient les racines rationnelles de P.Attention : dans cette liste,
plusieurs couples pourront représenter un même rationnel.
4) Quelles sont les solutions rationnelles de l’équation suivante ?
77x6+240x5+128x4+28x3120x28x+15 =0
5) Même question pour l’équation :
377x69 191x68 +24x67 754x2+382x48 =0
6) Ecrire une version plus aboutie de la méthode racinesQ, en essayant de corriger le défaut men-
tionné au 3). En outre, au lieu de renvoyer une liste, on achera les racines rationnelles sous la
forme u/v,à raison d’une racine par ligne.
1. Si a,b,cN?sont tels que a|bc et PGCD (a,b)=1,alors a|c.
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !