Ressources mathématiques > Base de données d'exercices > Exercices de théorie des graphes et d'algorithmique >
Exercices corrigés - Algorithmes : écrire et analyser des algorithmes en maths
Algorithmes en analyse
Enoncé 

On note $H_n$ la somme $H_n=\sum_{k=1}^n \frac 1k$. On admet
que $(H_n)$ tend vers $+\infty$. Écrire un algorithme qui détermine le plus petit entier
$n$ tel que $H_n$ dépasse un réel $a$ donné.
Exercice 2 - Pas cette limite ! ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Pour $n\geq 1$, on pose
$$S_n=\sum_{k=1}^n \frac 1{k^3}.$$
On admet que $(S_n)$ converge vers un réel appelé constante d'Apéry qui vaut environ $1,\!20205690316$. Écrire un algorithme qui prouve que $(S_n)$ ne converge pas vers
$$\beta=\frac{\pi^3}{\sqrt[6]{294542216}}\simeq 1,\!20205690198.$$
Exercice 3 - Maximum d'une suite ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

On pose $p=0,9$, et on admet que la fonction $x\mapsto p^x-\frac{1}x$ est croissante sur $[1,a]$ et décroissante sur $[a,+\infty[$, où $a>1$. Écrire un algorithme permettant de déterminer
pour quelle valeur de l'entier $r$ le nombre $p^r-\frac 1r$ est maximal.
Exercice 4 - Encadrement d'intégrale ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Soit $f:[0,1]\to\mathbb R$ une fonction croissante. Pour $n\geq 1$, on pose
$$U_n=\frac 1n\sum_{k=0}^{n-1}f(k/n)\textrm{ et }V_n=\frac 1n\sum_{k=1}^{n}f(k/n).$$
- Démontrer que, pour tout $n\geq 1$, on a $U_n\leq \int_0^1 f(x)dx\leq V_n$.
- On admet que $(U_n)$ et $(V_n)$ convergent vers $\int_0^1 f(x)dx$. Écrire un algorithme donnant une valeur approchée de $\int_0^1 e^{x^2}dx$ à $10^{-3}$ près.
Exercice 5 - Des limites de l'informatique ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Pour $n\geq 0$, on considère la suite $(I_n)$ définie par
$$I_n=\int_0^1 e^x (1-x)^n dx.$$
- Calculer $I_0$ puis démontrer que, pour tout $n\geq 0$, $I_{n+1}=(n+1)I_n-1$.
- Écrire sous Python une fonction permettant de calculer $I_n$ en utilisant la relation de récurrence obtenue précédemment. Exécuter cette fonction. Quelle conjecture peut-on formuler sur la nature de la suite $(I_n)$?
- Démontrer que $(I_n)$ est une suite décroissante, puis qu'elle est convergente. Quelle est sa limite? Comparer avec votre conjecture.
- Pour $a\in \mathbb R$, on définit une suite $(J_n)$ par $J_{n+1}=(n+1)J_n-1$ et $J_0=a$. Démontrer que, pour tout $n\in\mathbb N$, $J_{n+1}-I_{n+1}=(n+1)(J_n-I_n)$.
- En déduire, suivant la valeur de $a$, le comportement de la suite $(J_n)$.
- Expliquer le phénomène conduisant à la conjecture formulée à la question 2.
Exercice 6 - Algorithme de trichotomie ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Soit $f:[a,b]\to\mathbb R$ une fonction convexe. On pose
$a_0=a$, $a_1=(2a+b)/3$, $a_2=(a+2b)/3$ et $a_3=b$. On pose également
$$\mu=\frac{f(a_2)-f(a_1)}{a_2-a_1}.$$
- On suppose que $\mu\leq 0$. Justifier que $f$ atteint son minimum sur $[a,b]$ sur l'intervalle $[a_1,a_3]$.
- On suppose que $\mu>0$. Justifier que $f$ atteint son minimum sur $[a,b]$ sur l'intervalle $[a_0,a_2]$.
- Écrire une fonction sous Python permettant de donner un encadrement d'amplitude $\veps$ du minimum de la fonction convexe $x\mapsto e^x+x^2$, sachant que ce minimum se situe dans l'intervalle $[-1,0]$.
Algorithmes en arithmétique
Enoncé 

Écrire une fonction qui prend en entrée un entier naturel $a$ et retourne
cet entier écrit à l'envers. Par exemple, si $a=1234$, la fonction
devra retourner $a=4321$. On pourra utiliser les fonctions quotient(n,p)
et reste(n,p) qui donnent le quotient et le reste de la division de n par p.
Exercice 8 - Algorithme pour compter le nombre de nombres premiers inférieurs à un entier $n$ ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

- Écrire une fonction $\textrm{divise}(p,q)$ d'argument deux entiers naturels non nuls $p$ et $q$ et renvoyant True si $p$ divise $q$, et False sinon.
- Écrire une fonction $\textrm{estpremier}(p)$ d'argument un entier naturel $p$, renvoyant $1$ si $p$ est premier, et renvoyant $0$ sinon.
- Écrire une fonction $\phi(n)$ d'argument un entier naturel $n$ et renvoyant le nombre de nombres premiers inférieurs ou égaux à $n$.
Exercice 9 - Équation de Pell-Fermat ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

On considère l'équation $x^2-2y^2=1$ d'inconnues $x,y\in\mathbb N^*$.
Écrire un algorithme permettant de déterminer toutes les solutions de cette équation pour lesquelles
$y\leq 100$.
Enoncé 

- Écrire 21 en base 2.
- Proposer un algorithme qui prend en entrée un entier $n$ et retourne son écriture en base 2.
Exercice 11 - Algorithme de décomposition en produit de facteurs premiers ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Le but de l'exercice est d'écrire un algorithme pour décomposer un entier en produit de nombres premiers. Si $n$ est un entier naturel non nul et $p$ est un nombre premier, on note $v_p(n)$ le plus grand entier $k$ tel que $p^k$ divise $n$. Si $p$ ne divise pas $n$, on pose $v_p(n)=0$. L'entier $v_p(n)$ s'appelle la valuation $p$-adique de $n$.
- Écrire une fonction booléenne $\textrm{estPremier}(n)$ qui prend en argument un entier naturel non nul $n$ et qui renvoie le booléen $\textrm{True}$ si $n$ est premier et la booléen $\textrm{False}$ sinon. On pourra utiliser le critère suivant : un entier $n\geq 2$ qui n'est divisible par aucun entier $d\geq 2$ tel que $d^2\leq n$ n'est pas premier.
- En déduire une fonction $\textrm{liste_premiers}(n)$ qui prend en argument un entier naturel non nul $n$ et renvoie la liste des nombres premiers inférieurs ou égaux à $n$.
- Pour calculer la valuation 2-adique de 40, on peut utiliser la méthode suivante:
- 40 est divisible par 2 et le quotient vaut 20
- 20 est divisible par 2 et le quotient vaut 10
- 10 est divisible par 2 et le quotient vaut 5
- 5 n'est pas divisible par 2.
Écrire une fonction $\textrm{valuation_p_adique(n, p)}$ non récursive qui implémente cet algorithme. Elle prend en arguments un entier naturel $n$ non nul et un nombre premier $p$ et renvoie la valuation $p$-adique de $n$. Par exemple, puisque $40=2^3\times 5$, $\textrm{valuation_p_adique(40, 2)}$ renvoie 3, $\textrm{valuation_p_adique(40, 5)}$ renvoie 1 et $\textrm{valuation_p_adique(40, 7)}$ renvoie 0. - Écrire une deuxième fonction cette fois-ci récursive, $\textrm{val}(n, p)$ qui renvoie la valuation $p$-adique de $n$.
- En déduire une fonction $\textrm{decomposition_facteurs_premiers(n)}$ qui calcule la décomposition en facteurs premiers d'un entier $n\geq 2$. Cette fonction doit renvoyer la liste des couples $(p,v_p(n))$ pour tous les nombres premiers $p$ qui divisent $n$. Par exemple, $\textrm{decomposition_facteurs_premiers}(40)$ renvoie la liste $[[2,3],[5, 1]]$.
Simulations
Exercice 12 - Simulation d'une rangée de spots ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Une rampe verticale de spots nommés de bas en haut $S_1,\ S_2,\ S_3,\ S_4$ change d'état de la manière suivante :
- à l'instant $t=0$, le spot $S_1$ est allumé.
- si, à l'instant $t=n,\ n\geq 0$, le spot $S_1$ est allumé, alors un (et un seul) des spots $S_1,\ S_2,\ S_3,\ S_4$ s'allume à l'instant $t=n+1$, et ceci de manière équiprobable.
- si, à l'instant $t=n,\ n\geq 0$, le spot $S_k$ ($2\leq k\leq 4$) est allumé, le spot $S_{k-1}$ s'allume à l'instant $t=n+1$.
Enoncé 

Un restaurateur accueille 70 clients chaque soir. Il sait qu'en moyenne, 2 clients sur 5 prennent une crème brûlée. Il pense que, s'il prépare 30 crèmes brûlées, dans plus de 70\% des cas, la demande en crèmes brûlées sera satisfaite. Ecrire un algorithme permettant de conjecturer s'il a raison.
Polynômes
Exercice 14 - Schéma de Horner ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Soit $P(x)=a_n x^n+a_{n-1}x^{n-1}+\dots+a_0$. Pour évaluer $P(x)$, le mathématicien anglais Horner a proposé la méthode suivante :
$$P(x)= (\cdots(((a_n x+a_{n-1})x+a_{n-2})x+a_{n-3})\cdots)x+a_0.$$
Écrire une fonction sous Python qui prend en entrée la liste des coefficients d'un polynôme $P$ et un nombre réel $x$ et qui retourne $P(x)$ suivant la méthode de Horner.
Exercice 15 - Polynôme interpolateur de Lagrange ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Soit $n\geq 1$ un entier. On se donne $(n+1)$ réels $x_0,\dots,x_n$ deux à deux distincts, et $y_0,\dots,y_{n}$ une autre liste de $(n+1)$ réels (non nécessairement deux à deux distincts). Pour tout entier $i=0,\dots,n$, on définit le polynôme $L_i$ de $\mathbb R_n[X]$ par
$$L_i(x)=\prod_{k=0, k\neq i}^n \frac{X-x_k}{x_i-x_k}$$
puis le polynôme
$$P(X)=\sum_{i=0}^n y_i L_i(X).$$
- Vérifier que $P(x_i)=y_i$ pour tout $i=0,\dots,n$.
- Écrire une fonction lagrange qui prend en arguments une liste $x$ de points d'interpolation $x_i$, une liste $y$ de valeurs $y_i$, de même longueur que $x$, $a$ un réel, et qui renvoie la valeur de $P(a)$, où $P$ est le polynôme interpolateur défini précédemment.
Algèbre
Exercice 16 - Groupe des permutations ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Pour $n\in\mathbb N^*,$ on note $S_n$ le groupe des permutations de l’ensemble $\{0,\dots,n-1\}$. Une élément de $S_n$ sera représenté en Python par une liste, dont l’élément d’indice $i$ est l’image de $i$ par cette
permutation. Par exemple, la liste $[3,1,0,2]$ représente la permutation $\sigma\in S_4$ définie par $\sigma(0)=3,$ $\sigma(1)=1,$ $\sigma(2)=0$ et $\sigma(3)=2.$
- Quelle liste Python représente la transposition $(2\quad 3)\in S_4$ ?
- Écrire une fonction Python $\verb+comp(s1, s2)+$ prenant en entrée deux listes représentant des permutations $\sigma_1$ et $\sigma_2$ du même groupe de permutations et renvoyant la liste représentant la permutation $\sigma_1\circ\sigma_2.$
- Écrire une fonction Python $\verb+inv(s)+$ prenant en entrée une liste représentant une permutation $\sigma$ et renvoyant la liste représentant $\sigma^{-1}$.
- On souhaite tester si un sous-ensemble $G$ de $S_n$ est ou non un sous-groupe de $S_n.$ Écrire une fonction Python $\verb+groupe(G)+$ prenant en entrée une liste de listes, où chaque sous-liste représente une permutation de $S_n$ et renvoyant $\verb+True+$ s’il s’agit bien d’un sous-groupe de $S_n$ et $\verb+False+$ sinon.
- Écrire une fonction Python $\verb+cyclique(s)+$ prenant en entrée une liste $s$ représentant une permutation $\sigma$ $S_n$ et renvoyant le sous-groupe de $S_n$ engendré par $\sigma$ sous la forme d’une liste de listes.
Dénombrement
Exercice 17 - Partitions d'un entier ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

On appelle partition d'un entier naturel $n$ toute suite finie $(\alpha_1,\dots,\alpha_k)\in (\mathbb N^*)^k$ telle que $\alpha_1\geq \cdots\geq\alpha_k$ et $\alpha_1+\cdots+\alpha_k=n$.
On note $\Gamma_n$ l'ensemble des partitions de l'entier $n$.
- Déterminer $\Gamma_1,\Gamma_2,\Gamma_3,\Gamma_4$.
- Pour $j,n\in\mathbb N$, on note $Y_{n,j}$ l'ensemble des partitions de $n$ dont le premier terme est inférieur ou égal à $j$, et on note $y_{n,j}$ le cardinal de $Y_{n,j}$. On convient que $y_{0,0}=1$.
- Calculer $y_{n,1}$.
- On se propose de démontrer que, si $2\leq j\leq n$, alors $y_{n,j}=y_{n,j-1}+y_{n-j,\min(j,n-j)}$. Démontrer cette relation pour $j=n$.
- Pour $2\leq j<n$, vérifier que $y_{n,j}=y_{n,j-1}+y_{n-j,j}$ puis conclure.
- Écrire une fonction Python qui prend en argument un entier $n\geq 1$ et qui renvoie le cardinal de $\Gamma_n$.
Récursivité
Enoncé 

Écrire une fonction récursive factorielle qui prend en argument un entier naturel $n$ et renvoie l'entier $n!$.
Exercice 19 - Coefficients binomiaux ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

On rappelle que si $n$, $k$ sont deux entiers naturels, le coefficient binomial $\binom nk$ vérifie
- $\binom nk=0$ si $k>n$.
- $\binom n0=\binom nn=1$.
- $\binom nk=\binom {n-1}{k-1}+\binom {n-1}k$ si $1\leq k\leq n-1$.
Exercice 20 - Une suite récurrente ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

On considère une suite récurrente $(u_n)$ donnée par $u_1=1$, $u_2=3$, et les formules de récurrence :
$$\left\{
\begin{array}{rcl}
u_{2n}&=&u_n^2+5\\
u_{2n+1}&=&u_n u_{n+1}+7.
\end{array}\right.
$$
- Recopier et compléter la fonction récursive suivante, de sorte que suite(n) renvoie le couple $(u_n,u_{n+1})$.
def suite(n): if n==1: return(1,3) k=n//2 a,b=suite(....) if n%2==0: return (...,...) else: return (...,...) - Pour tout entier $n\geq 2$, exprimer en fonction de $n$ le nombre d'appels récursifs que réalise suite(n).
Exercice 21 - Complexité de l'algorithme d'exponentiation rapide ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

L'algorithme d'exponentiation rapide est basé sur la remarque suivante : on a $a^{2p}=a^p\cdot a^p$ et $a^{2p+1}=a^p\cdot a^p\cdot a$. Ainsi, pour calculer $a^{2p}$, il suffit de savoir calculer $a^p$ et de faire une multiplication, et pour calculer $a^{2p+1}$, il suffit de savoir calculer $a^p$ et de faire deux multiplications. L'algorithme suivant implémente récursivement l'algorithme d'exponentiation rapide sous Python :
def exporapide(a,n):
if n==0:
return 1
b=exporapide(a,n//2)
if (n%2)==1:
return b*b*a
else:
return b*b
Démontrer que, pour tout $n\geq 1$, le nombre total de multiplications effectuées par un appel à exporapide(a,n) est inférieur ou égal à $2+2\lfloor \log_2 n\rfloor$.Analyser des algorithmes
Enoncé 

L'algorithme suivant propose de calculer le pgcd de deux entiers $a$ et $b$, avec $a>b$.
Fonctionne-t-il? Sinon, corriger cet algorithme.
Lire a
Lire b
Tant que (b non nul) Faire
a=b
b=reste de a par b
Fin Tant que.
Afficher a.
Exercice 23 - Marche aléatoire ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Une puce se déplace sur un axe gradué. Au temps $t=0$, la puce est en 0.
Si la puce est en $x$, à l'instant $n+1$, elle est en $x+1$ avec probabilité $1/3$,
en $x+2$ avec probabilité $1/3$, en $x-3$ avec probabilité $1/3$.
On souhaite programmer un algorithme simulant la position de la puce
après 50 itérations. On propose l'algorithme suivant :
x=0
Pour t allant de 1 à 50 Faire
Si (random()<1/3) alors x=x+1
Si (random()>=1/3) et (random()<2/3) alors x=x+2
Si (random()>=2/3) alors x=x-3
Fin Pour.
Afficher x.
Cet algorithme fonctionne-t-il? Sinon, le corriger (la fonction random() retourne un nombre
(pseudo)-aléatoire entre 0 et 1).Exercice 24 - Triplets pythagoriciens ♡ [Signaler une erreur] [Ajouter à ma feuille d'exos] [Copier le lien]
Enoncé 

Voici l'énoncé posé à des étudiants :
``On rappelle qu'un triplet d'entiers naturels $(a,b,c)$ est un triplet pythagoricien si $a^2+b^2=c^2$.
Écrire un algorithme donnant tous les triplets pythagoriciens de sorte que $a+b+c\leq 10000$.''
Voici les réponses de quelques étudiants. Déterminer les algorithmes qui donnent le bon résultat. Expliquer.
Étudiant 1 :
Voici les réponses de quelques étudiants. Déterminer les algorithmes qui donnent le bon résultat. Expliquer.
Étudiant 1 :
Pour k1 allant de 0 à 10000 faire
Pour k2 allant de 0 à 10000 faire
Pour k3 allant de 0 à 10000 faire
Si $k1^2+k2^2=k3^2$ et k1+k2+k3<=10000 alors afficher (k1,k2,k3)
Fin Si
Fin pour
Fin pour
Fin pour.
Étudiant 2 :
a=0, b=0,c=0
Pour b allant de 0 à 10000
$a^2+b^2\to c$.
Si a+b+sqrt(c)<10000 et sqrt(c) entier alors afficher (a,b,sqrt(c))
c=0;
a=a+1;
Fin Pour.
Étudiant 3 :
a=0, b=0, c=0
Tant que a+b+c<=10000 faire
Tant que a+b+c<=10000 faire
afficher(a,b,c)
b=b+1
c=sqrt(a*a+b*b)
Fin tant que
a=a+1
b=0
Fin tant que.
Étudiant 4 :
Pour a allant de 0 à 10000 faire
Pour b allant de 0 à 10000-a faire
Pour c allant de 0 à 10000-a-b faire
Si a*a+b*b=c*c afficher (a,b,c) Fin si
Fin pour
Fin pour.
Fin pour.
Étudiant 5 :
a=0, b=0
Tant que a+b+sqrt(a*a+b*b)<=10000 faire
b=0
Tant que a+b+sqrt(a*a+b*b)<=10000 faire
Si Ent(sqrt(a*a+b*b))=sqrt(a*a+b*b) alors afficher (a,b,sqrt(a*a+b*b))
Fin si
b=b+1
Fin tant que
a=a+1
Fin tant que.
Étudiant 6 :
Pour a allant de 0 à 10000 faire
Pour b allant de 0 à 10000 faire
c=0
Tant que a+b+c<=10000 faire
si a*a+b*b=c*c alors afficher (a,b,c)
sinon c=c+1
Fin tant que
Fin pour.
Fin pour.
Enoncé 

Dans l'exercice donné aux étudiants, on considère la suite $(S_n)$ définie par
$$S_n=\sum_{k=0}^n \frac{(-1)^k}{k+1}.$$
On a prouvé que $(S_n)$ converge vers une limite $\ell$, et que, si on pose $u_n=S_{2n}$ et $v_n=S_{2n+1}$, alors pour tout entier $n$, on a $v_n\leq \ell\leq u_n$. Il est demandé aux étudiants d'écrire un algorithme donnant un encadrement de $\ell$ d'amplitude inférieur ou égal à $0.001$. Voici leurs réponses. Analysez-les.
Étudiant 1 :
Étudiant 1 :
n:=2
u:=5/6
v:=7/12
Tant que u-v>0.001 faire
u=u-1/(2n)+1/(2n+1)
v=u-1/(2n+2)
Fin Tant que
Retourner u et v.
Étudiant 2 :
a=1
c=1/2
n=0
b=a
d=c
tant que (a-c>0.001) faire
n=n+1
b=a
a=b+(-1)/(2n+1)+1/(2n+2)
d=c
c=d+1/(2n+2)-1/(2n+3)
Afficher a et b
Étudiant 3 :
Entrées :
u=1
v=1/2
n=0
Traitement :
Tant que (v-u>0.001)
n=n+1
u=u+somme{k=0 à 2n}(-1)^k/(k+1)
v=v+somme{k=0 à 2n+1}(-1)^k/(k+1)
Sortie : u,v
Étudiant 4 :
Variables : u,v,n,k
Initialisation :
u=1
v=1/2
k=0
n=0
Traitement :
Tant que (u-v>0.001) faire
Pour k allant de 1 à 2n faire
u=u+(-1)^k/k+1
Pour k allant de 1 à 2n+1 faire
v=v+(-1)^k/(k+1)
n=n+1
Sortie : Afficher u,v
Étudiant 5 :
Variables : a,b,n,u,v
Initialisation :
u=1
v=1/2
a=1/2
b=1
Traitement
Tant que (a>0.001)
n=n+1
a=1/(2n+2)
b=1/(2n+1)
u=v+b
v=u-a
Sortie : u,v
Étudiant 6 :
s=0
t=0
Pour k=0 à 1000 faire
s=s+(-1)^k/(k+1)
Fin Pour.
t=s+(-1)^(1001)/1002
Afficher s,t








