$\require{color}$ $\require{xcolor}$ $\newcommand{\myfbox}[1]{\fcolorbox{red}{white}{$\textrm{#1}$}}$ $\require{stmaryrd}$ $\newcommand{\ient}{[\![}$ $\newcommand{\fient}{]\!]}$ $\newcommand{\R}{\mathbb R}$ $\newcommand{\K}{\mathbb K}$ $\newcommand{\N}{\mathbb N}$ $\newcommand{\C}{\mathbb C}$ $\newcommand{\id}{\operatorname{Id}}$ $\newcommand{\mat}{\operatorname{mat}}$ $\newcommand{\sp}{\operatorname{Sp}}$ $\newcommand{\In}{\operatorname{I}}$ $\newcommand{\vect}{\operatorname{Vect}\ }$ $\newcommand{\rg}{\operatorname{rg}}$ $\newcommand{\tr}{\operatorname{Tr}}$ $\newcommand{\dis}{\displaystyle}$ $\renewcommand{\Im}{\operatorname{Im}}$ $\newcommand{\im}{\operatorname{Im}}$ $\newcommand{\bordermatrix}[3]{ \begin{matrix} \begin{matrix}#1\end{matrix} & \\ #3 & \hspace{-1em} \begin{matrix}#2\end{matrix} \end{matrix}}$ $\newcommand{\fonction}[5]{#1\ \colon \left\{\begin{array}{ccl}#2 & \longrightarrow & #3\\#4 & \longmapsto & #5\end{array}\right.}$ $\newcommand{\revdots}{\mathinner{\mkern1mu\raise1pt{\kern7pt\hbox{.}}\mkern2mu\raise4pt\hbox{.}\mkern2mu\raise7pt\hbox{.}\mkern1mu}}$ $\newcommand{\q}[1]{{\bf Q #1}\rhd}$
import numpy as np
Toutes les questions sont sur 3 points, sauf la question 4 de l'exercice 1, qui est sur 1 point. Ainsi, votre note brute est sur 28.
Bien retravailler ce corrigé, notamment pour comprendre ce que l'on entendait par "adapter la fonction précédente" : il ne fallait pas réutiliser la fonction précédente !
$\q{1}$ On peut par exemple écrire la fonction suivante :
def pell(n):
if n == 0:
return n
else:
u, v = 0, 1
for k in range(n - 1):
u, v = v, u + 2 * v
return v
pell(0)
0
pell(1)
1
pell(4)
12
[pell(n) for n in range(10)]
[0, 1, 2, 5, 12, 29, 70, 169, 408, 985]
$\q{2}$ On adapte la fonction précédente de la manière suivante :
def rapport(n):
assert n > 0, "division par 0"
u, v = 0, 1
for k in range(n): # attention à la gestion des indices !
u, v = v, u + 2 * v
return v / u
rapport(0)
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-8-433d49b550ff> in <module> ----> 1 rapport(0) <ipython-input-7-41ea5f6a7698> in rapport(n) 1 def rapport(n): ----> 2 assert n > 0, "division par 0" 3 u, v = 0, 1 4 for k in range(n): # attention à la gestion des indices ! 5 u, v = v, u + 2 * v AssertionError: division par 0
rapport(2)
2.5
rapport(10)
2.41421362489487
$\q3$ On adapte encore la fonction précédente de la manière suivante :
def argent(eps):
u, v, w = 1, 2, 5
r, s = 2, 2.5
while abs(s - r) >= eps:
u, v, w = v, w, 2 * w + v
r, s = v / u, w / v
return r
argent(1)
2
argent(0.01)
2.4166666666666665
$\q4$ On utilise la fonction précédente :
round(argent(1e-5),4)
2.4142
On peut conjecturer que $\myfbox{$\varphi_2 = 1+\sqrt2$.}$
$\q1$ On peut par exemple proposer la fonction suivante :
def min1D(L):
assert len(L) > 0
m, ind = L[0], 0
for i in range(1, len(L)):
if L[i] <= m:
m, ind = L[i], i
return m, ind
min1D([3,4,3,6,2,5,2,8])
(2, 6)
$\q2$ On utilise des listes par compréhension (ce qui a également l'avantage de ne pas provoquer d'effet de bord) :
def zero1D(L):
assert len(L) > 0
m, ind = min1D(L)
return [l - m for l in L]
zero1D([4, 1, 6, 5])
[3, 0, 5, 4]
$\q3$ On utilise la fonction précédente :
def Lzero2D(L):
assert len(L)>0
return [zero1D(ligne) for ligne in L]
L_ex = [[1, 2, 6, 3],
[6, 12, 3, 42],
[404, 2, 5, 1]]
Lzero2D(L_ex)
[[0, 1, 5, 2], [3, 9, 0, 39], [403, 1, 4, 0]]
np.matrix(_) # pour mieux visualiser la matrice obtenue
matrix([[ 0, 1, 5, 2], [ 3, 9, 0, 39], [403, 1, 4, 0]])
$\q4$ Cette question est plus difficile ; on peut par exemple transposer la matrice pour pouvoir utiliser la fonction Lzero2D(L)
:
def Czero2D(L):
assert len(L)>0
T = [[L[j][i] for j in range(len(L))] for i in range(len(L[0]))]
T = Lzero2D(T)
return [[T[j][i] for j in range(len(T))] for i in range(len(T[0]))]
Czero2D(L_ex)
[[0, 0, 3, 2], [5, 10, 0, 41], [403, 0, 2, 0]]
np.matrix(_)
matrix([[ 0, 0, 3, 2], [ 5, 10, 0, 41], [403, 0, 2, 0]])
$\q1$ On peut utiliser un compteur :
def repete(S, c):
cpt = 0
for lettre in S:
if c == lettre:
cpt += 1
if cpt == 2:
return True # on arrete dès maintenant
return False # atteint que si cpt reste < 2
repete("bonjour", "a")
False
repete("bonjour", "j")
False
repete("bonjour", "o")
True
$\q2$ On adapte la fonction précédente afin de créer un dictionnaire et de le mettre à jour progressivement :
def dict_repete(S):
dico = {}
for lettre in S:
if lettre in dico:
dico[lettre] = True
else:
dico[lettre] = False
return dico
dict_repete("buongiorno")
{'b': False, 'u': False, 'o': True, 'n': True, 'g': False, 'i': False, 'r': False}
Variante : on peut ne mettre à jour la valeur de dico[lettre]
que quand elle vaut False
:
def dict_repete(S):
dico = {}
for lettre in S:
if lettre not in dico:
dico[lettre] = False
elif not dico[lettre]:
dico[lettre] = True
return dico
dict_repete("buongiorno")
{'b': False, 'u': False, 'o': True, 'n': True, 'g': False, 'i': False, 'r': False}