Exercices Types – Algorithmique et simulation

Transcription

Exercices Types – Algorithmique et simulation
Exercices Types – Algorithmique et simulation numérique – Oral Mathématiques et Algorithmique – Banque PT – Propositions de réponses
Exercice 0
# -*- coding: utf-8 -*#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
n = 1234
q = 1234 // 10
# quotient de n par 10
r = 1234 % 10
# reste de n par 10 = chiffre des unités
q1 = q // 10
# reste de q par 10
r1 = q % 10
# reste de q1 par 10 = chiffre des dizaines
print('n = {}, q = {}, r = {}, q1 = {}, r1 = {}'.format(n, q, r, q1, r1))
print('Les restes successifs contiendront les chiffres de n')
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
s = r**3 + r1**3
# contiendra la somme des cubes des chiffres
q2 = q1 // 10
s += (q1 % 10)**3
s += (q2 % 10)**3
--- Question 1 --n = 1234, q = 123, r = 4, q1 = 12, r1 = 3
Les restes successifs contiendront les chiffres de n
--- Question 2 --Somme des cubes des chiffres de 1234 : 100
--- Question 3 --Somme des cubes de 1234 :
--- Question 4 --Les chiffres inférieurs à
0, 1, 153, 370, 371, 407,
--- Question 5 --Somme des cubes de 1234 :
100
1000 égaux à la somme des cubes de leurs chiffres :
100
print('Somme des cubes des chiffres de {} : {}'.format(n, s))
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
def somcube(n):
"""
n : entier naturel
renvoie la somme des cubes des chiffres de l'écriture décimale de n
"""
s = 0
# contiendra la somme des cubes des chiffres
q = n
# contiendra les quotients successifs par 10
# la boucle stoppe lorsque q = 0
while q:
s += (q % 10)**3
q = q // 10
# que l'on peut écrire q //= 10
return s
print('Somme des cubes de 1234 : ', somcube(1234))
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
maxi = 1000
print('Les chiffres inférieurs à {} égaux à la somme des cubes de leurs\
chiffres :'.format(maxi))
for i in range(maxi + 1):
if i == somcube(i):
print(i, end = ', ')
print()
#--- question 5 ---------------------------------------------------------------print('\n --- Question 5 --- ')
def somcube2(n):
"""
n : entier naturel
renvoie la somme des cubes des chiffres de l'écriture décimale de n
"""
[email protected]
1
chiffres_str = str(n)
# chaîne de caractères des chiffres de n
somme = 0
for c in chiffres_str:
somme += int(c)**3
return somme
# ou bien : return sum(int(c)**3 for c in chiffres_str )
print('Somme des cubes de 1234 : ', somcube(1234))
Exercice 1
# -*- coding: utf-8 -*import matplotlib.pyplot as plt
import scipy.integrate as integ
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
#------------- lecture des données ------------fichier = open('data/ex_001.csv', 'r')
LX = []
LY = []
# liste des abscisses
# liste des ordonnées
for ligne in fichier:
donnee = ligne.split(';')
LX.append(float(donnee[0]))
LY.append(float(donnee[1]))
fichier.close()
--- Question 1 --abscisses x | ordonnées y
------------------------0.0
| 1.00988282142
0.1
| 1.07221264497
0.2
| 1.11111111111
0.3
| 1.21212212121
0.4
| 1.0101010101
0.5
| 0.99999991111
0.6
| 0.95000011111
0.7
| 0.82323232323
0.8
| 0.66666666666
0.9
| 0.42323232323
1.0
| 0.55555555555
1.1
| 0.88888888888
1.2
| 0.96969696969
1.3
| 1.22222222222
1.4
| 1.55555555555
--- Question 2 ---
#------------- affichage des données -----------print('abscisses x | ordonnées y ')
print('-' * 25)
for i in range(len(LX)):
print('{}
| {}'.format(LX[i], LY[i]))
print()
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
plt.plot(LX, LY, marker = 'D')
plt.xlabel('$x$')
plt.ylabel('$y$')
plt.grid()
plt.show()
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
def trapeze(x, y):
"""
x et y : deux listes numériques de même longueur n
renvoie la somme des (x_i-x_(i-1)) * (y_i + y_(i-1)) / 2 pour 0 < i < n
"""
trap = 0
# contiendra la somme voulue
[email protected]
--- Question 3 --Valeur de trapeze(LX, LY) :
1.3187761047555
--- Question 4 --Valeur avec trapz de scipy.integrate :
1.31877610476
2
for i in range(1,len(x)):
trap += (x[i] - x[i-1]) * (y[i] + y[i-1]) / 2
return trap
'''
# que nous pourrions remplacer par :
return sum(x[i] - x[i-1]) * (y[i] + y[i-1]) / 2 for i in range(1,n))
'''
print('Valeur de trapeze(LX, LY) : ')
print(trapeze(LX, LY), end = '\n\n')
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
print('Valeur avec trapz de scipy.integrate :')
print(integ.trapz(LY, LX))
Exercice 2
# -*- coding: utf-8 -*#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
# --- création de la matrice M des distances du graphe G --M = [[0, 9, 3, -1, 7],[9, 0, 1, 8, -1],[3, 1, 0, 4, 2],[-1, 8, 4, 0, -1],[7, -1, 2, -1, 0]]
# --- affichage de la matrice M --print('Matrice M des distances du graphe G : ')
for ligne in M:
for coeff in ligne:
print('{:>2}'.format(coeff), end = ' ')
print()
print()
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
voisins_4 = []
for j in range(5):
if M[4][j] > 0:
voisins_4.append(j)
print('Liste des voisins du sommet 4 :', voisins_4)
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
def voisin(i):
"""
i : entier sommet de [0,4]
retourne la liste vois_i des voisins du sommet i
"""
global M
vois_i = []
[email protected]
--- Question 1 --Matrice M des distances du graphe G :
0 9 3 -1 7
9 0 1 8 -1
3 1 0 4 2
-1 8 4 0 -1
7 -1 2 -1 0
--- Question 2 --Liste des voisins du sommet 4 : [0, 2]
--- Question 3 --Liste des voisins du
Liste des voisins du
Liste des voisins du
Liste des voisins du
Liste des voisins du
--- Question 4
Degré du sommet
Degré du sommet
Degré du sommet
Degré du sommet
Degré du sommet
--0 :
1 :
2 :
3 :
4 :
sommet
sommet
sommet
sommet
sommet
0
1
2
3
4
:
:
:
:
:
[1,
[0,
[0,
[1,
[0,
2, 4]
2, 3]
1, 3, 4]
2]
2]
3
3
4
2
2
--- Question 5 --Longueur du trajet de
Longueur du trajet de
Longueur du trajet de
Longueur du trajet de
Longueur du trajet de
Longueur du trajet de
[0]
[0,
[0,
[0,
[0,
[0,
: -1
0] : -1
1, 0] : 18
1, 4, 0] : -1
1, 3, 2, 4] : 23
1, 4] : -1
3
for j in range(5):
if M[i][j] > 0:
vois_i.append(j)
return vois_i
for i in range(5):
print('Liste des voisins du sommet {} : {}'.format(i, voisin(i)))
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
def degre(i):
"""
i : entier sommet de [0,4]
retourne le nombre de voisins du sommet i
"""
global M
deg_i = 0
for j in range(5):
if M[i][j] > 0:
# ou bien deg_i += (M[i][j] > 0) - confusion bool <-> int
deg_i += 1
return deg_i
for i in range(5):
print('Degré du sommet {} : {}'.format(i, degre(i)))
#--- question 5 ---------------------------------------------------------------print('\n --- Question 5 --- ')
def longueur(L):
"""
L : liste de sommets
renvoie la longueur du trajet décrit par la liste -si possible """
global M
n = len(L)
if n <= 1:
return -1
long = 0
for i in range(n-1):
dist = M[L[i]][L[i+1]]
if dist > 0:
long += dist
else :
return -1
return long
def affiche_longueur(L):
print('Longueur du trajet de {} : {}'.format(L, longueur(L)))
affiche_longueur([0])
affiche_longueur([0,0])
affiche_longueur([0,1,0])
affiche_longueur([0,1,4,0])
affiche_longueur([0,1,3,2,4])
affiche_longueur([0,1,4])
[email protected]
4
Exercice 3
# -*- coding: utf-8 -*#--------------- données de test ----------------------------------------------t1 = [0,1,1,1,0,0,0,1,0,1,1,0,0,0,0]
print('t1 = ', t1)
long_t1 = len(t1)
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
def nombreZeros(t,i):
"""
t : tableau de 0 et 1
i : indice du tableau
renvoie le nombre de 0 consécutifs à partir de t[i] si t[i] = 0
renvoie 0 sinon
"""
n = len(t)
if t[i]:
return 0
else:
s = 1
# contiendra le résultat
j = i+1
while (j < n) and (t[j] == 0):
s += 1
j += 1
return s
t1 =
[0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0]
--- Question 1 --i |
nombreZeros(t1, i) |
0 |
1 |
1 |
0 |
2 |
0 |
3 |
0 |
4 |
3 |
5 |
2 |
6 |
1 |
7 |
0 |
8 |
1 |
9 | 10 | 11 | 12 | 13 | 14 |
0 | 0 | 4 | 3 | 2 | 1 |
--- Question 2 --Le nombre maximal de zéros contigus d'une liste t de longueur 1 est le maximum de la
liste des nombreZeros(t,i) pour i dans [0,n-1]
Nombre maximal de 0 contigus de t1 : 4
--- Question 3 --En notant N la longueur du tableau t, la complexité de nombreZeros est en O(N) et
nombreZerosMax y fait N appels ;la complexité de nombreZerosMax est donc en O(N**2).
--- Question 4 --Idée : parcourir le tableau une seule fois.
Si t[z] = 0, alors le premier 0 de la série suivante est au plus tôt
en t[z + nombreZeros(t, z) + 1].
Conserver la valeur maximale des nombreZeros calculés.
Nombre maximal de 0 contigus de t1 : 4
print('
i | ', end = '')
for i in range(long_t1):
print('{:>2} | '.format(i), end = '')
print()
print('nombreZeros(t1, i) | ', end = '')
for i in range(long_t1):
print('{:>2} | '.format(nombreZeros(t1, i)), end = '')
print()
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
print('Le nombre maximal de zéros contigus d\'une liste t de longueur 1 est\
le maximum de la liste des nombreZeros(t,i) pour i dans [0,n-1]\n')
def nombreZerosMax(t):
"""
t : liste de 0 et 1
renvoie le nombre maximal de 0 contigus de t
"""
n = len(t)
maxi = nombreZeros(t,0)
# contiendra le résultat
for i in range(1,n):
m = nombreZeros(t,i)
[email protected]
5
if m > maxi :
maxi = m
return maxi
print('Nombre maximal de 0 contigus de t1 :', nombreZerosMax(t1))
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
print('En notant N la longueur du tableau t, \
la complexité de nombreZeros est en O(N) et nombreZerosMax
la complexité de nombreZerosMax est donc en O(N**2).')
y fait N appels ;\
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
print('Idée : parcourir le tableau une seule fois.')
print('Si t[z] = 0, alors le premier 0 de la série suivante est au plus tôt')
print('en t[z + nombreZeros(t, z) + 1].')
print('Conserver la valeur maximale des nombreZeros calculés.\n')
#--- calcul du nombre maximal de 0 contigus - algorithme linéaire, en O(N) ----def nombreZerosMax2(t):
"""
t : liste de 0 et 1
Renvoie le nombre maximal de 0 contigus de t
"""
n = len(t)
maxi = 0
# contiendra le résultat
z = 0
while z < n:
if t[z]:
z += 1
# t[z] = 1 ; on passe à l'indice suivant
else:
m = nombreZeros(t, z)
if m > maxi:
maxi = m
z += (m + 1)
# t[z] = 0
# et t[i] = 0 pour i dans [z, z + m -1]
# tandis que t[z + m] = 1
# le premier 0 suivant est au plus tôt t[z + m + 1]
return maxi
print('Nombre maximal de 0 contigus de t1 :', nombreZerosMax2(t1))
[email protected]
6
Exercice 4
# -*- coding: utf-8 -*-
--- Question 1 ---
import math as m
import scipy.misc as spm
--- Question 2 --Listes des P(X=k) et des P(Y=k) pour n = 30, p = 0.1 et k dans [0, 30] :
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
k | P(X=k)
| P(Y=k)
------------------------------------------------0 | 0.049787068367863944
| 0.04239115827521624
1 | 0.14936120510359183
| 0.14130386091738778
2 | 0.22404180765538775
| 0.22765622036689948
3 | 0.22404180765538775
| 0.23608793223234328
4 | 0.16803135574154082
| 0.1770659491742562
5 | 0.10081881344492448
| 0.10230477063401491
6 | 0.05040940672246225
| 0.04736331973796974
7 | 0.02160403145248382
| 0.0180431694239884
8 | 0.008101511794681432
| 0.0057637902326629605
9 | 0.002700503931560477
| 0.0015654738903529075
10 | 0.0008101511794681432 | 0.0003652772410823458
11 | 0.00022095032167312998 | 7.379338203683735e-05
12 | 5.5237580418282494e-05 | 1.298216906203625e-05
13 | 1.2747133942680574e-05 | 1.997256778774803e-06
14 | 2.7315287020029804e-06 | 2.694711526918383e-07
15 | 5.46305740400596e-07
| 3.1937321800513934e-08
16 | 1.0243232632511176e-07 | 3.3268043542202017e-09
17 | 1.8076292880902075e-08 | 3.044134703208064e-10
18 | 3.0127154801503463e-09 | 2.4428241445496697e-11
19 | 4.756919179184757e-10 | 1.7142625575787149e-12
20 | 7.135378768777135e-11 | 1.0476048962981064e-13
21 | 1.0193398241110193e-11 | 5.542883049196318e-15
22 | 1.3900088510604809e-12 | 2.5194922950892144e-16
23 | 1.8130550231223663e-13 | 9.737168290199917e-18
24 | 2.266318778902958e-14 | 3.1555637977499687e-19
25 | 2.71958253468355e-15
| 8.414836793999927e-21
26 | 3.1379798477117877e-16 | 1.7980420499999867e-22
27 | 3.48664427523532e-17
| 2.9597400000000102e-24
28 | 3.735690294894985e-18 | 3.523499999999959e-26
29 | 3.864507201615502e-19 | 2.7000000000000107e-28
30 | 3.864507201615502e-20 | 1.0000000000000017e-30
def Px(k, n, p):
"""
k : entier naturel
n : entier naturel >0
p : float de ]0, 1[
La v.a.r X suit une loi de Poisson P(n*p)
Renvoie P(X = k)
"""
np = n * p
return (np)**k * m.exp(- np) / m.factorial(k)
n, p = 30, 0.1
lX = [Px(k, n, p) for k in range(n + 1)]
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
def Py(k, n, p):
"""
n : entier naturel >0
k : entier naturel de [0,n]
p : float de ]0, 1[
La v.a.r Y suit une loi binomiale B(n, p)
Renvoie P(Y = k)
"""
return spm.comb(n, k) * p**k * (1-p)**(n-k)
lY = [Py(k, n, p) for k in range(n + 1)]
print('Listes des P(X=k) et des P(Y=k) pour n = {0}, p = {1}\
et k dans [0, {0}] :\n'.format(n, p))
print(' k | P(X=k)
| P(Y=k)')
print('-------------------------------------------------')
for k in range(n + 1):
print('{:>2} | {:<22} | {}'.format(k, lX[k], lY[k]))
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
def Ecart(n, p):
"""
n : entier naturel >0
p : float de ]0, 1[
La v.a.r. X suit la loi de Poisson P(n*p)
La v.a.r. Y suit la loi binomiale B(n, p)
Renvoie le plus grand des nombres |P(Y=k)-P(X=k)| pour k dans [0, n]
"""
maxi = 0
# contiendra le résultat
[email protected]
--- Question 3 --Ecart(30, 0.1) = 0.01204612457695553
--- Question 4 --N(Ecart(30, 0.1), 0.1) = 1
--- Question 5 --N(0.008, 0.075) = 1
N(0.005, 0.075) = 124
N(0.008, 0.1) = 71
Dans le cas p = 0.1 et e = 0.005, la réponse du programme (à l'appel de la ligne 19)
est :
"OverflowError: long int too large to convert to float".
Aucune valeur de n telle que n! soit plus petit que le plus grand float codable sur 64
bits (n <= 170) ne satisfait Ecart(n, 0.1) < 0.005.
7
for k in range(n+1):
distance = abs(Px(k, n, p) - Py(k, n, p))
if distance > maxi:
maxi = distance
return maxi
eps = Ecart(n, p)
print('Ecart({}, {}) = {}'.format(n, p, eps))
float(m.factorial(170))= 7.257415615307999e+306
Cependant, on considère quelquefois que de bonnes conditions d'approximation de B(n,p)
par P(n*p)
sont : p <= 0.1, n >= 30 et n * p <= 15.
Pour p = 0.1, il suffirait que n soit dant [30, 150].
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
def N(e, p):
"""
e : float > 0
p : float de ]0,1[
Renvoie le plus petit entier naturel n > 0 tel que Ecart(n, p) <= e
"""
n = 1
while Ecart(n, p) > e:
n += 1
return n
print('N(Ecart({0}, {1}), {1}) = {2}'.format(n, p, N(eps, p)))
#--- question 5 ---------------------------------------------------------------print('\n --- Question 5 --- ')
for (p, e) in [(0.075, 0.008), (0.075, 0.005), (0.1, 0.008)]:
print('N({}, {}) = {}'.format(e, p, N(e, p)))
print('Dans le cas p = 0.1 et e = 0.005, la réponse du programme\
(à l\'appel de la ligne 19) est : \n\
"OverflowError: long int too large to convert to float".')
print('Aucune valeur de n telle que n! soit plus petit\
que le plus grand float codable sur 64 bits (n <= 170)\
ne satisfait Ecart(n, 0.1) < 0.005.')
print('float(m.factorial(170))=',float(m.factorial(170)) )
print('\nCependant, on considère quelquefois que de bonnes conditions\
d\'approximation de B(n,p) par P(n*p)')
print('sont : p <= 0.1, n >= 30 et n * p <= 15.')
print('Pour p = 0.1, il suffirait que n soit dant [30, 150].')
Exercice 5
# -*- coding: utf-8 -*# Katia Barré - Lycée Lesage Vannes
--- Question 1 ---
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as spo
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
[email protected]
8
def g(x):
if (x >= 0) and (x < 1):
return x
elif (x >= 1) and (x < 2):
return 1
g_v = np.vectorize(g)
lx = np.arange(0, 1.99, 0.01)
gx = g_v(lx)
plt.figure(1)
plt.plot(lx, gx)
plt.xlabel('$x$')
plt.ylabel('$g(x)$')
plt.axis([-0.1, 2.1, -0.1, 1.1])
plt.title('Graphe de $g$')
plt.grid()
plt.show()
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
def f(x):
if (x >=0)
return
elif (x >=
return
--- Question 2 ----- Question 3 ---
and (x < 2):
g(x)
2):
(x**0.5) * f(x-2)
f_v = np.vectorize(f)
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
lx1 = np.linspace(0, 6, 500)
fx = f_v(lx1)
plt.figure(2)
plt.plot(lx1, fx, linestyle = 'None', marker = '.', ms = 3)
plt.xlabel('$x$')
plt.ylabel('$f(x)$')
plt.axis([-0.1, 6.1, -0.1, 5.1])
plt.title('Graphe de $f$')
plt.grid()
plt.show()
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
print('On lit graphiquement que alpha est dans [5, 6], intervalle sur lequel
f est croissante.')
# --- programmons la méthode de dichotomie
eps = 0.01
a, b = 5, 6
fa, fb = f(a), f(b)
while b-a > eps:
[email protected]
--- Question 4 --On lit graphiquement que alpha est dans [5, 6], intervalle sur lequel f est croissante.
9
c = (a+b) / 2
fc = f(c)
if f(c) > 4:
b = c
fb = fc
else :
a = c
fa = fc
print('Une valeur approchée à {} près de la plus petite valeur alpha > 0\
telle que f(alpha) > 4 est :\n {}\n'.format(eps, b))
Une valeur approchée à 0.01 près de la plus petite valeur alpha > 0 telle que f(alpha)
> 4 est :
5.125
f(alpha-0.01) = 3.9916443979893805, f(alpha) = 4.001952648395531
(Recherche du zéro de f-4 dans [5, 5.5] par méthode de dichotomie de scipy :
5.123105625617427 ).
print('f(alpha-{}) = {}, f(alpha) = {}\n\n'.format(eps, f(b - eps), f(b)))
print('(Recherche du zéro de f-4 dans [5, 5.5] par méthode de dichotomie de
scipy :')
print(spo.bisect(lambda x : f(x) - 4, 5, 5.5), ').')
Exercice 6
# -*- coding: utf-8 -*#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
print('La fonction d retourne la liste croissante des diviseurs de l\'entier n')
def d(n):
"""
n : entier naturel non nul
Renvoie la liste croissante des diviseurs de l\'entier n
"""
L = [1]
for nombre in range(2, n+1):
if n % nombre == 0:
L.append(nombre)
return L
for n in [4, 9, 10, 11]:
print('d({}) = {}'.format(n, d(n)))
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
def DNT(n):
"""
n : entier naturel non nul
Renvoie la liste croissante des diviseurs "non-trivaux" de l\'entier n
"""
L = []
for nombre in range(2, n):
if n % nombre == 0:
L.append(nombre)
return L
# ou bien : return d(n)[1:-1]
--- Question 1 --La fonction d retourne la liste croissante des diviseurs de l'entier n
d(4) = [1, 2, 4]
d(9) = [1, 3, 9]
d(10) = [1, 2, 5, 10]
d(11) = [1, 11]
--- Question 2 --DNT(4) = [2]
DNT(9) = [3]
DNT(10) = [2, 5]
DNT(11) = []
--- Question 3 --sommeCarresDNT(4) = 4
sommeCarresDNT(9) = 9
sommeCarresDNT(10) = 29
sommeCarresDNT(11) = 0
--- Question 4 --Les nombres <= 1000 et égaux à la somme de leurs diviseurs non triviaux sont :
4, 9, 25, 49, 121, 169, 289, 361, 529, 841, 961,
On peut conjecturer, à la lecture de cette liste, que les nombres égaux à la somme
de leurs diviseurs non triviaux sont les carrés des nombres premiers.
for n in [4, 9, 10, 11]:
print('DNT({}) = {}'.format(n, DNT(n)))
[email protected]
10
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
def sommeCarresDNT(n):
"""
n : entier naturel non nul
Renvoie la somme des carrés des diviseurs "non-trivaux" de l\'entier n
"""
s = 0
for nombre in range(2, n):
if n % nombre == 0:
s += nombre**2
return s
for n in [4, 9, 10, 11]:
print('sommeCarresDNT({}) = {}'.format(n, sommeCarresDNT(n)))
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
maxi = 1000
print('Les nombres <= {} et égaux à la somme de leurs \
diviseurs non triviaux sont :'.format(maxi))
for i in range(2, maxi + 1):
if i == sommeCarresDNT(i):
print(i, end = ', ')
print('\n\nOn peut conjecturer, à la lecture de cette liste,\
que les nombres égaux à la somme de leurs diviseurs non triviaux sont\
les carrés des nombres premiers.')
Exercice 7
# -*- coding: utf-8 -*#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
ord_a = ord('a')
lettres = ''
for i in range(ord_a, ord_a + 26):
lettres += chr(i)
# ou bien : lettres = ''.join([chr(ord_a + i) for i in range(26)])
print(lettres)
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
def decalage(n):
"""
n : entier
Renvoie l'alphabet après décalage de n vers la gauche
"""
global lettres
decale = ''
[email protected]
--- Question 1 --abcdefghijklmnopqrstuvwxyz
--- Question 2 --decalage(1) = bcdefghijklmnopqrstuvwxyza
decalage(3) = defghijklmnopqrstuvwxyzabc
--- Question 3 --indices(e, "phrase originale avec des e ") =
indices(y, "phrase originale avec des e ") =
--- Question 4 --codage(3, 'oralensam') :
dico(0) =
'k': 'k',
's': 's',
'z': 'z',
dico(3) =
'k': 'n',
's': 'v',
'z': 'c',
[5, 15, 19, 23, 26]
[]
rudohqvdp
{'c': 'c', 'b': 'b', 'a': 'a', 'g': 'g', 'f': 'f', 'e': 'e', 'd': 'd',
'j': 'j', 'i': 'i', 'h': 'h', 'o': 'o', 'n': 'n', 'm': 'm', 'l': 'l',
'r': 'r', 'q': 'q', 'p': 'p', 'w': 'w', 'v': 'v', 'u': 'u', 't': 't',
'y': 'y', 'x': 'x'}
{'c': 'f', 'b': 'e', 'a': 'd', 'g': 'j', 'f': 'i', 'e': 'h', 'd': 'g',
'j': 'm', 'i': 'l', 'h': 'k', 'o': 'r', 'n': 'q', 'm': 'p', 'l': 'o',
'r': 'u', 'q': 't', 'p': 's', 'w': 'z', 'v': 'y', 'u': 'x', 't': 'w',
'y': 'b', 'x': 'a'}
11
for i in range(26):
decale += lettres[(i + n) % 26]
return decale
codage_dico(3, 'oralensam') :
# ou bien :
# global ord_a
# return ''.join([chr(ord_a + (i + n) % 26) for i in range(26)])
--- Question 5 --Pour décoder un mot codé de décalage n, il suffit d'appliquer un décalage de -n
(ou de 26-n, ...)
codage(-3, codage(3, 'oralensam')): oralensam
codage(23, codage(3, 'oralensam')): oralensam
for i in [1, 3]:
print('decalage({}) = {}'.format(i, decalage(i)))
rudohqvdp
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
def indices(x, phrase):
"""
x : caractère
phrase : chaîne de caractères
Retourne la liste des indices de x dans la phrase (vide si x n'y figure pas)
"""
ind = []
long = len(phrase)
for i in range(long):
if phrase[i] == x:
ind.append(i)
return ind
ee, pphrase = 'e', "phrase originale avec des e "
print('indices({}, "{}") = '.format(ee, pphrase), indices(ee, pphrase))
yy = 'y'
print('indices({}, "{}") = '.format(yy, pphrase), indices(yy, pphrase))
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
def codage(n, phrase):
"""
n : entier
phrase : chaîne de caractères
Renvoie la chaîne phrase codée avec un décalage de n lettres
"""
global ord_a
if n % 26 == 0:
return phrase
else:
long = len(phrase)
lettre_codee = ''
for lettre in phrase:
lettre_codee += chr(ord_a + (ord(lettre) - ord_a + n) % 26)
return lettre_codee
print("codage(3, 'oralensam') : ", codage(3, 'oralensam'), '\n')
#---- seconde idée : usage d'un dictionnaire
def dico(n):
global ord_a
return {chr(ord_a + i) : chr(ord_a + (i + n) % 26) for i in range(26)}
[email protected]
12
print('dico(0) = ', dico(0))
print('dico(3) = ', dico(3), '\n')
def codage_dico(n, phrase):
"""
n : entier
phrase : chaîne de caractères
Renvoie la chaîne phrase codée avec un décalage de n lettres
"""
if n % 26 == 0:
return phrase
else:
dico_n = dico(n)
return ''.join(dico_n[lettre] for lettre in phrase)
print("codage_dico(3, 'oralensam') : ", codage_dico(3, 'oralensam'))
#--- question 5 ---------------------------------------------------------------print('\n --- Question 5 --- ')
print('Pour décoder un mot codé de décalage n, il suffit d\'appliquer un décalage
de -n (ou de 26-n, ...)')
print("codage(-3, codage(3, 'oralensam')): ", codage(-3, codage(3, 'oralensam')))
Exercice 8
# -*- coding: utf-8 -*import numpy as np
import matplotlib.pyplot as plt
--- Question 1 ----- Question 2 ---
M, m = 20, 10
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
def f(c):
"""
c : nombre
On considère la suite récurrente définie par :
u_0 = 0 et u_{n+1} = u_n **2 + c pour tout entier naturel n
Renvoie : le plus petit entier k de [0, m] tel que |u_k| > M s'il existe
m + 1 sinon
"""
global M, m
u = 0
k = 0
while k < m:
u = u**2 + c
k += 1
if abs(u) > M:
return k
# renvoie k de [0, m] tel | u_k| > M
return m + 1
# renvoie m + 1
#--- question 2 ---------------------------------------------------------------Katia.barre@laposte.net
13
print('\n --- Question 2 --- ')
f_v = np.vectorize(f)
LX = np.linspace(-2, 2, 401)
fX = f_v(LX)
--- Question 3 ----- Question 4 --Pour augmenter la résolution, on peut augmenter les paramètres M, m et K.
plt.figure(1)
plt.plot(LX, fX, linestyle = 'None', marker = '.', ms = 3)
plt.axis([-2.1, 2.1, -0.1, m + 1.1])
plt.grid()
plt.xlabel('$c$')
plt.ylabel('$f(c)$')
plt.title('Graphe de $f$')
plt.show()
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
K = 101
x = np.linspace(-2, 0.5, K)
y = np.linspace(-1.1, 1.1, K)
X, Y = np.meshgrid(x, y)
tableau_valeurs = f_v(X + 1j * Y)
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
plt.figure(2)
plt.imshow(tableau_valeurs, extent = [-2, 0.5,-1.1 ,1.1])
plt.title('$M = $ {}, $m$ = {}, $K$ = {}'.format(M, m, K))
plt.axis('scaled')
plt.show()
print('Pour augmenter la résolution, on peut augmenter les paramètres M, m et K.')
#--- tests --------------------------------------------------------------------def f1(c, m, M):
u = 0
k = 0
while k < m:
u = u**2 + c
k += 1
if abs(u) > M:
return k
return m + 1
f1_v = np.vectorize(f1)
def resolution(m, M, K):
"""
m : entier limite l'indice de la suite
M : limite le module de la suite
K : nombre de points sur les axes
Trace l'image du code du tableau f(x + jy)
où x dans [-2, 0.5] (K valeurs)
y dans [-1.1, 1.1] (Ka valeurs)
f fonction qui à un nombre complexe c
associe le plus petit entier k de [0, m] tel que |u_k| > M s'il existe
[email protected]
14
m + 1 sinon
avec (u_n) la suite récurrente définie par :
u_0 = 0 et u_{n+1} = u_n **2 + c pour tout entier naturel n
"""
x = np.linspace(-2, 0.5, K)
y = np.linspace(-1.1, 1.1, K)
X, Y = np.meshgrid(x, y)
tableau_valeurs = f1_v(X + 1j * Y, m, M)
plt.imshow(tableau_valeurs, extent = [-2, 0.5,-1.1 ,1.1])
plt.title('$M = $ {}, $m$ = {}, $K$ = {}'.format(M, m, K))
plt.axis('scaled')
plt.show()
resolution(20, 30, 200)
resolution(30,50, 500)
Exercice 9
# -*- coding: utf-8 -*# Katia Barré - Lycée Lesage Vannes
import numpy as np
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
R = np.arange(1, 7).reshape(2, 3)
print('R = \n', R)
S = np.arange(1, 10).reshape(3, 3)
[email protected]
--- Question 1 --R =
[[1 2 3]
[4 5 6]]
S =
[[1 2 3]
[4 5 6]
[7 8 9]]
--- Question 2 --15
print('S = \n', S)
test(R) =
test(S) =
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
def test(M):
"""
M : matrice
Renvoie n si M est carrée d'ordre n
0 sinon
"""
n = len(M)
if n == len(M[0]):
return n
else:
return 0
print('test(R) = ', test(R))
print('test(S) = ', test(S))
0
3
--- Question 3 --M1 =
[[ 0.33333333 0.16666667
[ 0.16666667 0.33333333
[ 0.16666667 0.16666667
[ 0.16666667 0.16666667
[ 0.16666667 0.16666667
test(M1) = 5
0.16666667
0.16666667
0.33333333
0.16666667
0.16666667
0.16666667
0.16666667
0.16666667
0.33333333
0.16666667
0.16666667]
0.16666667]
0.16666667]
0.16666667]
0.33333333]]
--- Question 4 --La matrice est symétrique réelle donc toutes ses valeurs propres sont réelles.
Valeurs propres de M1 :
[ 1.
0.16666666 0.16666667 0.16666667 0.16666667]
--- Question 5 --dansIntervalle(valp_M1, 0, 1) =
True
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
fichier = open('data/ex_009.txt', 'r')
matrice = []
for ligne in fichier:
matrice.append(list(eval(ligne)))
fichier.close()
M1 = np.array(matrice)
print('M1 = \n', M1)
print('test(M1) = ', test(M1))
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
print('La matrice est symétrique réelle donc toutes ses valeurs propres sont
réelles.')
valp_M1, vecp_M1 = np.linalg.eig(M1)
print('Valeurs propres de M1 : \n ', valp_M1)
#--- question 5 ---------------------------------------------------------------print('\n --- Question 5 --- ')
def dansIntervalle(L, a,
"""
L : liste de nombres
a, b : float
Renvoie True si tous
False sinon
"""
for x in L:
if abs(x.imag) >
return False
return True
b):
complexes
les éléments de L sont dans [a, b]
1e-16 or x.real > b or x.real < a:
print('dansIntervalle(valp_M1, 0, 1) = ', dansIntervalle(valp_M1, 0, 1))
[email protected]
16
Exercice 10
# -*- coding: utf-8 -*# Katia Barré - Lycée Lesage Vannes
import random
--- Question 1 --Liste L = [0, 0, 4, 0, 4, 0, 3, 3, 1, 1, 2, 4, 3, 1, 3, 4, 0, 1, 3, 3]
Comptage(L, 5) = [5, 4, 1, 6, 4]
--- Question 2 ---
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
def comptage(L, N):
"""
N : entier > 10
L : liste d'entiers de [0, N - 1]
Renvoie une liste P telle que P[k] est le nombre d'occurence de k dans L
"""
P = [0] * N
for x in L:
P[x] += 1
return P
--- Question 3 --L = [0, 0, 4, 0, 4, 0, 3, 3, 1, 1, 2, 4, 3, 1, 3, 4, 0, 1, 3, 3]
tri(L, 5) = [0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4]
--- Question 4 --En notant M = len(L),
La fonction comptage est de complexité O(M + N), de même que la fonction tri.
Le tri par insertion est de complexité O(N^2).
Le tri par fusion est de complexité O(N ln(N)).
N = 5
mL = [random.randint(0, N - 1) for i in range(20)]
print('Liste L = ', mL)
print('Comptage(L, 5) = ', comptage(mL, N))
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
def tri(L, N):
"""
N : entier
L : liste d'entiers de [0, N - 1]
Renvoie la liste L triée par ordre croissant
"""
P = comptage(L, N)
Q = []
for i in range(N):
for k in range(P[i]):
Q.append(i)
return Q
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
print('
L = ', mL)
print('tri(L, 5) = ', tri(mL, N))
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
print('En notant M = len(L),')
print('La fonction comptage est de complexité O(M + N), de même que la
fonction tri.')
print('Le tri par insertion est de complexité O(N^2).')
print('Le tri par fusion est de complexité O(N ln(N)).')
[email protected]
17
Exercice 11
--- Question 1 --# -*- coding: utf-8 -*import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as integ
--- Question 2 ----- Question 3 ---
b, w = 0.5, 6.0
#--- question 1 ---------------------------------------------------------------print('\n --- Question 1 --- ')
def p(t):
global b, w
wt = w * t
return np.cos(t) + b * np.cos(wt), np.sin(t) + b * np.sin(wt)
def v(t):
global
wt = w
bw = b
return
b, w
* t
* w
-np.sin(t) - bw * np.sin(wt), np.cos(t) + bw * np.cos(wt)
def a(t):
global b, w
wt = w * t
bw2 = b * w**2
return -np.cos(t) - bw2 * np.cos(wt), -np.sin(t) - bw2 * np.sin(wt)
#--- question 2 ---------------------------------------------------------------print('\n --- Question 2 --- ')
dt = np.pi * 0.01
t = np.arange(-np.pi, np.pi + dt, dt)
pt = p(t)
plt.figure(1)
plt.plot(pt[0], pt[1])
plt.xlabel('$x(t)$')
plt.ylabel('$y(t)$')
plt.title('Trajectoire')
plt.grid()
plt.axis('scaled')
--- Question 4 ----- Question 5 ---
plt.show()
#--- question 3 ---------------------------------------------------------------print('\n --- Question 3 --- ')
#--- question 4 ---------------------------------------------------------------print('\n --- Question 4 --- ')
def c(t):
[email protected]
18
x, y = p(t)
x1, y1 = v(t)
x2, y2 = a(t)
d = (x1**2 + y1**2) / (x1 * y2 - y1 * x2)
return x - d * y1, y + d * x1
ct = c(t)
plt.figure(2)
plt.plot(pt[0], pt[1])
plt.plot(ct[0], ct[1])
#--- tracé de quelques segments [p(t)c(t)]
for u in np.linspace(-np.pi + dt, -dt, 5):
xp, yp = p(u)
xc, yc = c(u)
plt.plot([xp, xc], [yp, yc], marker = 'o', color = 'r')
plt.grid()
plt.legend(['Point $p$', 'Centre de courbure $c$'])
plt.title('Trajectoire et développée')
plt.axis('scaled')
plt.show()
#--- question 6 ---------------------------------------------------------------print('\n --- Question 6 --- ')
def distance(A, B):
"""
A et B : deux points du plan (couples de float)
retourne la longueur du segment [AB]
"""
xA, yA = A
xB, yB = B
return ((xB - xA)**2 + (yB - yA)**2)**0.5
--- Question 6 ---
def longueur(N):
"""
N : entier naturel > 0
Renvoie la longueur de la ligne polygonale reliant les points p(t)
pour t dans [-pi, pi] pour le pas de discrétisation delta_t = pi / N
"""
t = np.linspace(-np.pi, np.pi, 2 * N)
long = 0
A = p(t[0])
for i in range(1, 2 * N):
B = p(t[i])
long += distance(A, B)
A = B
return long
longueur_v = np.vectorize(longueur)
#---------- tracé de la longueur de la ligne polyngonale en fonction du nombre de points
n = range(20, 301, 3)
[email protected]
19
long_n = longueur_v(n)
plt.plot(n, long_n, linestyle = 'None', marker = 'o', ms = 3)
norme_v = lambda u : (1 + (b * w)**2 + 2 * b * w * np.cos((w-1) * u))**0.5
longueur_p, err = integ.quad(norme_v, -np.pi, np.pi)
plt.plot([20, 300], [longueur_p, longueur_p], color = 'r')
plt.xlabel('$N$')
plt.ylabel('Longueur en fonction de $N$')
plt.legend(['Longueur du polygône avec $2N$ points', 'Longueur de la courbe'],\
loc = 'lower right')
plt.grid()
plt.show()
[email protected]
20

Documents pareils