Comment préparer les maths des classes préparatoires scientifiques avec Mathpremium ?

 

Le site Mathpremium constitue le support qui accompagne les participants aux stages Trajectoire Prépa scientifique. Il contient des notes de cours et de très nombreux exercices corrigés.

  • Les notes de cours représentent l’équivalent des trois premiers mois d’une « math sup », à un moment où on approfondit les notions et méthodes abordées en classe de Terminale. La lecture soignée de ces chapitres est un atout dans la perspective d’études en classe préparatoire scientifique.
  • Chaque stage Trajectoire vient avec de très nombreux exercices de maths proposés par le responsable du stage, puis étudiés par le groupe. Le site mathpremium.fr reprend tous ces exercices mais aussi de nombreux autres qu’il est impossible de traiter dans le temps forcément limité du stage. Tous les exercices proposés sur ce site sont corrigés en détail.

 

Le lycée Louis-le-Grand, une prépa parisienne d'excellence

Le lycée Henri IV, une prépa parisienne d’excellence

Le lycée Louis-le-Grand, une autre grande classe prépa scientifique

 

 

 

 

 

 

Nous proposons ici, en consultation libre, un aperçu du matériel pédagogique mis à disposition des stagiaires, afin que tous puissent se faire une idée de la qualité des documents proposés. Bien sûr il ne s’agit que d’une toute petite sélection de ce qui est proposé au fil des stages. Certains exercices figurant dans cet aperçu pourront sembler un peu difficiles à un élève de Terminale, mais il ne faut pas oublier que tous sont présentés et résolus en groupe sous la direction du responsable du stage (lui-même souvent professeur en classe préparatoire) et qu’ils préfigurent le niveau mathématique auquel vous devrez vous hisser après la Terminale.

Voici donc quelques extraits du contenu du site Mathpremium ! 

CoursRaisonnerCalculerDénombrerPythonProgrammer
Faites votre choix, choisissez l’un des onglets ci-dessus!

Une page du cours de Maths

Factorielle d’un entier

Définition
On pose {0!=1}, et pour tout {n} de {\mathbb{N}^{*}}, on note {n!=n\;(n-1)!}.
Le symbole {n!} se lit « factorielle {n}« .

Remarques :

  • L’énoncé précédent est un exemple de définition récursive.
  • Pour tout {n} de {\mathbb{N}^{*}}, l’entier {n!} est le produit des entiers de {1} à {n}, c’est-à-dire {n!=\displaystyle\prod_{k=1}^nk}
  • On retiendra les valeurs :
    {\qquad 0!=1}, {1!=1}, {2!=2}, {3!=6}, {4!=24}, {5!=120}, {6!=720}, {7!=5040}.
  • L’entier {n!} désigne le nombre de permutations d’un ensemble à {n} éléments (c’est-à-dire de bijections de cet ensemble sur lui-même). Par exemple les {3!=6} permutations des lettres du mot {abc} sont : {abc}, {acb}, {bac}, {bca}, {cab} et {cba}.
  • Pour les grandes valeurs de {n}, on verra plus tard la formule de Stirling : {n!\sim n^{n}\text{e}^{-n}\sqrt{2\pi n}}.
    La signification de {\sim} est que le quotient des deux expressions tend vers {1} quand {n} tend vers {+\infty}.
    Par exemple, pour {n=20}, on a {\begin{cases}n!=2432902008176640000\\n^{n}\text{e}^{-n}\sqrt{2\pi n}\approx 2.42278684676\cdot 10^{18}\end{cases}}

Coefficients binomiaux

Définition (combinaisons de p éléments parmi n)
Soient {n} et {p} deux entiers, avec {0\le p\le n}. Soit {E} un ensemble fini possédant {n} éléments.
On note {\dbinom{n}{p}} le nombre de sous-ensemble de {E} possédant {p} éléments.

Remarques :

  • L’ensemble {E} dont il est question ici est évidemment sans importance.
    Par exemple, dans l’ensemble {E=\{a,b,c,d,e\}}, il y a {10} parties à trois éléments, qui sont {\{a,b,c\}}, {\{a,b,d\}}, {\{a,b,e\}}, {\{a,c,d\}}, {\{a,c,e\}}, {\{a,d,e\}}, {\{b,c,d\}}, {\{b,c,e\}}, {\{b,d,e\}}, {\{c,d,e\}}
  • Le coefficient {\dbinom{n}{p}} se lit « {p} parmi {n}« .
  • Si {E} a {n} éléments, il y a dans {E} : une seule partie vide, donc {\dbinom{n}{0}=1}.
    De même, il y a une seule partie à {n} éléments ({E} lui-même), donc {\dbinom{n}{n}=1}.
  • On étend la définition en posant {\dbinom{n}{p}=0} si {p\lt 0} ou {p>n} (ce qui est assez logique).
Proposition
Soient {n} et {p} deux entiers, avec {0\le p\le n}. On a l’égalité {\dbinom{n}{p}=\dfrac{n!}{p!\,(n-p)!}}
Démonstration
La formule est vraie si {p=0} et {p=n}, car elle donne {\dbinom{n}{0}=1} et {\dbinom{n}{n}=1}.
On suppose donc {1\le p\le n}.
Soit {E} un ensemble à {n} éléments : il y a {n!} permutations des éléments de {E}.
Choisissons les {p} éléments de {E} qui vont débuter une telle permutation : il y a {\dbinom{n}{p}} possibilités.
On choisit dans quel ordre on écrit ces {p} éléments ({p!} possibilités).
On choisit ensuite dans quel ordre on écrite les {n-p} suivants ({(n-p)!} possibilités).
Ce dénombrement donne {n!=\dbinom{n}{p}\,p!\,(n-p)!}, c’est-à-dire : {\dbinom{n}{p}=\dfrac{n!}{p!\,(n-p)!}}.

Relations entre coefficients binomiaux

Proposition
On a les identités {\dbinom{n}{p}=\dbinom{n}{n-p}}, et {\dbinom{n}{p}=\dbinom{n-1}{p}+\dbinom{n-1}{p-1}}.
Démonstration
  • Soit {E} un ensemble fini de cardinal {n\ge0}, et soit {p} un entier, avec {0\le p\le n}.
    Choisir une partie {A} de {E} à {p} éléments, c’est choisir ceux dont on ne veut pas.
    Cette simple idée suffit à se convaincre de l’égalité {\dbinom{n}{p}=\dbinom{n}{n-p}}
  • Soit {E} un ensemble fini de cardinal {n\ge1}, et soit {p} un entier, avec {1\le p\le n-1}.
    On fixe un élément {a} de {E}.
    Il y a {\dbinom{n}{p}} manières différentes de choisir une partie {A} de {E} ayant {p} éléments.
    Deux cas sont possibles :
    Ou bien {a} n’appartient pas à {A} : il y a alors {\dbinom{n-1}{p}} manières de former {A} car il reste à choisir {p} éléments parmi les {n-1} éléments de {E\setminus\{a\}}.
    Ou bien {a} appartient à {A} : il y a alors {\dbinom{n-1}{p-1}} manières de former {A} car il reste à choisir {p-1} éléments parmi les {n-1} éléments de {E\setminus\{a\}}.
    Ce dénombrement prouve que {\dbinom{n}{p}=\dbinom{n-1}{p}+\dbinom{n-1}{p-1}}

La deuxième formule, avec {\dbinom{n}{0}=\dbinom{n}{n}=1}, permet de calculer les {\dbinom np} de proche en proche.
On place souvent les {\dbinom{n}{p}} dans un tableau triangulaire, de lignes et colonnes numérotées à partir de {0}.
Le coefficient {\dbinom{n}{p}} s’y place à l’intersection de la ligne d’indice {n} et de la colonne d’indice {p}.
Le tableau obtenu est connu sous le nom de « triangle de Pascal » :
{\begin{array}{c|c|c|c|c|c|c|c|c|}&p=0&p=1&p=2&p=3&p=4&p=5&p=6&\,\cdots\,\cr n=0&1& & & & & & &\cr n=1&1&1& & & & & &\cr n=2&1&2&1& & & & &\cr n=3&1&3&3&1& & & &\cr n=4&1&4&6&4&1& & &\cr n=5&1&5&10&10&5&1& &\cr n=6&1&6&15&20&15&6&1&\cr\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\ddots&\ddots\cr n&\dbinom n0&\dbinom n1&\dbinom n2&\dbinom n3&\dbinom n4&\dbinom n5&\dbinom n6&\ddots\cr\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\ddots\cr\end{array}}

Proposition
On a les trois égalités :
{\dbinom n{p+1}=\dfrac{n-p}{p+1}\,\dbinom np,\quad\dbinom np=\dfrac np\,\dbinom {n-1}{p-1},\quad \dbinom np=\dfrac n{n-p}\,\dbinom {n-1}p}
Démonstration
  • On suppose {0\le p\lt n} :
    {\dbinom n{p+1}=\dfrac{n!}{(p+1)!(n-p-1)!}=\dfrac{n-p}{p+1}\;\dfrac{n!}{p\,!(n-p)!}=\dfrac{n-p}{p+1}\,\dbinom np}
  • On suppose {1\le p\le n} :
    {\dbinom{n}{p}=\dfrac{n!}{p\,!(n-p)!}=\dfrac{n}{p}\;\dfrac{(n-1)!}{(p-1)\,!\left((n-1)-(p-1)\right)!}=\dfrac np\,\dbinom {n-1}{p-1}}
  • On suppose {0\le p\lt n} :
    {\dbinom{n}{p}=\dfrac{n!}{p\,!(n-p)!}=\dfrac n{n-p}\;\dfrac{(n-1)!}{p\,!(n-p-1)!}=\dfrac n{n-p}\,\dbinom {n-1}p}

Proposition (Formule du binôme)
Pour tous {x,y} de {\mathbb{C}}, et pour tout {n} de {\mathbb{N}} : {(x+y)^n=\displaystyle\sum_{k=0}^n\dbinom nk\,x^k\,y^{n-k}}.
En particulier : {(1+x)^n=\displaystyle\sum_{k=0}^n\dbinom nk\,x^k}.
Démonstration
On procède par récurrence sur {\mathbb{N}}. La propriété est évidente si {n=0}.

En effet {(xy)^0=1} et {\displaystyle\sum_{k=0}^n\dbinom{n}{k}\,x^k\,y^{n-k}=\dbinom{n}{0}\,x^0y^0=1}.

Supposons la propriété vraie au rang {n\ge0}, et considérons {(x+y)^{n+1}}. On a :

{\begin{array}{rl}(x+y)^{n+1}&=(x+y)(x+y)^n=(x+y)\Bigl(\displaystyle\sum_{k=0}^n\dbinom{n}{k}\,x^k\,y^{n-k}\Bigr)\\\\&=\displaystyle\sum_{k=0}^n\dbinom{n}{k}\,x^{k+1}\,y^{n-k}+\displaystyle\sum_{k=0}^n\dbinom{n}{k}\,x^k\,y^{n+1-k}\\\\&=\dbinom nn\,x^{n+1}\,y^{0}+\displaystyle\sum_{k=0}^{n-1}\dbinom{n}{k}\,x^{k+1}\,y^{n-k}+\displaystyle\sum_{k=1}^n\dbinom{n}{k}\,x^k\,y^{n+1-k}+\dbinom{n}{0}\,x^0\,y^{n+1}\\\\&=x^{n+1}+\displaystyle\sum_{k=1}^{n}\dbinom{n}{k-1}\,x^{k}\,y^{n+1-k}+\displaystyle\sum_{k=1}^n\dbinom{n}{k}\,x^k\,y^{n+1-k}+y^{n+1}\\\\&=x^{n+1}+\displaystyle\sum_{k=1}^{n}\bigl(\dbinom{n}{k-1}+\dbinom{n}{k}\bigr)\,x^{k}\,y^{n+1-k}+y^{n+1}\cr&=\dbinom{n+1}{n+1}x^{n+1}y^0+\displaystyle\sum_{k=1}^{n}\dbinom{n+1}{k}\,x^{k}\,y^{n+1-k}+\dbinom{n+1}0x^0y^{n+1}\\\\&=\displaystyle\sum_{k=0}^{n+1}\dbinom{n+1}{k}\,x^{k}\,y^{n+1-k}\end{array}} Ce qui démontre la propriété au rang {n+1} et achève la récurrence

En particulier, pour tous {x} et {y} de {\mathbb{C}} :

  • {(x+y)^2=x^2+2xy+y^2}
  • {(x-y)^2=x^2-2xy+y^2}
  • {(x+y)^3=x^3+3x^2y+3xy^2+y^3}
  • {(x-y)^3=x^3-3x^2y+3xy^2-y^3}
  • {(x+y)^4=x^4+4x^3y+6x^{2}y^2+4xy^3+y^{4}}
  • {(x-y)^4=x^4-4x^3y+6x^{2}y^2-4xy^3+y^{4}}

Un exercice « Raisonner »

Exercice
Rappel : les rationnels sont les réels qui s’écrivent comme quotient de deux entiers, et les irrationnels sont tous autres.

  1. Soit {a} un entier. Montrer que si {a^2} est pair alors {a} est pair.
  2. Soit {x} un réel. Montrer que si {x^2} est irrationnel alors {x} est irrationnel.
  3. Montrer que {\sqrt2} est un irrationnel.
    (Nb : la réciproque de la question précédente est donc fausse).
  4. Plus généralement, montrer que pour tout {n\in\mathbb{N}^*}, {\sqrt{n}} est un entier ou est irrationnel.
  5. Soient {m,n} dans {\mathbb{N}^*}. On suppose que {m,n} ne sont pas des carrés.
    Montrer que {\sqrt{m}+\sqrt{n}} est irrationnel.
  6. Montrer que {x=\sqrt2+\sqrt3+\sqrt5} est irrationnel.
  7. Montrer que {x=\sqrt[3]{2}+\sqrt3} est irrationnel.
Cliquer ici pour voir/cacher le corrigé
  1. On procède par contraposition.
    On suppose donc que {a} est impair, c’est-à-dire s’écrit {a=2b+1}, avec {b\in\mathbb{Z}}.
    Alors {a^2=4b^2+4b+1=2c+1}{c=2b^2+2b\in\mathbb{Z}}, donc {a^2} est impair.
    Par contraposition, on en déduit que si {a^2} est pair, alors {a} est pair (c’était facile!)
  2. Par contraposition, il revient au même de montrer que si {x} est rationnel alors {x^2} est rationnel.
    Mais c’est évident, car si {x=\dfrac{a}{b}} (avec {a\in\mathbb{Z},\;b\in\mathbb{N}^*}), alors {x^2=\dfrac{a^2}{b}} est rationnel.
  3. On suppose par l’absurde que {\sqrt2} s’écrit {\sqrt2=\dfrac{a}{b}}, avec {a,b} dans {\mathbb{N}^*}.
    Quitte à simplifier la fraction, on suppose que {a,b} sont premiers entre eux.
    On a {a^2=2b^2}, donc {a^2} est pair, donc {a} est pair (question 1). Soit {c} dans {\mathbb{N}^*} tel que {a=2c}.
    L’égalité {a^2=2b^2} devient {4c^2=2b^2}, donc {b^2=2c^2} est pair, donc {b} est pair.
    Ainsi {a,b} sont pairs tous les deux (donc non premiers entre eux), ce qui constitue une contradiction.
    En conclusion, {\sqrt2} est un irrationnel.
  4. Soit {n} dans {\mathbb{N}^*}. Si {n} est un carré parfait ({n=m^2} avec {m\in\mathbb{N}^*}), alors {\sqrt n=m\in\mathbb{N}}.On suppose maintenant que {n} n’est pas un carré parfait.
    Par l’absurde, on suppose que {\sqrt n} est rationnel.
    Il existe donc {a,b} dans {\mathbb{N}^*} (premiers entre eux) tels que {\sqrt n=\dfrac ab} donc {a^2=nb^2}.
    Puisque {n} n’est pas un carré parfait, on a {n\ge2} et l’un au moins des facteurs premiers {p} de {n} est présent dans la décomposition de {n} avec un exposant impair.
    Ainsi l’entier {p} divise {n}, donc divise {nb^2=a^2}. Comme {p} est premier et qu’il divise {a^2}, il divise {a}.
    L’entier {p} apparaît alors dans la décomposition de {a^2} avec un exposant pair, et il apparaît dans la décomposition de {nb^2} avec un exposant impair : c’est contradictioire.
    Conclusion : si {n} n’est pas un carré parfait, alors {\sqrt n} est irrationnel.
  5. On se donne {mn} dans {\mathbb{N}^*}, et on suppose que ni {m} ni {n} ne sont des carrés d’entiers.
    Par l’absurde, on suppose que {r=\sqrt m+\sqrt n} est rationnel.
    Alors {r^2=m+n+\sqrt{mn}} est rationnel, donc {\sqrt{mn}} aussi.
    Ainsi {mn} est un carré, et on écrit {mn=a^2}, avec {a\in\mathbb{N}^*}.
    On a alors : {r=\sqrt m+\sqrt n=\dfrac{a}{\sqrt n}+\sqrt{n}=\dfrac{a+n}{\sqrt n}}.On constate alors que {\sqrt n=\dfrac{a+n}r} est un rationnel. Ainsi {n} est un carré, ce qui est contradictoire.
    Conclusion : si {m} et {n} ne sont pas des carrés parfaits, alors {\sqrt m+\sqrt n} est irrationnel.
  6. On suppose par l’absurde que {x=\sqrt2+\sqrt3+\sqrt5} est rationnel.
    On a {(x-\sqrt2)^2=(\sqrt3+\sqrt5)^2} c’est-à-dire {x^2+2-2x\sqrt2=8+2\sqrt{15}}.
    Ainsi le réel {y=x\sqrt2+\sqrt{15}=\dfrac{1}{2}\Bigl(x^2-6\Bigr)} est rationnel.
    Donc {y^2=2x^2+15+2x\sqrt{30}} est rationnel, donc {\sqrt{30}=\dfrac{y^2-2x^2-15}{2}} est rationnel.
    Mais c’est contradictoire car {30} n’est pas un carré parfait.
    En conclusion : {x=\sqrt2+\sqrt3+\sqrt5} est un irrationel.
  7. Supposons par l’absurde que {x=\sqrt[3]{2}+\sqrt3} est rationnel.
    Alors {2=(x-\sqrt 3)^3=x^3-3x^2\sqrt3+9x-3\sqrt3=(x^3+9x)-3(x^2+1)\sqrt3}.
    Il en résulte que {\sqrt 3=\dfrac{x^3+9x-2}{3(x^2+1)}} est rationnel, ce qui est absurde.
    Conclusion : {x=\sqrt[3]{2}+\sqrt3} est irrationnel.

Un exercice « Calculer »

Exercice
Trouver neuf termes consécutifs d’une suite arithmétique croissante dont la somme soit égale à {63} et dont la somme des carrés soit égale à {981}.
Cliquer ici pour voir/cacher le corrigé
On cherche les neuf termes sous la forme : {a-4r,a-3r,a-2r,a-r,a+r,a+2r,a+3r,a+4r\text{\ où\ }r>0}La somme {S_1} vaut {9a} donc la condition {S=63} donne {a=7}.
La somme des carrés est : {\begin{array}{rl}S'&=(a-4r)^2+(a-3r)^2+(a-2r)^2+(a-r)^2\\&\qquad+(a+r)^2+(a+2r)^2+(a+3r)^2+(a+4r)^2\\\\&=9a^2+2r^2(16+9+4+1)=9a^2+60r^2\\\\&=441+60r^2\end{array}}La condition {S'=981} donne {60r^2=540} donc {r^2=9} donc {r=3}.
On obtient donc la séquence : {-5,-2,1,4,7,10,13,16,19}.
Exercice
Tracer la courbe représentative de {x\mapsto f(x) = \dfrac{\sqrt{x(x-2)}}{(x-1)^2}}
Cliquer ici pour voir/cacher le corrigé
Le domaine de définition de {f} est {\mathcal{D}=]-\infty,0\,]\,\cup\,[\,2,+\infty[}.

On a {f'(x)=-\dfrac{x^2-2 x-1}{(x-1)^3\sqrt{(x-2) x}}}, pour {x\in\mathcal{D'}=]-\infty,0\,[\,\cup\,]\,2,+\infty[}.

On remarque l’identité {f(2-x)=\dfrac{\sqrt{(2-x)(-x)}}{(1-x)^2}=f(x)}.
Cela signifie que la droite verticale {x=1} est axe de symétrie.
Il suffit donc de faire l’étude pour {x\ge2}.

{P(x)=x^2-2 x-1} s’annule en {x=1-\sqrt2\lt 0} et {x=1+\sqrt2>2}.
Ainsi {\begin{cases}f'(x)>0\text{\ pour\ }2\lt x\lt 1+\sqrt2\\ f'(x)\lt 0\text{\ pour\ } x\gt 1+\sqrt2\end{cases}}

Sur {[2,+\infty[}, la fonction {f} atteint son maximum en {f(1+\sqrt2)=\dfrac{1}{2}}.
Par croissance comparée, on a {\displaystyle\lim_{x\to-\infty}f(x)=\displaystyle\lim_{x\to+\infty}f(x)=0^+}.
Il y a aux points {(0,0} et {(2,0)} une demi-tangente verticale dirigée vers les {y>0}.
Voici l’allure de la courbe représentative :

Deux exercices « Dénombrer »

Exercice

  1. De combien de façons différentes peut-on placer {n} personnes autour d’une table ronde ?
  2. De combien de façons différentes peut-on placer {n} hommes et {n} femmes autour d’une table ronde, de façon à respecter l’alternance homme/femme ?
Cliquer ici pour voir/cacher le corrigé
  1. Il faut placer l’un des convives au hasard, puis décider qui viendra à sa droite ({n-1} possibilités), puis qui viendra à la droite de ce dernier ({n-2} possibilités), etc, jusqu’à placer le dernier convive (à la droite de l’avant-dernier à avoir été placé).
    Le nombre de solutions distinctes est donc {(n-1)(n-2)\cdots2\cdot1=n!}.
  2. On commence par placer les {n} femmes autour de la table (en imaginant qu’on laisse une place vide entre deux).
    On choisit une place libre (toutes ne se valent pas car les femmes sont déjà placés) et on y place un premier hommes (il y a pour cela {n} possibilités).
    On place ensuite les {n-1} hommes restants (choisir qui vient à la première place libre à droite du premier homme, ce qui fait {n-1} possibilités, et ainsi de suite).
    Il y a ainsi {n(n-1)\cdots2\cdot 1=n!} façons de placer les {n} hommes autour de la table (dans les {n} places libres sachant que les femmes sont déjà placées).
    Finalement, il y a {n!(n-1)!} façons de choisir le placement des {n} hommes et des {n} femmes.
Exercice

  1. De combien de façons peut-on ranger dix chemises différentes dans sept tiroirs?
  2. De combien de façons peut-on ranger trois voitures sur cinq places de parking?
  3. De combien de façons peut-on distribuer dix places de théatre à dix personnes?
  4. Combien peut-on former de nombres différents de huit chiffres avec cinq « 1 » et trois « 2 »?
Cliquer ici pour voir/cacher le corrigé
  1. Si on numérote les tiroirs de {1} à {7}, il s’agit de former toutes les {10}-listes {(n_1,n_2,\ldots,n_{10})} de {[[ 1,7]]}, en notant {n_k} le numéro du tiroir où on range la {k}-ème chemise (on suppose bien sûr qu’un même tiroir peut contenir toutes les chemises).
    Le nombre de solutions est donc {7^{10}=282475249}.
  2. Le problème est analogue à une grosse différence près: on ne peut pas mettre deux voitures sur la même place! Une répartition des {3} voitures sur les {5} places est donc une {3}-liste d’éléments distincts de {[[ 1,5]]}.
    Le nombre de solution est donc {\dfrac{5!}{(5-3)!}=\dfrac{120}{2}=60}.
  3. Il y a autant de solutions qu’il y a de permutations {(t_1,t_2,\ldots,t_{10})} d’un ensemble {10} éléments (en notant {t_i} le numéro de la place attribuée au {i}-ème spectateur). Le nombre de solutions est donc {10!=3628000}.
  4. Il y a donc autant de solutions qu’il y a de manières de choisir la position (parmi {8} possibles) des trois chiffres deux, c’est-à-dire autant que de {3}-combinaisons d’un ensemble à {8} éléments, c’est-à-dire {\dbinom{8}{3}=56}.

Une page du cours Python

Branchements conditionnels if….

Pour dévier le flot des instructions en fonction de la valeur (vraie/fausse, non_nulle/nulle, non_vide/vide) d’une expression (appelée ici condition), Python met à notre disposition les clauses ifelif et else.

La clause if simple permet d’exécuter un bloc d’instructions si la condition est vraie :

if condition:                # si condition est vraie
    bloc_si_condition_vraie  # alors on parcourt ce bloc

On peut rajouter une clause else (facultative, donc) pour exécuter un autre bloc si la condition est fausse :

if condition:                   # si condition est vraie
     bloc_si_condition_vraie    # on parcourt ce premier bloc
else:                           # sinon
     bloc_si_condition_fausse   # on parcourt ce second bloc

Plutôt que d’emboîter des clauses if, on peut utiliser une clause if suivie par une (des) clause(s) elif :

if condition1:             # si condition1 est vraie
    bloc1_si_C1_vraie      # alors on exécute ce bloc1
elif condition2:           # sinon si condition2 est vraie
    bloc1_si_C1_fausse_et_C2_vraie
elif condition3:           # sinon si condition3 est vraie
    bloc3_si_C1C2_fausses_mais_C3_vraie
...
elif conditionN:           # sinon si conditionN est vraie
    blocN_si_CN_première_à_être_vraie
else:                # (facultatif) conditions toutes fausses
    bloc_else              # alors on exécute ce bloc

Remarques :

  • Dans toutes les constructions ci-dessus, au plus un bloc est parcouru;
  • Ne pas oublier le caractère « deux points » qui termine chacune des lignes d’en-tête !!! ;
  • Se souvenir que si un bloc se réduit à une instruction, on peut le placer directement après le « deux points ».
if x % 2:          # comprendre "si x est non nul modulo 2"
    print("x est impair")
    elif x % 4:    # x est pair, et on teste son reste modulo 4
        print("x est pair, mais pas multiple de 4")
    elif x % 8:    # x multiple de 4, on teste son reste modulo 8
        print("x multiple de 4, mais pas de 8")
    else:           # si on est là, x est multiple de 8
        print("x est multiple de 8")

Complément : expressions conditionnelles

Python offre la possibilité de former des expressions dont l’évaluation est soumise à une condition.
La syntaxe est la suivante : expression1 if condition else expression2
Le résultat est bien sûr l’évaluation de expression1 si la condition est vraie, et sinon c’est celle de expression2.

On voit sur le deuxième exemple ci-dessous comment emboîter deux expressions conditionnelles.

>>> x = -1; print("x > 0" if x>0 else "x ≤ 0")
x ≤ 0
>>> x = 0; print("x > 0" if x>0 else "x < 0" if x<0 else "x = 0")
x = 0

Les répétitions inconditionnelles (for…)

Pour répéter un certain nombre de fois un bloc d’instructions, on utilisera la construction suivante :

for element in objet:   # pour chaque élément de objet
    bloc_d’instructions # on parcourt ce bloc

En fait, objet est ici est toute construction susceptible d’être parcourue : on pense bien sûr aux intervalles (range), mais aussi aux chaînes (parcourues caractère par caractère), aux listes, aux tuples, aux dictionnaires….

for k in range(10):       # pour k=0, puis k=1, etc., k=9
     bloc_d_instructions  # on parcourt ce bloc
for x in 'abcdef':        # pour x = 'a', x = 'b', etc., x = 'f'
     bloc_d_instructions  # on parcourt ce bloc
for x in [7, 1, 8, 3, 4]: # pour x = 7, x = 1, etc., x = 4
     bloc_d_instructions  # on parcourt ce bloc

Le bloc qui fait suite à l’instruction for peut contenir deux instructions particulières, souvent attachées à un test if :

  • break provoque la sortie immédiate de la clause for.
  • continue passe directement à l’étape suivante de la boucle (ce qui reste du bloc après continue est donc ignoré).

Les répétitions conditionnelles (while…)

Pour répéter un bloc d’instructions tant qu’une condition est réalisée, Python nous propose la clause while :

while condition:            # tant que la condition est vraie
    bloc_si_condition_vraie # alors on parcourt ce bloc

Quelques remarques classiques sur ce genre de construction :

  • Si condition est fausse dès le départ, le bloc qui suit n’est jamais parcouru.
  • Dans la plupart des cas, le bloc qui suit l’instruction d’en-tête while agit sur la condition, de sorte que celle-ci, vraie au départ, devient fausse et provoque la sortie de la clause.
  • On peut écrire une clause while avec une condition toujours vraie (par exemple while 1: ou while True:) à condition (pour éviter une boucle infinie) de sortir par un autre moyen (notamment par break ou return).

Dans l’exemple ci-dessous, on illustre la clause while avec l’exemple classique de la suite dite de Syracuse.

Celle-ci est définie par une valeur initiale x0 et la règle suivante : si xn est pair alors xn+1 = xn/2 sinon xn+1 = 3xn + 1.

Une conjecture célèbre dit que l’un des xn vaut 1 (et la suite boucle alors sur les valeurs 1 → 4 → 2 → 1). On étudie ici le comportement très intéressant obtenu pour la valeur initiale x0 = 27 :

x = 27                # on part de la valeur 27
while x != 1:         # tant que x est différent de 1
    if x % 2 == 1 :   # si x est impair,
       x = 3*x+1      # on le remplace par 3x+1
    else:
       x = x // 2     # sinon, on le divise par 2
    print(x, end=' ') # affiche x (sans passer à la ligne)

82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121 364 182
91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790
395 1186 593 1780 890 445 1336 668 334 167 502 251 754 377 1132
566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619
4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232
4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61
184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1

Le bloc qui fait suite à l’instruction while peut contenir deux instructions particulières, souvent attachées à un test if :

  • break provoque la sortie immédiate de la clause while;
  • continue ramène à l’évaluation de la condition (ce qui restait du bloc après continue est donc ignoré).

Fonctions récursives

Une fonction récursive est une fonction qui s’appelle elle-même, dans sa propre définition. Les deux exemples les plus simples sont l’algorithme d’Euclide et la fonction factorielle :

def pgcd(a,b):  # algorithme d'Euclide
    if b > 0: return pgcd(b, a % b)
    else: return a

>>> pgcd(14814, 28440)
18

def fact(n):  # calcule n!
    if n <= 1: return 1
    else: return n*fact(n-1)

>>> fact(10) # 10x9x8...x2x1
3628800

Un exercice « Programmer »

Exercice (calculs dans une séquence)
Dans cet exercice, L désigne une liste de nombres entiers ou flottants (ou même complexes).

  1. Écrire somme(L et produit(L) renvoyant la somme (resp. le produit) des éléments de L.
    Si L est vide, on convient que la somme vaut 0 et que son produit vaut 1.
  2. Écrire cumuls(L) qui renvoie la liste des cumuls successifs des éléments de L.
    Par exemple cumuls([2,4,3,5]) doit renvoyer la liste [2,6,9,14]).

    Écrire decumuls(L) qui renvoie la list L’ dont L est la somme des cumuls.
    Par exemple decumuls([2,6,9,14]) doit renvoyer la liste 2,4,3,5].

  3. Réécrire les fonctions cumuls2 et decumuls2 pour qu’elles réalisent les calculs sur place (donc la liste placée en argument est modifiée) et qu’elles ne revoient rien (qu’elles renvoient None).

Cliquer ici pour voir/cacher le corrigé

  1. Voici la fonction somme et un exemple d’utilisation:

    def somme(L):
        s=0
        for x in L: s += x
        return s
    
    >>> somme([3,1,7,2,9,8,1,3])
    34
    

    Voici la fonction produit et un exemple d’utilisation:

    def produit(L):
        p=1
        for x in L: p *= x
        return p
    
    >>> produit([3,1,7,2,9,8,1,3])
    9072
    
  2. Voici la fonction cumuls et un exemple d’utilisation:

    def cumuls(L):
        c = 0; lc = []
        for x in L:
            c += x; lc.append(c)
        return lc
    
    >>> cumuls([3,2,6,4,1,7])
    [3,5,11,15,16,23]
    

    Voici la fonction decumuls et un exemple d’utilisation:

    def decumuls(L):
        c = 0; ld = []
        for x in L:
            ld.append(x-c); c = x
        return ld
    
    >>> decumuls(_)
    [3,2,6,4,1,7]
    
  3. Voici la fonction cumuls2, et un exemple d’utilisation :

    def cumuls2(l):
        for k in range(1,len(l)):
            l[k] += l[k-1]
    
    >>> L = [1,3,2,4,1,1,6,2]
    >>> cumuls2(L)
    >>> L
    [1,4,6,10,11,12,18,20]
    

    Voici la fonction decumuls2, et un exemple d’utilisation :

    def decumuls2(l):
        for k in range(len(l)-1,0,-1):
            l[k] -= l[k-1]
    
    >>> L = [1,4,6,10,11,12,18,20]
    >>> decumuls2(L)
    >>> L
    [1,3,2,4,1,1,6,2]