CAPES informatique externe 2026, épreuve 2Sujet
Capes externe bac + 3 section NSI - Sujet de la seconde épreuve écrite de la session 2026
- Représentation binaire des nombres et opérateurs bit à bit
- Traitement d'image et algorithmes de quantification
- Graphes et algorithmes de plus court chemin
- Logique propositionnelle
- Bases de données relationnelles et SQL
Téléchargements
- Corrigé : pas encore disponible
- Rapport du jury : pas encore publié
Présentation du sujet
Épreuve d'admissibilité 2, CAPES numérique et sciences informatiques (NSI) 2026 : compression d'image médicale, drones de livraison, système de sécurité et base de données cinéphilesAfficher ou masquer la section
Présentation du sujet
Le sujet comporte quatre exercices indépendants ancrés dans des situations concrètes. Le premier étudie la représentation binaire, les opérateurs bit à bit, et une compression d'image médicale par réduction de profondeur de couleur avec Floyd-Steinberg. Le deuxième modélise un réseau de livraison par drones en graphe et étudie le parcours en largeur puis Dijkstra, avec une ouverture sur le voyageur de commerce. Le troisième modélise un système de sécurité en logique propositionnelle. Le quatrième porte sur SQL et algèbre relationnelle d'une base cinéphiles.
- 1Exercice 1 : compression d'image médicaleOn étudie la représentation binaire des nombres et les opérateurs bit à bit, puis une fonction Python de réduction de profondeur de couleur d'image et l'algorithme de dithering de Floyd-Steinberg.
- 2Exercice 2 : livraison par drones et plus courts cheminsOn modélise un réseau de livraison par un graphe pondéré, on corrige un parcours en largeur, on complète une implémentation de l'algorithme de Dijkstra, puis on discute la décidabilité d'un problème de type voyageur de commerce.
- 3Exercice 3 : système de sécurité en logique propositionnelleOn traduit des règles de sécurité en formules de logique propositionnelle, on complète une table de vérité pour identifier une incohérence des règles, puis on propose une correction et une extension avec un système de badge.
- 4Exercice 4 : base de données CINEPHILESOn modélise les liens entre les relations d'une base de données de films, puis on exprime des requêtes en algèbre relationnelle et en SQL portant sur les réalisateurs, les genres et les avis des spectateurs.
Description
Sujet officiel CAPES externe en informatique, session 2026.
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
Lecture du sujet en ligne
(BAC+3)
Concours externe
NUMERIQUE ET SCIENCES INFORMATIQUES
L'épreuve s'appuie sur un ou plusieurs documents présentant une problématique posée par une situation concrète et des éléments de mise en œuvre d'une ou plusieurs solutions.
Le candidat est invité à analyser,le cas échéant,à compléter et à faire évoluer la ou les solutions à mettre en œuvre pour résoudre la problématique posée.
L'épreuve vise à apprécier la capacité du candidat à comprendre et analyser les documents proposés,à construire et exposer un raisonnement.
L'usage de tout ouvrage de référence,de tout dictionnaire et de tout matériel électronique est rigoureusement interdit.
Le fait de rendre une copie blanche est éliminatoire.
INFORMATION AUX CANDIDATS
CAPES EXTERNE NUMÉRIQUE ET SCIENCES INFORMATIQUES
- -Concours externe du CAPES de l'enseignement public :
- -Concours externe du CAFEP/CAPES de l'enseignement privé :
Exercice 1
Partie A : Représentation des nombres
Question 2 Écrire la représentation décimale du nombre dont la représentation binaire est 100010 en base 2.
Question 3 Écrire une fonction Python nommée decimal_vers_binaire qui prend un entier décimal n en entrée et renvoie sa représentation binaire sous forme de chaîne de caractères (l'utilisation de la fonction native bin de Python n'est pas autorisée).
Question 4 Écrire une fonction Python nommée binaire_vers_decimal qui prend une chaîne de caractères binaire b en entrée et renvoie sa valeur décimale.
Partie B : Manipulation de Bits
Question 5 Évaluer les expressions suivantes en binaire et en décimal.
- -
a&b - -
∼ a - -
a≫2
Question 7 Écrire une fonction Python extraire_bits qui prend en paramètres trois entiers : n, d et long. Cette fonction extrait une séquence de longueur long de l'entier n, en commençant à la position d (le bit le plus à droite est en position 0). La fonction doit renvoyer la valeur décimale de la séquence de bits extraite. Cette fonction doit utiliser des opérateurs bit à bit. Exemples :
>> extraire_bits(Ob11010110, 2, 3)
5
>> extraire_bits(0b10101010, 0, 4)
10
Partie C : Imagerie médicale
On donne en annexe (ANNEXE A.4) la fonction reduire_profondeur_couleur.
Question 9 Expliquer le rôle de la variable f dans la fonction reduire_profondeur_couleur (ligne 16)
Question 10 Expliquer le rôle de la ligne : nouveau_pixel = max(0, min(nouveau_pixel, 2**profondeur_cible - 1)) dans la fonction reduire_profondeur_couleur (ligne 22)
Question 11 Modifier la fonction reduire_profondeur_couleur afin d'utiliser des opérateurs bit à bit à la place de la division et de l'arrondi.
Question 12 Donner un avantage de l'utilisation des opérateurs bit à bit à la place de la division et de l'arrondi.
Question 13 Déterminer l'erreur de quantification pour un pixel qui a une intensité de 125 dans l'image d'origine.
Question 14 Déterminer la complexité en fonction du nombre de pixels de l'image de l'algorithme de Floyd-Steinberg.
Question 15 Écrire une fonction Python floyd_steinberg_dither qui implémente l'algorithme de Floyd-Steinberg. Cette fonction prend en paramètre une matrice d'entiers, matrice_pixels qui représente l'image source et profondeur_cible le nombre de bits par pixel de l'image cible. La fonction renvoie une matrice d'entiers qui représente l'image cible.
Question 16 Citer un autre domaine où ce principe de quantification (réduction du nombre de bits) est régulièrement utilisé.
Exercice 2
Question 17 Écrire le code permettant d'implémenter le graphe donné dans l'annexe B.2.
Question 18 Compléter la méthode ajouter_arete.
Vous trouverez en annexe (ANNEXE B.3) le code de la fonction bfs (parcours en largeur).
Question 19 Donner votre avis sur la ligne sommet_courant = file.pop(0) de la fonction bfs (ligne 11)
Une erreur s'est glissée dans la fonction bfs. Par exemple, actuellement, bfs(g, 0) renvoie {0: 0, 1: inf, 2: inf, 3: inf, 4: inf} alors que l'on attend {0: 0, 1: 9, 2: 5, 3: 17, 4: 6} (avec g le graphe donné dans l'annexe B.2)
Question 20 Corriger l'erreur présente dans la fonction bfs.
Question 21 Donner la complexité temporelle dans le pire des cas de l'algorithme bfs.
L'algorithme bfs n'est pas approprié pour calculer le temps de vol minimal entre 2 points de livraison. Il est préférable d'utiliser l'algorithme de Dijkstra.
Question 22 Expliquer le principe de l'algorithme de Dijkstra. Votre explication devra s'appuyer sur un exemple concret : quel est le chemin le plus court pour aller du point de livraison 0 au point de livraison 3 ?
Question 23 Expliquer la notion de tas évoqué dans la documentation du module heapq.
Question 24 Compléter la fonction dijkstra donnée dans l'annexe (ANNEXE B.4) (recopier sur votre copie uniquement les lignes avec des . . .).
L'entreprise aimerait savoir s'il existe un moyen de partir d'un point, de passer par tous les points de livraison exactement une fois et de revenir au point de départ en une seule fois (sans avoir besoin de recharger le drone). Autrement dit, il faut que la distance totale à parcourir soit inférieure à l'autonomie du drone.
Exercice 3
Question 28 Énumérer le(s) problème(s) mis en lumière par la table de vérité.
Question 29 Proposer une modification des règles afin de supprimer le problème évoqué à la Question 28. Exprimez cette modification en logique propositionnelle et en langage naturel.
Exercice 4
Question 32 Exprimez la requête "Titres des films réalisés par des français et distribués par Gaumont" en algèbre relationnelle (en utilisant les opérateurs fournis en annexe (ANNEXE D.2)).
Question 33 Écrire une requête SQL permettant d'obtenir le nom des réalisateurs ayant réalisé des films de genre "science-fiction".
Question 34 Écrire une requête SQL permettant d'obtenir le nom des réalisateurs n'ayant jamais réalisé de film de genre "science-fiction".
Question 35 Écrire une requête SQL permettant d'obtenir le nombre d'avis par genre et par spectateur.
ANNEXES
ANNEXE A : documents de l'exercice 1
| Opérateur | Symbole | Description |
| ET | & | 1 si les 2 bits sont 1 |
| OU | | | 1 si au moins un bit est 1 |
| OU exclusif (XOR) | ^ | 1 si un seul des 2 bits est 1 |
| NON | ~ | inverse chaque bit (avec complément à 2) |
| Décalage à gauche | << | décale les bits vers la gauche |
| Décalage à droite | >> | décale les bits vers la droite |
from PIL import Image
def lire_image_png(chemin_image):
"""
Lit une image PNG et retourne une matrice de pixels en niveaux de gris
ainsi que la largeur et la hauteur de cette matrice.
"""
try:
image = Image.open(chemin_image).convert('L') # Convertit en niveaux de gris
largeur, hauteur = image.size
pixels = list(image.getdata())
matrice = [...]
return matrice, largeur, hauteur
except FileNotFoundError:
print(f"Erreur fichier")
return None, None, None
except Exception as e:
print(f"Erreur lors de la lecture de l’image: {e}")
return None, None, None
ANNEXE A. 3 : Extrait de la documentation de la bibliothèque Python Pillow
ANNEXE A. 4 : fonction reduire_profondeur_couleur
def reduire_profondeur_couleur(matrice_pixels, p_source, p_cible):
"""
Reduit la profondeur de couleur d'une matrice de pixels.
Args :
matrice_pixels: La matrice de pixels en niveaux de gris.
p_source: Le nombre de bits par pixel de l'image source.
p_cible: Le nombre de bits par pixel de l'image cible.
Returns:
Une nouvelle matrice de pixels avec la profondeur de couleur reduite.
"""
if not matrice_pixels:
return None
f = 2**p_source / 2**p_cible
nouvelle_matrice = []
for ligne in matrice_pixels:
nouvelle_ligne = []
for pixel in ligne:
nouveau_pixel = round(pixel / f)
nouveau_pixel = max(0, min(nouveau_pixel, 2**p_cible - 1))
nouvelle_ligne.append(nouveau_pixel)
nouvelle_matrice.append(nouvelle_ligne)
return nouvelle_matrice
ANNEXE A. 5 : principe de l'algorithme de Floyd-Steinberg
- -Parcours de l'image : L'algorithme parcourt l'image pixel par pixel, généralement de gauche à droite et de haut en bas.
- -Quantification : Pour chaque pixel, on détermine la couleur la plus proche dans la palette de couleurs réduite. La différence entre la couleur originale du pixel et sa couleur quantifiée est appelée "erreur de quantification".
- -Diffusion de l'erreur : Au lieu de simplement ignorer l'erreur de quantification, l'algorithme la distribue aux pixels voisins non encore traités. L'erreur est répartie selon des poids spécifiques, définis par les coefficients de Floyd-Steinberg.
- -Le pixel en haut à gauche reste inchangé
- -Le pixel au-dessus reste inchangé
- -Le pixel en haut à droite reste inchangé
- -Le pixel à gauche reste inchangé
- -Le pixel à droite reçoit 7/16 de l'erreur.
- -Le pixel en bas à gauche reçoit 3/16 de l'erreur.
- -Le pixel en dessous reçoit 5/16 de l'erreur.
- -Le pixel en bas à droite reçoit 1/16 de l'erreur.
- -256 niveaux possibles : tous les entiers entre 0 et 255
- 16 niveaux possibles : [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255] Pour l'exemple, prenons un pixel qui a pour intensité 210 (dans l'image sur 8 bits), la valeur la plus proche parmi les 16 niveaux est 204, l'erreur de quantification est donc de +6.
ANNEXE B : documents de l'exercice 2
class Graphe:
def __init__(self, nb_sommets):
self.nb_sommets = nb_sommets
self.adjacence = [[] for _ in range(nb_sommets)]
def ajouter_arete(self, sommet1, sommet2, poids):
...

def bfs(graphe, sommet_depart):
"""
Parcours en largeur du graphe en partant du sommet de depart.
Renvoie un dictionnaire des distances depuis le sommet de depart.
"""
#le float('inf') ci-dessous signifie "la valeur infinie positive"
distances = {sommet: float('inf') for sommet in range(graphe.nb_sommets)}
distances[sommet_depart] = 0
file = [sommet_depart]
while file:
sommet_courant = file.pop(0)
for voisin, poids in graphe.adjacence[sommet_courant]:
if distances[voisin] == 0:
distances[voisin] = distances[sommet_courant] + poids
file. append(voisin)
return distances
ANNEXE B. 4 : fonction dijkstra
import heapq
def dijkstra(graphe, depart, cible):
distances = [float(’inf’)] * graphe.nb_sommets
predecesseurs = [None] * graphe.nb_sommets
distances[depart] = ...
tas = [(0, depart)]
while tas:
dist_courante, sommet = heapq.heappop(tas)
if sommet == ... :
break
if dist_courante > distances[sommet]:
continue
for voisin, poids in ... :
nouvelle_dist = dist_courante + poids
if nouvelle_dist < ...
distances[voisin] = nouvelle_dist
predecesseurs[voisin] = ...
heapq.heappush(tas, (nouvelle_dist, voisin))
chemin = []
s = cible
if distances[s] < ...
while s is not None:
chemin.append(...)
s = predecesseurs[...]
chemin.reverse()
return distances[cible], chemin
ANNEXE B. 5 : extrait de la documentation du module Python heapq
ANNEXE C : documents de l'exercice 3
Le système de sécurité fonctionne sur la base d'un ensemble de règles propositionnelles. Les variables propositionnelles sont les suivantes :
- -P : La porte porte est ouverte
- -M : Un détecteur de mouvement est activé
- -N : C'est la nuit
- -A : L'alarme est déclenchée
- -Règle 1 : L'alarme est déclenchée si la porte est ouverte pendant la nuit,
- -Règle 2 : l'alarme se déclenche quand un détecteur de mouvement est activé
- -Règle 3 : si la porte est fermée, l'alarme ne peut pas se déclencher durant la journée
| Symbole | Nom |
| ¬ | Négation |
|
|
Conjonction |
| V | Disjonction |
| → | Implication conditionnelle |
| ↔ | Equivalence logique |
| n° ligne | P | M | N | A | règle 1 | règle 2 | règle 3 |
| 1 | V | V | V | V | V | V | V |
| 2 | V | V | F | V | ? | ? | ? |
| 3 | V | F | F | F | ? | ? | ? |
| 4 | F | V | F | ? | ? | ? | ? |
| 5 | F | V | V | V | ? | ? | ? |
| 6 | F | F | V | F | ? | ? | ? |
| 7 | F | F | F | ? | V | V | V |
| 8 | V | F | V | ? | ? | ? | ? |
ANNEXE D : documents de l'exercice 4
- -REALISATEUR(*num, nom, prenom, paysOrigine)
- -FILM(*num, titre, anneeSortie, mumRealisateur, codeGenre, numDistributeur, resume)
- -GENRE(*code, genre)
- -DISTRIBUTEUR(*num, nom)
- -SPECTATEUR(*num, nom, prenom)
- -AVIS(*numFilm, *numSpectateur, commentaire, note, dateVisionnage)
| Symbole | Nom |
|
|
Sélection |
|
|
Projection |
| × | Produit cartésien |
| ✓ | Jointure |
| - | Différence |
|
|
Union |
|
|
Intersection |
| ÷ | Division |
Questions fréquentes
4 questionsSur quels chapitres porte cette épreuve d'admissibilité 2 du CAPES NSI 2026 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte cette épreuve d'admissibilité 2 du CAPES NSI 2026 ?
Elle porte sur la représentation binaire et les opérateurs bit à bit, les algorithmes de graphes (BFS, Dijkstra), la logique propositionnelle et les bases de données relationnelles avec le langage SQL.
Les quatre exercices sont-ils indépendants ?
Oui, les quatre exercices portent sur des thématiques informatiques distinctes (traitement d'image, graphes, logique, bases de données) et peuvent être traités séparément.
Faut-il maîtriser Python pour cette épreuve ?
Oui, plusieurs questions demandent d'écrire, corriger ou compléter des fonctions Python, notamment pour la conversion binaire, le dithering d'image, le parcours de graphe BFS et l'algorithme de Dijkstra.
Quel est l'objectif de l'exercice sur le système de sécurité ?
Il s'agit de traduire des règles de sécurité en logique propositionnelle, de repérer à l'aide d'une table de vérité une incohérence entre les règles, puis de proposer une correction et une extension du système avec un badge d'identification.
Pas de description pour le moment