WikiPrépaLivrets

CCINP Informatique MPI 2026Sujet et rapport du jury

1,0(1 vote)
  • Classes P et NP, NP-complétude et réductions polynomiales
  • Algorithmes d'approximation
  • Graphes : cycle hamiltonien, arbre couvrant minimal, parcours en profondeur
  • Programmation en C : structures, pointeurs, allocation dynamique, fichiers
  • Programmation fonctionnelle en OCaml : listes et filtrage
  • Raisonnement par récurrence double ou forte
  • Combinatoire des mots

Téléchargements

  • Corrigé : pas encore disponible

Présentation du sujet

Difficulté moyenne
NP-complétude et 2-approximation du voyageur de commerce en C, suite de Prouhet-Thue-Morse en OCaml
Afficher ou masquer la section

Le sujet comporte deux parties indépendantes. La première montre que le problème du voyageur de commerce (TSP) est NP-complet par deux réductions, puis étudie une 2-approximation fondée sur un arbre couvrant minimal, à programmer en C. La seconde définit la suite de Prouhet-Thue-Morse de plusieurs façons, fait prouver leur équivalence par récurrence et programmer en OCaml des fonctions sur les mots, jusqu'à montrer que le mot de Thue-Morse ne contient pas de cube.

  1. 1Partie I : problème du voyageur de commerceAppartenance à NP, réductions de CYCLE-HAMILTONIEN vers TSP et de COUVERTURE-SOMMET vers CYCLE-HAMILTONIEN, 2-approximation par arbre couvrant minimal et implémentation en C avec lecture de fichier et allocation dynamique.
  2. 2Partie II : suite de Prouhet-Thue-MorseTrois définitions de la suite et preuves de leur équivalence, fonctions OCaml récursives sur les listes, mots sans carré ni cube et entrelacements.

Difficulté moyenne. Le jury juge la longueur adéquate et le sujet bien compris, avec une moyenne de 10,01, tout en notant que les thèmes traités sont moins accessibles pour un candidat de niveau moyen.

L'épreuve en chiffres

Moyenne 10,01 / 20 · écart-type 3,84 · 1 198 présents · où vous situez-vous ?
Afficher ou masquer la section
Moyenne
10,01/ 20
Écart-type
3,84
Présents
1 198
Coefficient
12
Durée
4 h
moyenne 10,0105101520
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 22 avril 2026. 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
Définition de NP incomplète · NP-complet réduit à NP-dur · Complexité des algorithmes au programme
Afficher ou masquer la section

Le sujet a bien discriminé les candidats sur des parties variées du programme : graphes, complexité, récurrence, programmation fonctionnelle et impérative. Les parties de programmation sont jugées globalement satisfaisantes. Les questions exigeant une démonstration rigoureuse et structurée ont permis de distinguer les candidats, et toutes les questions ont été traitées par au moins un candidat.

Les erreurs les plus sanctionnées

  1. 1
    Définition de NP incomplèteQ1, Q2

    Beaucoup oublient de justifier l'existence d'un certificat et sa taille polynomiale en l'instance, même si une phrase suffit.

    « La définition de NP n’est pas toujours bien maîtrisée »
  2. 2
    NP-complet réduit à NP-durQ11

    NP-complet signifie à la fois NP-dur et dans NP, et il fallait rappeler que l'appartenance à NP avait été prouvée en Q1.

  3. 3
    Complexité des algorithmes au programmeQ3, Q12

    L'étape 2 de l'algorithme était ambiguë et deux interprétations ont été acceptées, mais la complexité de Kruskal ou d'un parcours de graphe est parfois méconnue. En Q3, le graphe complet en O(|S|²) est oublié.

  4. 4
    Fichiers, pointeurs et allocations en CQ18

    Les fonctions de lecture et d'écriture dans un fichier, les opérateurs d'adresse et de déréférencement et l'accès aux champs d'une structure sont mal maîtrisés. L'allocation d'un tableau à deux dimensions est souvent omise.

  5. 5
    Récurrence double oubliéeQ26, Q28

    En Q28, la plupart des candidats ne voient pas qu'une récurrence double ou forte est nécessaire. En Q26, la difficulté était de nommer les deux définitions à comparer pour pouvoir rédiger la preuve.

    « c’est probablement symptomatique de preuves par récurrence mal comprises / rédigées »
  6. 6
    Filtrages OCaml non exhaustifsQ32

    Les filtrages ne couvrent pas tous les cas, par exemple quand une seule des deux listes est vide, et renvoyer false est confondu avec lever une exception.

Ce qui a été bien réussi

  • Les questions Q4 à Q7, Q9, Q10, Q16 et Q17 sont généralement bien traitées.
  • Les fonctions C des questions Q19 à Q22 sont souvent bien traitées.
  • En OCaml, Q23, Q31, Q36, Q40 et Q41 sont bien ou souvent bien traitées.

Conseils du jury

  • Connaître la définition précise de NP et rédiger explicitement le certificat.
  • Revoir la notion d'algorithme d'approximation et l'hypothèse d'inégalité triangulaire qu'elle utilise ici.
  • Choisir le bon type de récurrence et nommer les objets à comparer avant de rédiger la preuve.
  • Utiliser les fonctions du programme, comme List.length, au lieu de les recoder.
  • Préférer une disjonction de cas à une récurrence quand elle suffit.

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 MPI

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, bleu clair ou turquoise, peuvent être utilisées, mais exclusivement pour les schémas et la mise en évidence des résultats.
  • -Ne pas utiliser de correcteur.
  • -Ecrire le mot FIN à la fin de votre composition.
Les calculatrices sont interdites.
Le sujet est composé de deux parties indépendantes.

Partie I - Problème du voyageur de commerce

Cette partie comporte des questions nécessitant un code C.
Soit G = (S, A) un graphe non orienté à |S| = n sommets. On note ce graphe G = (S, A, c) lorsqu'il est muni d'une fonction de valuation des arêtes c : S × S → ℕ telle que pour tout s ∈ S, c(s, s) = 0 et c(s, t) = + ∞ s'il n'existe pas d'arête entre s et t.
Définition 1 (Cycle hamiltonien)
Un cycle hamiltonien dans G = (S, A) est un chemin qui passe une fois et une seule par chaque sommet de G et qui commence et termine par le même sommet.
On considère les problèmes suivants :
  • -CYCLE-HAMILTONIEN qui, étant donné un graphe non orienté G = (S, A), décide s'il existe un cycle hamiltonien dans G,
  • -COUVERTURE-SOMMET qui, étant donnés un graphe non orienté G = (S, A) et m ∈ ℕ, décide s'il existe un sous-ensemble de sommets S_c ⊆ S tel que |S_c| ≤ m et que chaque arête de A ait au moins une de ses extrémités dans S_c,
  • -TSP qui, étant donnés un graphe G = (S, A, c) et un entier k ∈ ℕ, décide s'il existe un cycle hamiltonien dans G de coût inférieur ou égal à k.
On admet dans la suite que COUVERTURE-SOMMET est NP-complet. On souhaite alors montrer que TSP est NP-complet.
Q1. Montrer que TSP est dans NP.
I. 1 - Réduction de CYCLE-HAMILTONIEN vers TSP
Q2. Montrer que CYCLE-HAMILTONIEN est dans NP.
Soit G = (S, A) une instance de CYCLE-HAMILTONIEN. On construit l'instance correspondante de TSP comme suit :
  • (i). on crée un nouveau graphe G^′ = (S^′, A^′) qui est un graphe complet tel que S^′ = S,
  • (ii). on attribue un coût à chaque arête deG^′ :
    • -si l'arête (s, t) existe dans G, on lui attribue un coût de 1,
    • -si l'arête ( s, t ) n'existe pas dans G, on lui attribue un coût de 2,
  • (iii). on fixe un seuil de coût k = |S|.
Q3. Montrer que la construction de G^′ est polynomiale en la taille de G.
Q4. Montrer que si CYCLE-HAMILTONIEN renvoie Vrai sur l'entrée G alors TSP renvoie Vrai sur l'entrée (G^′, k).
Q5. Montrer que si TSP renvoie Vrai sur l'entrée G^′ alors CYCLE-HAMILTONIEN renvoie Vrai sur l'entrée G.
I. 2 - Réduction de COUVERTURE-SOMMET vers CYCLE-HAMILTONIEN
Soient une instance de COUVERTURE-SOMMET donnée par le graphe G = (S, A) et un entier m ≤ |S|. On doit construire un graphe G^′ = (S^′, A^′) tel que G^′ a un cycle hamiltonien si et seulement si G a une couverture de sommets de taille au plus m. On admettra cette équivalence dans la suite. On s'intéresse, pour les questions Q6 à Q10, uniquement à la construction de G^′ à partir de G. De plus, pour les questions Q6 à Q9, on utilisera le graphe G décrit dans la Figure 1.
Figure 1 - Graphe exemple
  • Q6.Le problème COUVERTURE-SOMMET répond-il Vrai pour m = 2 ? pour m = 3 ? Si oui, donner pour chaque valeur de m un sous-ensemble S_c correspondant.
La construction de G^′ passe par les étapes suivantes :
    • (i). on construit m sommets a_1…a_m utilisés pour sélectionner m sommets de G,
    • (ii). pour chaque arête e = (s, t) de G, on construit un graphe gadget G_e = (S_e, A_e) à 12 sommets et 14 arêtes avec S_e = {s_i(e), i ∈ [ [1, 6] ]} ∪ {t_i(e), i ∈ [ [1, 6] ]} et
      A_e = {{s_i(e), s_(i + 1)(e)}}_(i ∈ [ [1, 5] ]) ∪ {{t_i(e), t_(i + 1)(e)}}_(i ∈ [ [1, 5] ]) ∪ {{s_3(e), t_1(e)}, {t_3(e), s_1(e)}} ∪ {{s_6(e), t_4(e)}, {t_6(e), s_4(e)}}.
    • (iii). pour chaque sommet s ∈ S de degré d(s), on connecte tous les graphes gadgets où s apparaît. Pour ce faire, on construit un ensemble d'arêtes A_s = {{s_6(e_(s[j])), s_1(e_(s[j + 1]))}, j ∈ [ [1, d(s) − 1] ]}, où les e_(s[j]) sont les arêtes incidentes à s ordonnées arbitrairement. Cette étape créé un chemin dans G^′ composé exactement des sommets u_i(e) tels que u = s.
    • (iv). on complète les arêtes de G^′ en connectant les sommets a_1…a_m aux premiers et derniers sommets de chaque chemin créé dans l'étape précédente. Pour ce faire, on construit les arêtes A_c = {{a_i, s_1(e_(s[1]))}, {a_i, s_6(e_(s[d(s)]))}, i ∈ [ [1, m] ], s ∈ S}.
Le graphe G^′ est alors défini par S^′ = {a_i, i ∈ [ [1, m] ]} ∪ (∪ _(e ∈ A)S_e) et A^′ = (∪ _(e ∈ A)A_e) ∪ (∪ _(s ∈ S)A_s) ∪ A_c.
Q7. Dessiner le graphe gadget de l'arête e_2 = (β, δ). Représenter les β_i(e_2) sur une même ligne, les δ_i(e_2) sur une même ligne, chaque β_i(e_2) étant à la verticale de δ_i(e_2).
Soit e = (s, t) une arête de G. Le graphe gadget G_e permet de garantir qu'au moins une extrémité de e figure parmi les m sommets sélectionnés dans l'étape (i). Dans la construction finale de G^′, les seuls sommets de G_e qui seront impliqués dans des arêtes supplémentaires construites dans l'étape (ii) sont s_1(e), t_1(e), s_6(e) et t_6(e).
Q8. Donner alors les trois traversées possibles du gadget G_e par un cycle hamiltonien dans G^′.
Q9. Donner les ensembles A_γ et A_δ produits par l'étape (iii).
Q10. Montrer que G^′ peut être construit à partir de G et m en temps polynomial.

1.3 - Conclusion des réductions

Q11. En déduire que TSP est NP complet.

I.4-2-approximation du problème TSP

On change ici la manière de voir le problème TSP. On passe du problème de décision au problème d'optimisation : étant donné un graphe G = (S, A, c), trouver dans G le chemin de coût total minimal qui passe exactement une fois par chaque sommet et revient au sommet de départ.
On ajoute maintenant une contrainte sur la fonction c : on demande à ce qu'elle respecte l'inégalité triangulaire, c'est-à-dire : ∀(s, t, u) ∈ S^3 c(s, u) ≤ c(s, t) + c(t, u). On suppose de plus que le graphe G est complet.
On montre alors, dans la suite, qu'il existe une 2-approximation du problème TSP. À cette fin, on propose l'algorithme 1.
Algorithme 1-2-approximation du problème TSP
Entrées : 
G = (S, A, c), c : S × S → ℕ
Sortie : Un cycle hamiltonien 
H
début
    
T = arbre couvrant de coût minimal de 
G
    
L = liste des sommets visités lors d'un parcours en profondeur de 
T
    
H = cycle hamiltonien qui visite les sommets dans l'ordre de 
L.
  • Q12.Quel algorithme peut-on utiliser pour réaliser l'étape 2 de l'algorithme 1 ? Quelle est la complexité de votre solution ?
    On note H^∗ un cycle hamiltonien de coût optimal pour le problème TSP. On note également c(E) le coût associé à un chemin E, qu'il soit représenté par une suite ordonnée d'arêtes ou de sommets.
  • Q13.Montrer que c(T) ≤ c(H^∗).
On ajoute un sommet dans L dès qu'on le rencontre lors du parcours en profondeur de T. Dans L, certains sommets sont donc visités plus d'une fois. La figure 2 donne un exemple de la construction de L = [1, 2, 3, 2, 8, 2, 1, 4, 5, 6, 5, 7, 5, 4, 1].
Figure 2 - Exemple de calcul de l'étape 3 de l'algorithme 1
  • Q14.Montrer que c(L) ≤ 2c(H^∗).
  • Q15.Montrer qu'il est possible de supprimer la visite d'un sommet dans L sans augmenter le coût du parcours.
  • Q16.En déduire comment construire H, résultat de l'algorithme 1.
  • Q17.En conclure que l'algorithme 1 produit une 2-approximation de TSP.
Les sommets du graphe étant codés par des entiers, on donne les structures de données suivantes :
// Structure de graphe
struct Graphe_s {
    int n; // Nombre de sommets
    int** C; // Matrice des coûts
};
typedef struct Graphe_s Graphe;
// Structure Arbre Couvrant de coût minimal
struct ACM_s {
    int* parent; // Tableau indiquant le parent de chaque sommet dans l'arbre
    int n; // Nombre de sommets de l'arbre
};
typedef struct ACM_s ACM;
// Structure Cycle Hamiltonien
struct CH_s {
    int* cycle; // Sommets dans l'ordre d'apparition dans le cycle
    int l; // Longueur du cycle = taille du tableau cycle
};
typedef struct CH_s CH;
On admet, de plus, disposer d'une fonction de prototype ACM* Recherche_ACM(Graphe* G) qui calcule l'arbre couvrant de coût minimal de G . Cette fonction alloue la structure ACM :
ACM* a = malloc(sizeof(ACM));
a->n = n;
a->parent = malloc(n * sizeof(int));
avant de la calculer et de la renvoyer.
Soit un fichier texte, présent sur le disque et correctement écrit, de la forme :
fichier.txt
n p
s1 t1 c1
s2 t2 c2
...
sp tp cp
où n est le nombre de sommets du graphe, p le nombre d'arêtes, les p lignes suivantes donnant les deux sommets si et ti et le coût ci de l'arête correspondante.
  • Q18.Écrire une fonction de prototype Graphe* creer_graphe(char* nom_fichier) qui créé un graphe à partir de la lecture d'un fichier texte dont le nom est spécifié dans la chaîne de caractères nom_fichier. On rappelle les fonctions suivantes de gestion des fichiers :
    • -FILE *fopen(char *nom_fichier, char *accessMode) ouvre un fichier de nom nom_fichier selon le mode d'ouverture spécifié par accessMode. Pour une ouverture en mode lecture texte, on peut prendre accessMode="r" ;
    • -int fclose(FILE *f) ferme le fichier pointé par f ;
    • -int fscanf(FILE ∗ f , char *s , ... ) lit dans le fichier pointé par f une chaîne de caractères et utilise le paramètre s pour préciser le format à utiliser pour décoder la chaîne de caractères. Les valeurs lues sont stockées, une à une, dans les paramètres suivants de la fonction, dont la mémoire doit avoir été allouée. Ainsi, fscanf( f, "%d %d",&i,&j); lit dans f une ligne composée de deux entiers, séparés par un espace et les stocke aux adresses &i et &j.
  • Q19.Écrire une fonction de prototype void dfs(ACM* a, int s, int* chemin, int* indice) qui réalise un parcours en profondeur de l'arbre a dont la racine est s. chemin est un tableau d'entiers, chemin[i] contenant le i-ème sommet du parcours : à chaque fois qu'un sommet est exploré, il est ajouté au tableau chemin à la position spécifiée par *indice (passage par pointeur de l'entier).
  • Q20.Écrire une fonction de prototype CH* calcule_CH(int* chemin, int n) qui transforme le chemin calculé par dfs en un cycle hamiltonien. On prendra soin d'allouer correctement la structure de donnée retournée par la fonction et de refermer le chemin pour obtenir un cycle.
  • Q21.Écrire des fonctions void free_ACM(ACM* a) et void free_CH(CH* cycle) qui désallouent la mémoire précédemment allouée. On supposera que la fonction Recherche_ACM n'effectue pas d'allocation mémoire supplémentaire.
  • Q22.Écrire une fonction de prototype CH* TSP2 (Graphe* G) qui calcule une 2-approximation de TSP. On prendra soin d'allouer/désallouer la mémoire lorsque cela est nécessaire.

Partie II - Suite de Prouhet-Thue-Morse

Cette partie comporte des questions nécessitant un code OCaml.
L'objectif de cette partie est d'étudier quelques définitions et propriétés de la suite de Prouhet-Thue-Morse (abrégé PTM), du nom des mathématiciens français, norvégien et américain Eugène Prouhet, Axel Thue et Marston Morse.
Notations
Dans toute la suite, on note :
  • - Σ = {0, 1} un alphabet, Σ^∗ l'ensemble des mots sur Σ, ε le mot vide et |m| la longueur d'un mot m,
  • -"." l'opérateur de concaténation de mots de Σ^∗,
  • -si m ∈ Σ^∗, m¯ le mot obtenu en remplaçant dans m les 0 par de 1 et les 1 par des 0,
  • -pour n ∈ ℕ, t_n le n-ème terme de la suite PTM,
  • -pour n ∈ ℕ, T_n = t_0 t_1⋯t_(2^n − 1) le mot construit l'aide des 2^n premiers termes de la suite PTM.
II. 1 - Définitions
II existe plusieurs manières de définir la suite PTM. Nous proposons ici d'en illustrer quelques unes et de montrer leur équivalence.
Définition 1 (première définition)
Pour n ∈ ℕ, on écrit n en base 2 sous la forme n = ∑_i d_i 2^i et on note b_n = ∑_i d_i. On définit alors t_0 = 0 et pour n > 0, t_n = {1, si b_n impair; 0, sinon.
Q23. Donner T_3.
  • Q24.Écrire une fonction récursive de signature compte_bits_a_un : int -> int telle que compte_bits_a_un n renvoie le nombre de bits à 1 dans l'écriture en base 2 de l'entier n.
  • Q25.En déduire une fonction de signature affiche_ptm : int → unit qui affiche le mot T_n. On écrira une fonction auxiliaire récursive de signature puissance 2 : int -> int qui calcule 2^n. Pour afficher les t_i, on utilisera la fonction print_int de signature print_int : int -> unit.
Définition 2 (deuxième définition)
On pose t_0 = 0. On suppose que pour n > 0 on a construit le mot T_n. On construit alors le mot T_(n + 1) et donc les termes t_(2^n), ⋯t_(2^(n + 1) − 1) de la suite PTM par négation binaire : ∀i ∈ [ [0, 2^n − 1] ]t_(2^n + i) = t¯_i. Autrement dit, T_(n + 1) = T_n T¯_n.
Q26. Montrer par récurrence que cette définition calcule la même suite que la première définition.
Définition 3 (troisième définition)
On définit la suite PTM de manière récursive : t_0 = 0 et pour tout n > 0t_(2n) = t_n, t_(2n + 1) = t_n^–.
Q27. Montrer que cette définition calcule la même suite que la première ou la deuxième définition.
Définition 4 (quatrième définition)
Un morphisme sur Σ^∗ est une fonction μ : Σ^∗ → Σ^∗ vérifiant μ(ε) = ε et : ∀u, v ∈ Σ^∗ μ(u.v) = μ(u).μ(v).
On définit alors le morphisme suivant sur les éléments de Σ : μ(a) = {01, si a = 0; 10, si a = 1 et la suite ( u_i, i ∈ ℕ ) par : u_0 = 0 et pour tout i ∈ ℕ^∗ u_(i + 1) = μ(u_i).
Q28. Montrer que pour tout i ∈ ℕ^∗, u_i = T_i.
On représente maintenant un mot de Σ^∗ par une liste d'entiers.
Q29. Écrire une fonction de signature thue_morse_4 : int -> int list, un appel à thue_morse_4 n générant T_n. Cette fonction fera appel à une fonction récursive de signature morphisme : int list -> int list renvoyant l'application du morphisme μ sur la liste d'entiers en entrée. On lèvera une exception INVALID_ARGUMENT si le mot donné en entrée n'est pas binaire.
II. 2 - Mot infini de Thue-Morse
Le mot infini de Thue-Morse T est le mot obtenu en itérant μ une infinité de fois, en partant du symbole 0 . Nous allons ici nous intéresser à la structure de T.
Définition 5 (carré, cube)
Soit m ∈ Σ^∗. m est un carré s'il s'écrit m = w.w, où w ∈ Σ^∗. C'est un cube si m = w.w.w, où w ∈ Σ^∗.
Par exemple, le mot m = 110110110 est un cube avec w = 110.
Q30. Montrer qu'il n'existe pas de mots de Σ^∗ de longueur supérieure ou égale à 4 sans carrés.
Q31. Écrire une fonction récursive de signature divise_mot : int list -> int list * int list qui divise un mot m en deux sous-mots de taille identique, le premier constitué des |m|/2 premiers éléments de m, le second des éléments restants. On supposera ici que |m| est paire.
Q32. En déduire une fonction de signature est_carre : int list -> bool qui détermine si un mot m est un carré. On prendra soin de vérifier que |m| est paire.
Q33. Montrer que T ne contient aucun cube de la forme 000 ou 111.
Définition 6 (entrelacement)
m ∈ Σ^∗ est un entrelacement s'il contient un facteur de la forme xyz où x, y, z sont des facteurs non vides de m et xy = yz. On dit que les deux facteurs xy et yz se chevauchent sur la partie commune y.
Par exemple, le mot 10101001 est un entrelacement, puisqu'il contient le facteur 010 en positions 2 et 4 , qui se chevauchent sur le 0 en position 4 (en gras).
Q34. Écrire une fonction récursive de signature sousliste : int list -> int -> int -> int list telle que sousliste lst i l renvoie la sous-liste de lst qui commence à l'indice i et de longueur 1. Si la sous-liste dépasse la fin de la liste 1st, elle est tronquée.
Q35. Écrire une fonction de signature est_entrelacement : int list -> bool telle que l'appel est_entrelacement m renvoie true si m est un entrelacement, false sinon. On pourra tester récursivement toutes les longueurs de facteurs possibles et, pour un facteur donné, vérifier s'il apparaît ailleurs dans le mot avec chevauchement. On utilisera obligatoirement la fonction sousliste.
Q36. Montrer que si un mot m contient un facteur cube, alors c'est un entrelacement.
On admet dans la suite que si un mot est un entrelacement dont la partie commune est de longueur k ≥ 1, alors c'est également un entrelacement de partie commune de longueur 1.
  • Q37.Montrer que si un mot m est un entrelacement, alors il contient un facteur de la forme avava, où a ∈ Σ et v ∈ Σ^∗.
  • Q38.Soit m = a_0 a_1⋯a_(2n − 1) ∈ Σ^∗ tel que, pour tout i ∈ [ [0, n − 1] ], a_(2i)a_(2i + 1) s'écrit soit 01, soit 10. Montrer qu'il n'est pas possible d'écrire les mots 0m0 et 1m1 sous la forme b_0 b_1⋯b_(2n + 1), où, pour tout i ∈ [ [0, n] ], b_(2i)b_(2i + 1) s'écrit soit 01, soit 10.
Soit m ∈ Σ^∗. On construit le mot μ(m) où μ est défini après la définition 4. Si μ(m) = wavavaz où a ∈ Σ et v, w, z ∈ Σ^∗, on peut montrer qu'alors v contient un nombre impair de symboles.
  • Q39.Montrer, en utilisant Q37 et l'indication précédente, que si μ(m) est un entrelacement, alors m est un entrelacement.
  • Q40.Montrer par récurrence que pour tout n ∈ ℕ, T_n n'est pas un entrelacement.
  • Q41.En déduire que pour tout n ∈ ℕ, T_n ne contient pas de cube.
Par passage à la limite, on admet alors que T n'est pas un entrelacement et ne contient donc pas de cube.

FIN

Questions fréquentes

4 questions
Sur quoi porte le sujet d'informatique CCINP MPI 2026 ?
Afficher ou masquer la section

Sur quoi porte le sujet d'informatique CCINP MPI 2026 ?

Sur la NP-complétude du problème du voyageur de commerce et une 2-approximation programmée en C, puis sur la suite de Prouhet-Thue-Morse étudiée en OCaml, jusqu'à prouver l'absence de cube dans le mot de Thue-Morse.

Quelle est la moyenne de l'épreuve d'informatique CCINP MPI 2026 ?

Le rapport donne une moyenne de 10,01 avec un écart type de 3,84.

Quelles erreurs le jury a-t-il relevées en informatique MPI CCINP 2026 ?

Une définition de NP incomplète, l'oubli de la récurrence double ou forte, une notion d'algorithme d'approximation floue, des filtrages OCaml non exhaustifs et une syntaxe C mal maîtrisée pour les fichiers et l'allocation dynamique.

Quelles questions étaient les plus difficiles en informatique CCINP MPI 2026 ?

Le jury cite Q35 et Q39, plus rarement traitées, ainsi que Q28 sur la récurrence double, très mal traitée.

Pas de description pour le moment