Académique Documents
Professionnel Documents
Culture Documents
Espaces Vectoriels
4 Gestion de Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1 Manipulation de liste
Exercice 1 (2017-Da Silva, 2018-Balducci et Dabas) :
On dénit la suiteu (u ) par u puis :
si u est divisible par 4 et u = (3u + 2)\\2 sinon (division entière).
n 0
n
∀n ∈ IN, u =
n+1 n n+1 n
def q1(d):
u=[d]
for k in range(30):
if u[k]%4==0:
u.append(u[k]//4)
else :
u.append((3*u[k]+2)//2)
n=[k for k in range(31)]
plt . plot (n,u)
plt .show()
q1(25)
q1(37)
else :
u.append((3*u[−1]+2)//2)
return cpt
def maximum(d):
u=[d]
while u[−1]!=1 :
if u[−1]%4==0:
u.append(u[−1]//4)
else :
u.append((3*u[−1]+2)//2)
return max(u)
def maximum2(d):
u=[d]
result =d
while u[−1]!=1 :
if u[−1]%4==0:
u.append(u[−1]//4)
else :
u.append((3*u[−1]+2)//2)
if u[−1]> result :
result =u[−1]
return result
print (maximum(25))
print (maximum2(25))
5. Ecrire une fonction qui lorsque le maximum de u est supérieur à 100000, renvoie, d (la valeur intiale), le temps
de vol et la valeur du maximum. (pour d < 1000)
n
Remarque : La solution proposée ici est loin d'être optimale car on recalcule la suite 3 fois quand le maximum est
supérieur à 10000, mais c'est un oral de 30min...
Exercice 2 ( 2018-Derkenne) incomplet :
Il s'agit de faire le jeu du démineur.
Faire une fonction qui construit un tableau à m lignes et n colonnes rempli de 0.
Solution :
def tableau(m,n):
result =[]
for k in range(m):
result .append([0]*n)
return result
On place aléatoirement le motif '*' dans d cases (ce sont les mines).
Solution :
Ici je choisis de faire un tableau plus grand que demandé pour éviter de faire des cas particuliers si les mines sont sur les
bords.
def placemine(m,n,d):
A=tableau(m+2,n+2)
tiragesprec =[]
i=0
while i < d:
a=np.random.randint(1,m+1)
b=np.random.randint(1,n+1)
if [a,b] not in tiragesprec :
i=i+1
tiragesprec .append([a,b])
for e in tiragesprec :
A[e[0 ]][ e[1]]= ' * '
return tiragesprec ,A
Dans les cases adjacentes aux mines (y compris en diagonale) on ajoute 1 à la case.
Tout est dans la même fonction qui renvoie une liste de listes.
def demineur(m,n,d):
C=placemine(m,n,d)
A=C[1]
mines=C[0]
for e in mines:
a,b=e[0],e[1]
for i in range(−1,2):
for j in range(−1,2):
if A[a+i][b+j] != '* ' :
A[a+i][b+j]=A[a+i][b+j]+1
return A
1. Ecrire une fonction d'arguments n et p qui retourne le quotient et le reste de la division euclidienne de n par 10 .
p
def div(n,p):
return n//10**p,n%10**p
print (div(10000,2))
le sujet ici nous propose la division par 10 le reste représente les p derniers chires de ce nombre et le quotient
p
print (kq(22))
print (kq(99))
print (kq(100))
print (kq(98))
def kq2(n):
p=1
while 10**p<n**2:
result =div(n**2,p)
if result [0]+result [1]==n:
return True,[ str (n**2)[0:p ], str (n**2)[p :]] #slicing ici pour garder le 0 comme dans l'exemple
p=p+1
return False
print (kq2(99))
Solution :
On sort du cadre informatique, si n = 10 , alors n = 10 c'est à dire 1 suivi de 2p 0, on prend le 1 et les p zéros
p 2 2p
(10 − 2) ∗ 10 = (n − 1) ∗ 10 .
p p p
if test (k):
liste .append(k)
k=k+1
return liste
3. Ecrire une fonction d'argument un entier p qui renvoie les palindromes formés avec les entiers à p chires.
def pchires (p):
liste =[]
k=10**(p−1)
while k<10**p:
if test (k):
liste .append(k)
k=k+1
return liste
Solution :
def en_deux(L):
result =[]
for k in range(0, len(L),2):
result .append(L[k])
for k in range(1, len(L),2):
result .append(L[k])
return result
print (en_deux(['a' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' ]))
2. Faire une fonction per1(n) qui à partir de la taille d'une liste renvoie p, p étant le nombreminimal de fois que la
liste considérée (de taille n) 'doit passer' dans En_deux an de retrouver la liste initiale. On génèrera la liste des
npremiers entiers pour la fonction.
def per1(n):
init =[k for k in range(n)]
L=en_deux(init)
cpt=1
while L!=init :
L=en_deux(L)
cpt=cpt+1
return cpt
print (per1(135))
3. Soit q le plus grand entier impair inférieur ou égal à n. Faire une fonction per2(n) qui renvoie un entier p, p
étant le plus petit entier supérieur à 2 tel que (2 − 1) est divisible par q.
p
def per2(n):
q=n
if n%2==0:
q=n−1
p=2
while (2**p−1)%q !=0:
p=p+1
return p
print (per2(135))
Il y avait d'autres questions, notamment le sujet donnait une liste d'instructions permettant de récupérer une
image de la stocker dans un np.array puis d'acher l'image en la transformant en niveau de gris. Il fallait faire
des opérations sur cette image mais aucun des deux élèves n'a réussi et visiblement le programme de l'examinateur
ne fonctionnait pas non plus...
Exercice 6 (2018- Farouk - rapport 2018) :
1. Dénir une fonction f d'argument x qui renvoie 1 + b x1 c ou btc désigne la partie entière de t, si x est strictement
positif et zéro sinon.
def q1(x):
if x <= 0:
return 0
else :
return 1 + m.oor(1/x)
print (q1(1.5))
1 1 1
S(B) = (1 + (1 + ...(1 + ))
b1 b2 bn
def s2(B):
if len(B)==1:
return 1/B[0]
else :
return (1+s2(B[1:]))/B[0]
Ecrire la fonction LA de deux arguments x et n et qui renvoie les n + 1 premiers termes de la suite (a ) en
n 0 1 n−1 0 1 n−1
partant de x.
n
def LA(x,n):
result =[q1(x)]
prod=q1(x)
while len( result ) <= n :
result .append(q1(prod*(x−s(result))))
prod=prod*result[−1]
return result
print (LA(1,5))
print (s(LA(1,5)))
print (1−1/2**6)
print (LA(5/7,4))
print (s(LA(5/7,4)))
print (LA(5/7,5))
def Srec(x,d) :
result =[q1(x)]
prod=q1(x)
while x−s(result ) > 10**(−d) :
result .append(q1(prod*(x−s(result))))
prod=prod*result[−1]
return result
print (Srec(1,7))
def melanger(L):
if len(L)%2==1:
return False
result =[]
n=len(L)//2
L1=L[:n]
L2=L[n:]
for k in range(n):
result .append(L2[k])
result .append(L1[k])
return result
print (melanger([1,2,3,4,5,6]))
2. Ecire une fonction d'argument une liste L de longueur multiple de 4 et qui renvoie N construite ainsi :
* L1 et L2 sont dénies comme précédemment.
* M 1 est le mélange de L1 et M 2 celui de L2.
* N est le mélange de la liste obtenue en concaténant M 1 et M 2.
def q2(L):
if len(L)%4!=0:
return False
n=len(L)//2
L1=L[:n]
L2=L[n:]
M1=melanger(L1)
M2=melanger(L2)
return melanger(M1+M2)
print (q2([1,2,3,4,5,6,7,8]))
3. Soit L de taille 52, combien de fois faut-il appliquer la fonction précédente pour le dernier élément de L retrouve
sa place?
test =[k for k in range(52)]
def q3(L):
result =q2(L)
cpt=1
while result [−1]!=L[−1]:
result =q2(result)
cpt=cpt+1
return cpt
print (q3(test ))
4. Faire de même pour chacun des éléments de la liste L. Combien de passages devra-t-on opérer pour revenir à la
liste initiale (en utilisant les périodes trouvées juste avant)
def q4(i ,L):
result =q2(L)
cpt=1
while result [ i]!=L[ i ]:
result =q2(result)
cpt=cpt+1
return cpt
Ensuite il sut de prendre le ppcm des nombres obtenus, ici :5 ∗ 11 ∗ 4 = 220. Le jury attend peut-être une
programmation de la recherche du ppcm pour les élèves arrivant rapidement au bout. Une des manières de faire est
d'utiliser l'algorithme d'Euclide pour le pgcd puis d'en déduire le ppcm avec ppcm(a, b) ∗ pgcd(a, b) = a ∗ b
Exercice 8 (2018 - Perez) 1. Identier ce que font les deux fonctions suivantes :
def mystere1(L):
n=len(L)
p=len(L[0])
result =np.zeros((n,p))
for i in range(n):
for j in range(p):
result [ i ][ j]=L[i ][ j ]
return result
def mystere2(T):
result =[]
n=np.shape(T)[0]
p=np.shape(T)[1]
for i in range(n):
ligne =[]
for j in range(p):
ligne .append(T[i][ j ])
result .append(ligne)
return result
Solution :
La première fonction transforme une liste de listes en tableau et la seconde fait l'inverse.
2. Créer une fonction de paramètre une matrice A (un tableau) et un entier k et qui supprime la première ligne et la
k-ième colonne de la matrice.
def supprime(T,k):
prov=mystere2(T)
result1 =[]
for i in range(1, len(prov )):
ligne =prov[i]
del ( ligne [k])
result1 .append(ligne)
result2 =mystere1(result1)
return result2
print (supprime(A,2))
1. Exprimer t en fonction de n.
n
k=1
2. On dit alors que t est un entier de type T . Ecrire une fonction qui donne la liste de tous les entiers de type T
inférieurs à 100.
n
#Méthode 1
res1=[]
a=1
k=1
while a < 100 :
res1 .append(a)
k=k+1
a=k*(k+1)/2
print (res1)
# Méthode 2
res2=[1]
k=2
while res2[−1] < 100:
res2 .append(res2[−1]+k)
k=k+1
del (res2[−1])
print (res2)
#Methode 3
n=100
res3=[k*(k+1)/2 for k in range(1,n+1]
3. Ecrire une fonction somme avec comme arguments deux listes L ,L et un entier n et qui renvoie la liste des
entiers, inférieurs à n, qui peuvent s'écrire comme la somme d'un élément de L et d'un élément de L , liste
1 2
def somme(L1,L2,n):
result =[]
for e1 in L1 :
for e2 in L2:
s=e1+e2
if s not in result and s < 100 :
result .append(s)
result . sort ()
return result
print (somme([1,56,86],[85,2,95],100))
#La complexité n'est surement pas optimale
4. Donner la commande qui en utilisant la fonction précédente, permet de donner la liste des entiers inférieurs à 100
pouvant s'écrire comme la somme de trois entiers de type T inférieurs à 100. Que peut-on conjecturer?
print (somme(somme(res2,res2,100),res2,100))
#Conjecture .... il y a presque tous les nombres et à partir de 30 ils semblent tous y etre .
5. Ecrire une fonction nbdecomb qui prend en entrée un entier n et qui renvoie le nombre de combinaisons possibles
de 3 entiers de type T dont la somme donne n.
def nbdecomb(n):
T=[k*(k+1)/2 for k in range(1,n)]
result =[]
for e1 in T:
for e2 in T:
for e3 in T:
if e1+e2+e3==n:
s=[e1,e2,e3]
s . sort ()
if s not in result :
result .append(s)
return len( result )
print (nbdecomb(99))
return i ,n
print (q5())
Solution :
La complexité de la fonction proposée ici n'est clairement pas bonne (O(n )), le jury laisse-t-il le temps de rééchir
3
à une amélioration?
# Pour mesurer le temps, il sut de mettre un compteur temps :
import time
def nbdecomb2(n):
t1=time.perf_counter()
T=[k*(k+1)/2 for k in range(1,n)]
result =[]
for e1 in T:
for e2 in T:
for e3 in T:
if e1+e2+e3==n:
s=[e1,e2,e3]
s . sort ()
if s not in result :
result .append(s)
t2=time.perf_counter()
return len( result ), t2−t1
print (nbdecomb2(399))
Exercice 10 (2018 - Glaser ) 1. Créer une fonction qui prend en argument une liste ou une chaine de caractères
et qui renvoie le nombre d'éléments distincts.
def distincts (L):
result =[]
for e in L:
if e not in result :
result .append(e)
return(len( result ))
2. Créer une fonction tirer1 d'argument n (grâce au module random.randint donné par l'énoncé) qui renvoie un
nombre entier sous la forme d'une chaine de caractère tiré dans l'intervalle [10 , 10 − 1].
n−1 n
3. Créer une fonction freq d'arguments n et N (nombre de tirages successifs) qui renvoie le nombre de fois sur N
tirages où un nombre tiré au hasard dans l'intervalle [10 , 10 − 1] contient tous les chires de 0 à 9.
n−1 n
achage ()
5. Créer une fonction LC d'argument C une chaîne de caratères qui renvoie la liste de tous les couples distincts de
deux éléments successifs de C en tenant compte de l'ordre.
Par exemple abcbcdee renvoie [ ab , bc , cb , cd , de , ee ]
0 0 0 0 0 0 0 0 0 0 0 0 0 0
def LC(C):
result =[]
for k in range(1, len(C)):
if C[k−1:k+1] not in result :
result .append(C[k−1:k+1])
return result
print (LC('abcbcdee'))
6. Acher la fréquence d'apparition des 100 couples ([00, 01, 02, ..., 98, 99]) (Cette parenthèse n'est pas dans l'énoncé
original, il faut donc comprendre de quels 100 couples l'énoncé parle et surtout ne pas hésiter à demander des
explications à l'examinateur) en fonction de n allant de 10 à 70 avec un pas de 2 et selon 200 tirages.
Lycée Raspail 15 PTSI2
Mathématiques
def freq2(n,N):
cpt=0
for k in range(N):
if len(LC(tirage2(n)))==100 :
cpt=cpt+1
return cpt
achage2 ()
donc l'une des deux coordonnées seulement change et elle change de +1 ou -1. Exemple :
i
C=[[0,0],[1,0],[1,-1],[1,0],[2,0],[2,1],[2,0],[1,0],[1,1]]
1. A l'aide du module randint de numpy.random, proposer une fonction de paramètre un entier n et qui construit une
liste de longueur n vériant la condition précédente.
Remarque : Je suppose que le jour de l'épreuve une liste était donnée pour les tests.
def constr(n):
result =[[0,0 ]]
for k in range(n):
i=randint(4)
temp=result[−1].copy()
if i==0:
temp[0]=temp[0]−1
elif i==1:
temp[0]=temp[0]+1
elif i==2:
temp[1]=temp[1]−1
else :
temp[1]=temp[1]+1
result .append(temp)
return result
Ltest=constr(20)
print (Ltest)
2. Ecrire une fonction deb(C) qui renvoie l'indice du premier couple deux fois présent dans la liste C et -1 s'il n'y
a aucune répétition.
Avec la liste précédente cette fonction doit renvoyer 1.
def deb(L):
test =[]
for e in L:
if e not in test :
test .append(e)
else :
return test . index(e)
return −1
print (deb(Ltest))
3. Ecrire une fonction boucle(C) qui renvoie [] si deb(C)=-1 et qui sinon renvoie le couple [d,`] avec d=deb(C) et
` le dernier indice d'apparition du même couple (celui qui apparait en d) dans la liste C.
Sur la liste donnée en exemple, la fonction renvoie [1,7]
def boucle(L):
i=deb(L)
if i==−1:
return []
prems=L[i]
for k in range(len(L)−1,i,−1):
if L[k]==prems:
return [ i ,k]
print (boucle(Ltest ))
4. Ecrire une fonction suivant(C) qui renvoie les d premiers couples de C et les couples situés au delà de l'indice `
(où d et ` sont les entiers dénis à la question précédente).
Sur l'exemple précédent cela doit renvoyer [[0,0],[1,0],[1,1]]
def suivant (L):
e=boucle(L)
if e==[]:
return L
result =[]
for k in range(e[0 ]):
result .append(L[k])
for k in range(e[1 ], len(L)):
result .append(L[k])
return result
5. Ecrire une fonction listenale(L) qui utilise les fonctions précédentes pour renvoyer une liste sans doublon.
def listenale (L):
C=L.copy()
while deb(C)!=−1:
C=suivant(C)
return C
6. Donner le code permettant de tracer la trajectoire des points représentés par C sans doublon ainsi que le code
permettant d'obtenir x , x , y , y
min max min max
xmin=min(x)
xmax=max(x)
ymin=min(y)
ymax=max(y)
plt . plot (x,y)
plt . axis ([xmin−1,xmax+1,ymin−1,ymax+1])
plt .show()
Exercice 12 (2018-Junqueira) 1. Ecrire une fonction s d'argument p qui renvoie la somme des diviseurs de p
diérents de p lorsque p ≥ 2 et 0 sinon.
An de réduire le temps de calcul, on utilisera les nombres dont le carré est inférieur ou égal à p.
def s(p):
if p < 2:
return 0
result =1
for k in range(2,m.oor (m.sqrt(p)+1)):
if p%k==0:
result =result+k+p//k
return result
print (s(28))
2. Déterminer la liste des nombres compris entre 2 et 100000 tels que s(p) = p.
un tel nombre est appelé nombre parfait.
def parfait ():
result =[]
for k in range(2,100000):
if s(k)==k:
result .append(k)
return result
4. Déterminer les nombres dont la période est la plus longue. J'ai de gros doutes sur cette question, je l'ai interprété
comme l'écart entre deux répétitions du même nombre dans la liste. Le souci est qu'on ne donne pas de nombre
Lycée Raspail 19 PTSI2
Mathématiques
maximal, or soit il est petit et les résultats ne sont pas 'interessants' (1 ou 2 comme période) soit il est grand et
alors certains nombres posent problème comme 276 dont la suite 'semble' croître à l'inni. Je dis bien 'semble',
une recherche internet montre qu'en eet ce nombre pose problème, on arrive a une somme de diviseurs à 100
chires (je me suis arrêté à 17) et on ne sait pas ce qui se passe ensuite..
def periode(p):
result =[p]
suiv=s(p)
while suiv not in result :
result .append(suiv)
suiv=s(result[−1])
result .append(suiv)
return len( result )− result . index( suiv)−1
#print(periode(25))
return m, result
print (periode2())
5. Déterminer les nombres dont la liste est la plus longue. Même remarque que ci-dessus même si les résultats sont
plus interessants, j'ai donc pris un max à 275.
def longmax():
result =[]
m=0
for k in range(2,275):
p=len(suite(k))
if p==m:
result .append(k)
if p > m :
result =[k]
m=p
return m, result
print (longmax())
def L2int(L):
ch=""
for e in L:
ch=ch + str(e)
return int (ch)
def intL2(n):
L=[]
for car in str (n):
L=L+[int(car)]
return L
En rééchissant un peu 22 semble un bon candidat, on peut tester informatiquement s'il y en a d'autres en dessous
de 10000
def test ():
result =[]
for k in range(10000):
if lire (k)==k:
result .append(k)
return result
Exercice 14 (Maths II - 2018 - Schacht) Dans cet exercice, on considère des matrices de taille p xé, qui sont
0 1 2
modélisées par une liste. Par exemple, M = 02 13 est modélisée par M=[0,1,2,3] si p = 2, et M = 3 4 5
!
1. Écrire une fonction qui prend en entrée deux vecteurs de taille n modélisés par une liste, et qui renvoie leur produit
scalaire.
def prods(u,v):
result =0
n=len(u)
for i in range(n):
result =result + u[i]* v[ i ]
return result
2. Écrire une fonction ligne qui prend en entrée une matrice M de taille p et un entier i ∈ [ 1, p]], puis renvoie la
i-ème ligne de M.
return False
3. Écrire une fonction colonne qui prend en entrée une matrice M et un entier i ∈ [ 1, p]], puis renvoie la i-ème
colonne de M.
def colonne(M,i):
p=int(m.sqrt(len(M)))
result =[]
if 0 <= i <= p−1:
for k in range(p):
result .append(M[i + k*p ])
return result
return False
4. Écrire une fonction produit qui prend en entrée deux matrices de taille p et calcule leur produit.
def produit(M,N):
if len(M)!=len(N):
return False
p=int(m.sqrt(len(M)))
result =[]
for i in range(p):
for j in range(p):
result .append(prods(ligne(M,i),colonne(N,j )))
return result
5. Écrire une fonction puissance qui prend en entrée une matrice M et un entier non nul n puis calcule M . n
def puissance(M,n):
if n==1:
return M
N=puissance(M,n//2)
if n%2==0:
return produit(N,N)
return produit(M,produit(N,N))
6. On considère une suite (U ) dénie par U = et ∀n ∈ IN, U Écrire une fonction qui
! !
0 0 1
n 0 n+1 = × Un .
1 1 1
prend en entrée un entier n puis calcule U . n
A=[0,1,1,1]
def suite (n):
B=puissance(A,n)
#on fait ensuite ' à la main' le produit par [0,1]
return ([B[1],B[3 ]])
7. Calculer U 50 .
Exercice 15 (Maths II - 2018 - Naze) On a un lot de pièces , U pièces défectueuses représentées par 1 et Z pièces
correctes représentées par 0.
Le lot contient 10 pièces défectueuses et 20 pièces correctes
from random import randint
def tirer (u,z ):
r=randint(1,u+z)
if r<=u:
return 1
else :
return 0
3. Ecrire une fonction FS(u,z,n) qui retourne une liste L qui contient le résultat de n tirages successifs sans remise
dans le lot de pièce. Tester avec n = 10 , n = 30, n = 40. Améliorer la fonction si besoin.
def FS(u,z,n):
L=[]
u1=u
z1=z
if n > u+z :
return False
for i in range(n):
x=tirer (u1,z1)
if x==1:
if u1>0:
u1=u1−1
L.append(1)
else :
z1=z1−1 #si u1=0, il n'y a plus que des pieces correctes donc on en tire forc ément une
L.append(0)
else :
if z1>0:
z1=z1−1
L.append(0)
else :
u1=u1−1 #même chose mais avec des pieces defectueuses
L.append(1)
return L
print (FS(10,20,10))
print (FS(10,20,40))
print (FS(10,20,30))
4. Ecrire une fonction MA(u,z,N) qui donne la moyenne des pièces défectueuses en eectuant N fois l'expérience
qui consiste à tirer 15 pièces avec remise dans le lot.
def MA(u,z,N):
som=0
for i in range(N):
x=FA(u,z,15)
som=som+x.count(1)
return som/N
print (MA(10,20,1000))
5.
6. Ecrire une fonction MS(u,z,N) qui donne la moyenne des pièces défectueuses en eectuant N fois l'expérience
qui consiste à tirer 15 pièces sans remise dans le lot.
def MS(u,z,N):
som=0
for i in range(N):
x=FS(u,z,15)
som=som+x.count(1)
return som/N
print (MS(10,20,1000))
7. Ecrire la fonction qui permet de déterminer la probabilité d'avoir plus de pièces défectueuses dans un tirage avec
remise de 15 pièces du lot.
def proba(u,z,N):
som=0
for i in range(N):
x=FA(u,z,15)
if x.count(1)>=10:
som=som+1
return som/N
print (proba(10,20,10000))
On admet que √
et pn √
pn ∗ 1
lim = 2 ∀n ∈ IN ,
− 2 ≤ 2n−1 .
n→+∞ qn qn 10
1. Écrire une fonction suite1 d'argument n qui calcule le n-ème couple (p , q ). n n
3. Écrire une fonction suite2 d'argument r qui renvoie un couple (p , q ) tel que pq √
n
n n − 2 ≤ r.
n
Solution :
On va utiliser la majoration donnée dans l'énoncé ici car il n'est pas question d'utiliser m.sqrt(2) qui n'est qu'une
valeur approchée.
def suite2 (r ): # reutiliser la fonction suite1 est une heresie ici .
p=1
q=1
n=0
while 1/10**(2**n−1) > r:
p,q=p**2+2*q**2,2*p*q
n=n+1
print (n)
return p,q
getcontext().prec = 28
print(Decimal(1) / Decimal(7))
Solution :
Cela permet donc de savoir combien de décimales on va garder pour le calcul et l'achage.
5. Calculer ainsi les 100 premières décimales de 2.
√
p,q=suite2(10**(−100))
getcontext (). prec=100
print (Decimal(p)/Decimal(q))
2 Probabilités
Exercice 17 (2018-Clouzot) :
Soit D une variable aléatoire réelle à valeurs dans {−1, 1}.
On dénit la variable aléatoire réelle X = 0 puis ∀n ∈ IN, X = X + D .
n
0 n+1 n n
def D():
d=randint(2) #renvoie 0 ou 1
if d==0:
return −1 #on remplace 0 par −1
return d
def LX(n):
result =[0]
for k in range(n):
result .append(result[−1]+D())
return result
print (LX(25))
for k in range(5):
a=LX(10000)
x=[i for i in range(1,10001)]
y=[a[i ] for i in range(1,10001)]
plt . plot (x,y)
plt .show()
4. Ecrire une fonction atteindre de 2 arguments (h, m) avec k ∈ Z et m ∈ IN qui renvoie 1 si h est atteint pour un
n tel que 0 ≤ n ≤ m et 0 sinon.
Solution :
5. Estimer la probabilité de ∃n ∈ IN \h soit atteint pour h ∈ [ − 20, 20]]. Tracer les points correspondants.
∗
Solution :
3 Intégration
Exercice 18 (2018 - De la Fouchardière) 1. Soit f (x) = e (1 + cos((4x + 1) )).
−x 2
def fonction2(x):
return m.exp(−x)*(1+m.cos((4*x+1)**2))
x=np.linspace(0,1,150)
y=[fonction2( i ) for i in x]
plt . plot (x,y)
plt .show()
print ( ' une valeur approchée de l integrale de 0 à 1 est ' , integrate .quad(fonction2,0,1))
2. Ecrire une fonction ST d'argument n non nul qui coupe l'intervalle [0, 1] en n morceaux égaux et qui estime ` à
l'aide de la méthode des trapèzes.
def ST(n):
result =0
for k in range(n):
result =result+(fonction2(k/n)+fonction2((k+1)/n))/(2*n)
return result
print (ST(500))
3. Ecrire une fonction M d'argument r qui renvoie une matrice M ∈ M (IR) telle que : r
def M(r):
result =np.zeros((r , r))
for i in range(r ):
for j in range(r ):
result [ i ][ j]=(j+1)**(i+1)
return result
B=np.array([0,1/12,0,−1/120,0,0,0,0])
print (np. linalg . solve (M(8),B))
Mathieu précise ne plus être sûr des valeurs, le résultat est 'moche' mais je n'ai pas vu quelles valeurs auraient
amené un résultat cohérent avec le début de l'exercice (ou sa suite d'ailleurs)
La suite de l'énoncé est sujette à caution, d'apèrs Mathieu la suite ne fonctionnait pas eti une mauvaise écriture
me fait même douter de la fonction suivante, était-ce un + ou un × entre f ( n ) et f (1 − n ?
i
i=1
def bouts(n,k):
result =0
for i in range(1,k):
result =result+fonction2(i/n)+fonction2(1−i/n)
return result
6. Ecrire une fonction ST cor (n) qui corrige la valeur de ` et renvoie ST (n) + bouts(8, n).
4 Gestion de Fichiers
Exercice 19 (2018-Voltaire) Le chier villes_france.csv ci-joint contient une ligne pour chaque commune de
France. Chacune de ces lignes contient dans l'ordre les données suivantes (séparées par des points-virgules) : numéro
de la ligne, numéro du département, nom de la commune, population (en 2010), densité, supercie (en km ), longitude
2
(en degré), latitude (en degré), altitude minimale (en m), altitude maximale (en m).
1. Combien y a-t-il de communes en France? On calculera ce nombre à l'aide de Python, en commençant par se
connecter au chier.
=open(' villes_france . csv ' , ' r ' )
L=. readlines ()
. close ()
print (len(L))
2. Écrire une fonction prenant en entrée le nom d'une commune, et renvoyant sa supercie.
propre=[]
for ligne in L:
liste =ligne. split ( ' ; ' )
liste .pop()
liste .pop() #ces deux lignes servent à enlever les deux derniers éléments 'moches'
propre .append( liste )
#On récupère une liste de listes ou chaque liste ' interne ' correspond à une ligne du chier
#Ensuite il n ' y a plus qu'à travailler sur cette liste
print (propre)
3. Quelle est la ville la plus peuplée de France? La (ou les) ville(s) la (ou les) moins peuplée(s) de France (on notera
les ex aequo)?
def peuplée ():
mini=10000000
maxi=0
popmax=[]
popmin=[]
for ligne in propre :
if int ( ligne [3]) > maxi:
popmax=[(ligne[2])]
maxi=int(ligne [3])
elif int ( ligne [3])==maxi :
popmax.append((ligne[2]))
elif int ( ligne [3])<mini:
mini=int( ligne [3])
popmin=[ligne[2]]
elif int ( ligne [3])==mini:
popmin.append(ligne[2])
return popmax,maxi,popmin,mini
print (peuplée())
4. Construire la liste DPT contenant les numéros de tous les départements, classés dans l'ordre où ils apparaissent
dans ce chier. On remarquera que le numéro 20 n'est pas utilisé (il est remplacé par '2A' et '2B' pour la Corse).
Lycée Raspail 32 PTSI2
Mathématiques
def departements():
dpt=[]
for ligne in propre :
if ligne [1] not in dpt:
dpt.append(ligne[1])
return dpt
print (departements())
5. Construire une liste contenant, pour chaque département, la ville la plus peuplée (on admet cette fois qu'il n'y a
pas d'ex aequo).
def peupledpt ():
dpt=departements()
result =[]
for num in dpt:
result .append([num,0,0])
for ligne in propre :
for element in result :
if ligne [1]==element[0]:
if int ( ligne [3])>element[2]:
element[1]=ligne [2]
element[2]=int( ligne [3])
return result
print (peupledpt())
6. Tracer la carte des villes de France métropolitaine (celles dont le numéro de département est un entier compris
entre 1 et 95). On représentera la ville de longitude ϕ et de latitude α par un point de coordonnées cartésiennes
(ϕ, sin α). (On pensera à convertir la latitude et la longitude en radians...) Qu'observe-t-on?
x=[]
y=[]
for ligne in propre :
if ligne [1]!= ' 2A' and ligne [1]!= ' 2B' :
if 1 <= int(ligne[1]) <= 95:
x.append(oat( ligne [6])* m.pi/180)
y.append(m.sin(oat ( ligne [7])* m.pi/180))
Cet exercice a entièrement été reconstruit, par M.Hesse à partir des attributs du chier source fournis
par son élève.