WikiPrépaLivrets

CCINP Option Informatique MP 2023Sujet et rapport du jury

Pas encore noté
  • Programmation récursive en OCaml
  • Algorithmique et complexité
  • Diviser pour régner
  • Raisonnement par récurrence
  • Graphes
  • Programmation en Python
  • Automates finis déterministes

Téléchargements

  • Corrigé : pas encore disponible

Présentation du sujet

Difficulté moyenne
Sélection linéaire du k-ième élément en OCaml, clique de célébrités dans un graphe et famille d'automates A(k,p)
Afficher ou masquer la section

L'épreuve d'informatique MP du CCINP 2023 comporte trois parties indépendantes. La première programme en OCaml, sans trait impératif, un algorithme de sélection en temps linéaire fondé sur les médians de paquets de cinq, puis en borne la complexité. La deuxième étudie les cliques de célébrités d'un graphe avec des preuves et des fonctions Python, la troisième une famille d'automates déterministes sur l'alphabet {0,1}.

  1. 1Partie I : sélection du (k+1)-ième plus petit élément en OCamlFonctions récursives auxiliaires (longueur, tri par insertion, paquets de cinq, médians, partage), fonction de sélection par diviser pour régner et preuve par récurrence d'une majoration linéaire du nombre de comparaisons (Q1 à Q9).
  2. 2Partie II : recherche d'une clique de célébritésExemples, unicité d'une clique de célébrités non vide, propriétés par retrait d'un sommet, puis programmation en Python sur des listes d'adjacence et preuve par récurrence de l'algorithme de construction (Q10 à Q16).
  3. 3Partie III : étude d'une famille d'automatesAutomates A(k,p) comptant la parité de certaines lettres, description de l'état atteint, propriétés liées au ou exclusif et au remplissage par des zéros (Q17 à Q22).

Difficulté moyenne. Le jury juge la longueur et le niveau de difficulté adaptés, avec une moyenne de 10,51 qui a permis de bien classer les candidats.

L'épreuve en chiffres

Moyenne 10,51 / 20 · écart-type 3,73 · où vous situez-vous ?
Afficher ou masquer la section
Moyenne
10,51/ 20
Écart-type
3,73
Coefficient
7
Durée
4 h
moyenne 10,5105101520
Deux tiers des copies environ (moyenne ± écart-type)

Votre note sur 20 à ce sujet, en conditions de concours.

Source : document officiel du concours, épreuve du 27 avril 2023. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.

Ce qu'a observé le jury

6 erreurs relevées
Traits impératifs interdits en partie I · Mauvais usage de l'opérateur @ · Hérédité de la récurrence sur la complexité
Afficher ou masquer la section

Le jury estime le sujet bien calibré et couvrant de nombreux aspects de l'option et du tronc commun. Les erreurs viennent surtout du non-respect des consignes, d'un manque de rigueur dans les preuves et de confusions de syntaxe entre Python et OCaml. La partie III a été moins abordée.

Les erreurs les plus sanctionnées

  1. 1
    Traits impératifs interdits en partie IPartie I, Q1 à Q8

    L'énoncé interdisait références, boucles et autres traits impératifs en OCaml : leur usage a valu zéro à la question concernée.

    « l'utilisation de références ou boucles a entraîné l'attribution de la note zéro aux questions concernées »
  2. 2
    Mauvais usage de l'opérateur @Partie I

    La concaténation était tolérée si elle restait pertinente, mais elle a souvent entraîné des confusions de syntaxe, une complexité dégradée ou un emploi dans les motifs de filtrage.

    « confusion de [t]@h avec t @ h, dégradation de la complexité, utilisation dans les motifs de filtrage »
  3. 3
    Hérédité de la récurrence sur la complexitéQ9

    Beaucoup de candidats n'ont pas su exploiter l'inégalité fournie par l'énoncé pour conclure l'hérédité.

    « beaucoup de candidats n’ ont pas su exploiter l’inégalité donnée »
  4. 4
    Preuves imprécises sur les cliquesQ11

    Confusion entre clique et clique de célébrités, oubli que la clique vide est toujours une clique de célébrités, erreurs de raisonnement sur les ensembles.

    « oubli que la clique vide est dans tous les cas une clique de célébrités »
  5. 5
    Code complexe non commenté

    Une solution compliquée, avec fonctions auxiliaires et nombreux paramètres, doit être expliquée en français, sinon elle risque de ne rapporter aucun point.

  6. 6
    Réponses hors propos sur les automatesQ17 et Q18

    Certains candidats se sont contentés de dessiner l'automate au lieu d'expliciter l'état atteint.

    « certains candidats donnent simplement en réponse une représentation graphique de l’automate ce qui est hors propos »

Ce qui a été bien réussi

  • Les questions de programmation en Python de la partie II ont en général été bien traitées.
  • Les copies sont globalement satisfaisantes sur la présentation du code.
  • Dans la partie III, les candidats qui ont compris les questions les ont traitées correctement.

Conseils du jury

  • Lire et respecter les consignes placées en tête de partie, notamment sur les traits de langage autorisés.
  • Soigner l'indentation et les retours à la ligne : une partie du barème porte sur la lisibilité.
  • Expliquer en français toute fonction qui n'est pas simple et directe.
  • Ne pas mélanger la syntaxe de Python et celle d'OCaml.
  • Rédiger les démonstrations avec clarté et précision, en particulier les manipulations d'ensembles.

Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.

Ces sujets peuvent vous intéresser

Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.

Lecture du sujet en ligne

L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.
Afficher ou masquer la section

ÉPREUVE MUTUALISÉE AVEC E3A-POLYTECH ÉPREUVE SPÉCIFIQUE - FILIÈRE MP

INFORMATIQUE

Durée : 4 heures
N.B. : le candidat attachera la plus grande importance à la clarté, à la précision et à la concision de la rédaction. Si un candidat est amené à repérer ce qui peut lui sembler être une erreur d'énoncé, il le signalera sur sa copie et devra poursuivre sa composition en expliquant les raisons des initiatives qu'il a été amené à prendre.

RAPPEL DES CONSIGNES

  • Utiliser uniquement un stylo noir ou bleu foncé non effaçable pour la rédaction de votre composition ; d'autres couleurs, excepté le vert, peuvent être utilisées, mais exclusivement pour les schémas et la mise en évidence des résultats.
  • Ne pas utiliser de correcteur.
  • Écrire le mot FIN à la fin de votre composition.

Les calculatrices sont interdites.

Le sujet est composé de trois parties indépendantes.

Partie I - Programmation en OCaml : sélection du (k + 1)^e plus petit élément

La sélection du (k + 1)^e plus petit élément d'une liste d'entiers L, non nécessairement triée, consiste à trouver le (k + 1)^e élément de la liste obtenue en triant L dans l'ordre croissant.
Par exemple, si L = [9; 1; 2; 4; 7; 8] le 3^e plus petit élément de L est 4 . On pourra remarquer que si la liste L est triée dans l'ordre croissant, le (k + 1)^e plus petit élément est l'élément de rang k dans L.
On présente un algorithme permettant de résoudre ce problème de sélection avec une complexité temporelle linéaire dans le pire cas. Celui-ci est basé sur le principe de "diviser pour régner" et sur le choix d'un bon pivot pour partager la liste en deux sous-listes.
Dans cette partie, les fonctions demandées sont à écrire en OCaml et ne doivent faire intervenir aucun trait impératif du langage (références, tableaux ou autres champs mutables ou exception par exemple).
Étant donné un réel a, on note ⌊a⌋ le plus grand entier inférieur ou égal à a.

1.1 - Fonctions utiles

Dans cette section, on écrit des fonctions auxiliaires qui sont utiles pour la fonction principale.
Q1. Écrire une fonction récursive de signature:
longueur : 'a list -> int
et telle que longueur 1 est la longueur de la liste 1.
Q2. Écrire une fonction récursive de signature :
insertion : 'a list -> 'a -> 'a list
et telle que insertion l a est la liste triée dans l'ordre croissant obtenue en ajoutant l'élément a dans la liste croissante 1 .
Q3. En déduire une fonction récursive de signature :
tri_insertion : 'a list -> 'a list
et telle que tri_insertion l est la liste obtenue en triant l dans l'ordre croissant.
Q4. Écrire une fonction récursive de signature :
selection_n : 'a list -> int -> 'a
et telle que selection_n 1 n est l'élément de rang n de la liste 1 .
Par exemple, selection_n [ 4; 2; 6; 4; 1; 15 ] 3 est égal à 4 .
Q5. Écrire une fonction récursive de signature :
paquets_de_cinq : 'a list -> 'a list list
et telle que paquets_de_cinq l est une liste de listes obtenue en regroupant les éléments de la liste 1 par paquets de cinq sauf éventuellement le dernier paquet qui est non vide et qui contient au plus cinq éléments. Par exemple :
  • paquets_de_cinq [] est égal à [],
  • paquets_de_cinq [2; 1; 2; 1; 3] est égal à [[2; 1; 2; 1; 3]],
  • paquets_de_cinq [ 3; 4; 2; 1; 5; 6; 3 ] est égal à [ [3; 4; 2; 1; 5]; [6; 3] ].
Q6. Écrire une fonction récursive de signature :
medians : 'a list list -> 'a list
et telle que medians 1 est la liste m obtenue en prenant dans chaque liste l_k apparaissant dans la liste de listes 1 l'élément médian de l_k. On convient que pour une liste A dont les éléments sont exactement a_0 ≤ a_1 ≤ … ≤ a_(n − 1), l'élément médian désigne a_(⌊n/2⌋).
Dans le cas où la liste L n'est pas triée, l'élément médian désigne l'élément médian de la liste obtenue en triant L par ordre croissant. Par exemple :
medians [[3;1;5;3;2];[4;3;1];[1;3];[5;1;2;4]] est égal à [3;3;1;2].
Q7. Écrire une fonction de signature :
partage : 'a -> 'a list -> 'a list * 'a list * int * int
telle que partage p 1 est un quadruplet 11, 12, n1, n2 où 11 est la liste des éléments de 1 plus petit que p, 12 est la liste des éléments de 1 strictement plus grand que p, n1 et n2 sont respectivement les longueurs de 11 et 12 .

1.2 - La fonction de sélection et sa complexité

On détaille la fonction de sélection :
Q8. Écrire une fonction récursive de signature :
selection : 'a list -> int -> 'a
telle que selection l kest le (k + 1)^e plus petit élément de la liste l. L'écriture de la fonction sera une traduction en OCaml de l'Algorithme 1 présenté en page 4.
On cherche à déterminer la complexité en nombre de comparaisons de la fonction selection. Pour tout n ∈ ℕ, on note T(n) le nombre maximum de comparaisons entre éléments lors d'une sélection d'un élément quelconque dans des listes L sans répétition de taille n.
En analysant l'Algorithme 1, il est possible de démontrer que :
∀n ≥ 55, T(n) ≤ T(⌊(n + 4)/5⌋) + T(⌊(8n)/(11)⌋) + 4n.
Q9. En admettant la proposition (I), montrer que pour tout entier n supérieur à 1 , on a :
T(n) ≤ (200 + T(55))n.
Pour l'initialisation, on pourra remarquer que T est une fonction croissante.
Algorithme 1 - Sélection du $(k+1)^{\mathrm{e}}$ plus petit élément
SELECTION L K :
/* L est une liste, k est un entier positif */
début
    $n \leftarrow$ LONGUEUR L
    si $n \leq 5$ alors
        $\mathrm{M} \leftarrow$ (TRI_INSERTION $L)$
        retourner l'élément de rang $k$ de $M$
    fin
    sinon
        L_Cinq $\leftarrow$ PAQUETS_DE_CINQ L
        $\mathrm{M} \leftarrow$ medians L_Cinq
        pivot $\leftarrow$ selection $\mathrm{M}((n+4) / / 5) / / 2$
        /* L'opérateur // désigne le quotient d'entiers. Le rang ( $n+4$ ) //5) //2
            correspond au rang du médian de la liste $M$ */
        $L_{1}, L_{2}, n_{1}, n_{2} \leftarrow$ PARTAGE pivot L
        si $k<n_{1}$ alors
            retourner selection $L_{1} k$
        fin
        sinon
            retourner selection $L_{2}\left(k-n_{1}\right)$
        fin
    fin
fin

Partie II - Recherche d'une clique de célébrités

II. 1 - Définitions et propriétés

Définition 1 (Graphe). On appelle graphe un couple G = (S, A) où S est un ensemble fini appelé ensemble des sommets et A est une partie de S × S, appelée ensemble des arêtes.
On pourra remarquer que, dans cette définition de graphe, les éléments de la forme ( s, s ) où s ∈ S sont des arêtes possibles.
Définition 2 (Clique). Soit G = (S, A) un graphe. Soit S^′ une partie de S. On dit que S^′ est une clique si :
∀(s_1, s_2) ∈ S^′ × S^′, (s_1, s_2) ∈ A.
Définition 3 (Clique de célébrités, célébrité). Soient G = (S, A) un graphe et C une partie de S. On dit que C est une clique de célébrités si C est une clique et :
∀(c, s) ∈ C × S, ((s, c) ∈ A) ∧ ((c, s) ∈ A ⟹ s ∈ C)
Un élément de l'ensemble C est alors appelé célébrité.
Le terme "célébrité" provient de l'interprétation suivante : l'ensemble des sommets correspond à un ensemble de personnes et une arête ( s, c ) représente le fait que s connaît c. Ainsi, une célébrité est connue de tous et elle connaît uniquement les autres célébrités.
Q10. Dans cette question, on pose S = {0, 1, 2, …, 6}. Pour chacun des graphes suivants, préciser s'ils contiennent une clique de célébrités non vide. Dans le cas où il y en a une, l'expliciter.
  1. G_1 = (S, A_1) avec A_1 = {(1, 2), (1, 3), (1, 5), (2, 6)}.
  2. G_2 = (S, A_2) avec
A_2 = {(0, 3), (0, 5), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3),; (4, 1), (4, 3), (4, 5), (5, 1), (5, 3), (6, 1), (6, 3)}.
Q11. Soit G = (S, A) un graphe quelconque. Montrer que s'il existe une clique de célébrités non vide C dans G, alors celle-ci est unique.
Dans la suite, on note C_G l'unique clique de célébrités non vide du graphe G. Dans le cas où celle-ci n'existe pas, C_G désigne alors l'ensemble vide qui est noté ∅.
Q12. Soient G = (S, A) un graphe et p un sommet de G. On note G^′ = (S∖{p}, A ∩ (S∖{p} × S∖{p})). Montrer les propositions suivantes :
a) Montrer que si C_(G^′) est égal à l'ensemble vide, alors C_G ∈ {∅, {p}}.
b) Montrer que si C_G∖{p} ≠ ∅, alors C_(G^′) = C_G∖{p}.
c) On suppose que C_(G^′) n'est pas l'ensemble vide et on fixe c^′ un élément de C_(G^′).
i) Montrer que si ( p, c^′ ) n'est pas un élément de A, alors C_G ∈ {∅, {p}}.
ii) Montrer que si ( c^′, p ) n'est pas un élément de A, alors C_G ∈ {∅, C_(G^′)}.
iii) Montrer que si ( p, c^′ ) et ( c^′, p ) sont des éléments de A, alors C_G ∈ {∅, {p} ∪ C_(G^′)}.

II. 2 - Algorithmique et programmation en Python (Informatique Commune)

Dans la suite, l'ensemble des sommets est de la forme {0, 1, …, n − 1} où n est un entier supérieur à 1 et un graphe G = (S, A) est représenté en Python par sa liste d'adjacence que l'on note L_G et qui est définie par:
[[j, I, j ∈ S et (i, j) ∈ A, ]i ∈ S].
Par exemple, si G = ({0, 1, 2, 3}, {(0, 1), (3, 2), (3, 1), (1, 2)}), alors L_G = [[1], [2], [], [1, 2]].
On pourra remarquer que si l'ensemble des sommets d'un graphe G est égal à {0, 1, …, n − 1}, alors la longueur de la liste L_G est égale à n.
Q13. Écrire une fonction Python est_clique( L, R ) prenant en argument une liste L qui est une liste d'adjacence d'un graphe G = (S, A) et une liste R sans répétition d'éléments de S et qui renvoie True si l'ensemble des éléments de R constitue une clique de G et False sinon.
Q14. On considère le graphe G ayant comme liste d'adjacence :
L_G = [[1, 3, 5], [0, 2], [4, 6], [2, 4, 5, 6], [2], [2, 3, 4], [2, 4, 6]].
Décrire l'évolution de la variable C à chaque étape de l'Algorithme 2 décrit en page 6 .
Q15. Écrire une fonction Python Clique_possible_C(G) prenant en argument une liste G représentant un graphe et qui renvoie la liste C construite à l'aide de l'Algorithme 2 .
Q16. Montrer par récurrence sur le nombre de sommets que si G est un graphe où C_G est non vide, alors Clique_possible_C(G) est égale à C_G.
Algorithme 2 - Construction d'une clique de célébrités possibles
Clique_possible_C G :
début
    $C \leftarrow[]$
    $S \leftarrow[0,1, \ldots, n-1]$
    $/ * \mathrm{n}$ est le nombre de sommet de $G \quad * /$
    pour chaque $s$ élément de $S$ faire
        si $C$ est vide alors
            Ajouter s dans C
        fin
        sinon
            $c \leftarrow$ premier élément de $C$
            $t \leftarrow$ FAUX
            /* t permet de vérifier si on a effectué certaines instructions */
            si ( $s, c$ ) n'est pas une arête de $G$ alors
                $C \leftarrow[s]$
                $t \leftarrow$ VRAI
            fin
            si ( $c, s$ ) n'est pas une arête de $G$ alors
                $C \leftarrow C$
                $t \leftarrow$ VRAI
            fin
            si $t=F A U X$ alors
                Ajouter $s$ à la fin de liste $C$
            fin
        fin
    fin
fin
retourner $C$

Partie III - Étude d'une famille d'automates

Dans cette partie, l'alphabet Σ désigne l'ensemble {0, 1}, le symbole ε désigne le mot vide et on rappelle que Σ^⋆ désigne l'ensemble des mots sur l'alphabet Σ.
Étant donné un mot w, on rappelle que |w| désigne la longueur du mot w et l'indexation des lettres de w commence par 0 . La première lettre de w est donc w_0.
La notation Card ( E ) désigne le cardinal d'un ensemble E.
Étant donnés un entier n et un entier non nul m, la notation nmodm désigne le reste de la division euclidienne de n par m.

III. 1 - Définitions

Définition 4 (Automate déterministe). Un Automate déterministe est un quintuplet A = (Q, Σ, δ, q_0, F) avec :
  • Q un ensemble fini non vide appelé ensemble des états,
  • Σ est un ensemble fini appelé alphabet,
  • δ : Q × Σ → Q une application appelée application de transition,
  • q_0 un élément de Q appelé état initial,
  • F une partie de Q appelée ensemble des états finaux.
Définition 5 (Application de transition étendue aux mots). Soit A = (Q, Σ, δ, q_0, F) un automate déterministe.
On définit de manière récursive δ^⋆ : Q × Σ^⋆ → Q par :
∀q ∈ Q,, δ^⋆(q, ε), = q; ∀q ∈ Q, ∀a ∈ Σ, ∀w ∈ Σ^⋆,, δ^⋆(q, aw), = δ^⋆(δ(q, a), w).
Définition 6 (Reconnaissance d'un mot par un automate). Soient w = w_0 w_1…w_n un mot sur un alphabet Σ et A = (Q, Σ, δ, q_0, F). On dit que w est reconnu par l'automate A si δ^⋆(q_0, w) ∈ F.
Définition 7 (Automate A_(k, p), fonction indicatrice L_(k, p) ). Soient p et k deux entiers vérifiant 0 ≤ k ≤ p − 1. L'automate A_(k, p) est défini par :
− Q = {0, 1, …, p − 1} × {0, 1},
  • Σ = {0, 1},
    − ∀(c, e) ∈ Q, δ((c, e), 0) = ((c + 1)modp, e),
    − ∀(c, e,) ∈ Q, δ((c, e), 1) = {((c + 1), modp, 1 − e), si c = kmodp,; ((c + 1), modp, e), sinon.
  • q_0 = (0, 0),
    − F = {0, 1, …, p − 1} × {1}.
    On note L_(k, p) la fonction indicatrice de l'ensemble des mots reconnus par A_(k, p). Soit autrement:
∀u ∈ Σ^⋆, L_(k, p)(u) = {1, si A_(k, p) reconnaît u; 0, sinon.

III. 2 - Exemples et propriétés élémentaires des A_(k, p)

Q17. Soit w ∈ Σ^⋆. Expliciter sans démonstration l'état δ^⋆(q_0, w), la lecture du mot étant effectuée dans l'automate A_(1, 3). On pourra s'aider d'une représentation graphique de l'automate.
Dans les questions Q18 à Q22, p et k désignent des entiers tels que p > 2 et k ∈ {0, 1, …, p − 1}.
Q18. Soit w ∈ Σ^⋆. Expliciter l'état δ^⋆(q_0, w), la lecture du mot étant effectuée dans l'automate A_(k, p). On ne demande pas de démonstration.
Un corollaire direct du résultat de la question Q18 est que l'ensemble des mots reconnu par l'automate A_(k, p) est égal à :
{w ∈ Σ^⋆|Card({m ∈ ℕ|pm + k ≤ |w| − 1 et w_(pm + k) = 1}) est impair }.
Dans la suite du problème, on admet ce résultat.
Q19. Soit w un mot reconnu par un automate A_(k, p). Montrer que w est reconnu par au moins un autre automate parmi A_(0, 2), A_(1, 2), A_(l, p) avec l ≠ k.
Définition 8 (Ou exclusif étendu aux mots binaires). On rappelle que le Ou exclusif qu'on note ⊕ est une opération définie sur {0, 1} par :
0 ⊕ 0 = 1 ⊕ 1 = 0 et 0 ⊕ 1 = 1 ⊕ 0 = 1.
Soient n ∈ ℕ, u et v deux éléments de {0, 1}^n. On définit le Ou exclusif de u et v, noté u ⊕ v, le mot de longueur n défini par :
∀i ∈ {0, 1, …, n − 1}, (u ⊕ v)_i = u_i ⊕ v_i.
Q20. Soient u et v deux mots de Σ^⋆ de même longueur. Montrer que :
L_(k, p)(u ⊕ v) = L_(k, p)(u) ⊕ L_(k, p)(v).
Q21. Soit w un mot binaire vérifiant :
L_(0, 2)(w) = L_(1, 2)(w) = 0 et ∀k ∈ {1, 2, …, p − 1}, L_(k, p)(w) = 0.
a) Montrer que L_(0, p)(w) = 0.
b) En déduire que pour tout mot w^′ ∈ 0^⋆ ⋅ w, on a :
L_(0, 2)(w^′) = L_(1, 2)(w^′) = 0 et ∀k ∈ {1, 2, …, p − 1}, L_(k, p)(w^′) = 0.
Q22. Montrer que pour tout w ∈ Σ^⋆ et w^′ ∈ w ⋅ 0^⋆, on a L_(k, p)(w) = L_(k, p)(w^′).
Remarque. Ces égalités permettent la construction d'une relation d'équivalence sur les mots qui est utilisée pour montrer que deux mots de longueur N peuvent être séparés par un automate de la forme A_(k, p) ayant O(√Nln(N)) états.

Questions fréquentes

4 questions
Sur quels chapitres porte l'épreuve d'informatique MP du CCINP 2023 ?
Afficher ou masquer la section

Sur quels chapitres porte l'épreuve d'informatique MP du CCINP 2023 ?

Elle mobilise la programmation récursive en OCaml, la complexité et le diviser pour régner (partie I), les graphes et Python (partie II), puis les automates déterministes (partie III).

Quelle est la moyenne de l'option informatique MP au CCINP 2023 ?

Le rapport indique une moyenne de 10,51 avec un écart-type de 3,73.

Quelles erreurs le jury a-t-il relevées en informatique MP au CCINP 2023 ?

L'usage de boucles ou de références en OCaml malgré l'interdiction (note zéro), les maladresses avec l'opérateur @, une hérédité mal menée en Q9 et des preuves imprécises sur les cliques de célébrités en Q11.

Le sujet d'informatique MP CCINP 2023 était-il long ?

Le jury estime la longueur et la difficulté adaptées. La partie III sur les automates a cependant été moins abordée.

Pas de description pour le moment