تخطَّ إلى المحتوى الرئيسي
Wadifa Infoالوظيفة العمومية بالمغرب FR

نموذج المباراة الوطنية المشتركة CNC 2016: المعلوميات - شعبة MP وPSI وTSI لولوج مدارس المهندسين

🏢 المباراة الوطنية المشتركة CNC (الأقسام التحضيرية) 👤 مباراة ولوج المدارس العليا للمهندسين 🎯 المعلوميات 📅 2016 👁️ 30 مشاهدة

باختصار

هذا نموذج امتحان كتابي سابق لمباراة مباراة ولوج المدارس العليا للمهندسين لدى المباراة الوطنية المشتركة CNC (الأقسام التحضيرية) (2016)، منشور على وظيفة إنفو للاطلاع والتحميل المجاني بصيغة PDF مع تصحيح مقترح.

الجهة المنظمة
المباراة الوطنية المشتركة CNC (الأقسام التحضيرية)
الدرجة
مباراة ولوج المدارس العليا للمهندسين
التخصص
المعلوميات
الدورة
2016
عدد الصفحات
11
لغة الأسئلة
الفرنسية
التصحيح
تصحيح مقترح متوفر في هذه الصفحة
الموضوع الرسمي لاختبار المعلوميات في المباراة الوطنية المشتركة (CNC) دورة 2016 لولوج المدارس العليا للمهندسين والمؤسسات المماثلة، الخاص بطلبة الأقسام التحضيرية شعبة MP وPSI وTSI. يتضمن هذا النموذج 11 صفحة من نص الاختبار الأصلي. تجد في الموقع مواضيع باقي المواد والسنوات لنفس المباراة.
نموذج مباراة جديد كل يوم على قناة واتساب
هل أفادك؟ شاركه مع من يبحث
WhatsApp Facebook Telegram
تابع تحضيرك: 📄 نموذج المباراة الوطنية المشتركة CNC 20… 📄 نموذج المباراة الوطنية المشتركة CNC 20… 📄 نموذج المباراة الوطنية المشتركة CNC 20…
📝 نص أسئلة النموذج (مستخرج آلياً من الصفحات الممسوحة)

استُخرج هذا النص آلياً من صور الامتحان وقد يحتوي على أخطاء في القراءة — الصور أعلاه هي المرجع.

— صفحة 1 —
المملكة المغربية
‎ROYAUME DU MAROC‏

Ministère de l’Enseignement Supérieur de la Recherche
Scientifique de la Formation des Cadres

Présidence du Concours National Commun
Ecole Nationale Supérieure des Mines de Rabat

CONCOURS NATIONAL COMMUN
d’admission aux Etablissements de Formation d’Ingénieurs et
Etablissements Assimilés

Session 2016

ÉPREUVE D’INFORMATIQUE
Filières : MP/PSI/TSI

Durée 2 heures

Cette épreuve comporte 10 pages au format A4, en plus de cette page de garde
L’usage de la calculatrice est interdit

page de garde

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 2 —
Épreuve d'Informatique - Session 2016 - Filière MP/ PSI/ TSI

L’énoncé de cette épreuve, commune aux candidats des filières MP/ PSI/ TSI,
comporte 10 pages.
L'usage de la calculatrice est interdit .

Les candidats sont informés que la précision des raisonnements algorithmiques ainsi que le soin
apporté à la rédaction et à la présentation des copies seront des éléments pris en compte dans
la notation. Il convient en particulier de rappeler avec précision les des questions
abordées. Si, au cours de l'épreuve, un candidat repère ce qui peut lui sembler être une erreur
d'énoncé, il le signale sur sa copie et poursuit sa composition en expliquant les raisons des
initiatives qu’il est amené à prendre.

Remarques générales :

- L'épreuve se compose de deux problèmes indépendants.

- Toutes les instructions et les fonctions demandées seront écrites en Python.

- Les questions non traitées peuvent être admises pour aborder les questions ultérieures.
- Toute fonction peut être décomposée, si nécessaire, en plusieurs fonctions

PROBLÈME 1 : CALCUL SCIENTIFIQUE

Méthodes à un pas :

Nous allons nous intéresser dans ce problème, à quelques méthodes permettant de résoudre
numériquement les équations différentielles du premier ordre, avec une condition initiale,
sous la forme :

On note 1 =] t, to + 1] l'intervalle de résolution. Pour un nombre de noeuds N donné, soit
th = to + nh, avec n = 0,1,2,..., N, une suite de noeuds de I induisant une discrétisation de
I en sous-intervalles I = [tn, tn+1]. La longueur h de ces sous-intervalles est appelée pas de
discrétisation, le pas h de discrétisation est donné par h = = Soit y; l’'approximation au
noeud ?; de la solution exacte y(t;). Les méthodes de résolution numériques, étudiées dans
ce problème, s'écrire sous la forme :

Yns1 = Yn+h®(th, Yn, h)
‏جربو‎ +7

page 1 sur 10 imp |

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 3 —
Épreuve d'Informatique - Session 2016 - Filière MP/ ‏/ا05‎ TSI

Avec

où a, sont des constantes comprises entre 0 et 1.

Question 1 :

Pour quelles valeurs du couple («,B) retrouve-t-on la méthode d’Euler ?

Dans la suite on considère une deuxième méthode dite de Heun, cette méthode correspond
aux valeurs du couple (a,B) = ( ; ; } ).

Question 2 :

Écrire une fonction de prototype def Heun(f, to, yo, T, N) : qui prend en paramètres la fonction
f : (t,y) — f(t, y), la condition initiale ‏,و‎ yo la valeur de f en % le nombre de nœuds N et
la valeur final du temps 1 et qui retourne deux listes tt = [fo, f1,.…, fn] et Yn = (Vo, V1,» YN]
donné par le schéma :

Yns1= Yn+R®(th, Yn.h)
tn = th+h

Avec

1 1

Le pas de discrétisation h est donné par h= = :

Remarque : La valeur retournée par la fonction Heun pourra être un couple constitué de deux
listes, un tableau constitué de deux listes (par exemple un type array du module numpy) ou
tout autre structure de données constitué de deux listes.

Application au circuit RLC :

FIGURE 1: circuit RLC

On souhaite travailler sur un circuit RLC en série qui sera constitué des éléments suivants : une
résistance R(10), une inductance L(1H), une capacité C(1F) et un générateur qui délivrera une
source de tension sinusoïdale V(f) = cos(2x1).

On s'intéresse à la tension ‏نآ‎ aux bornes de la bobine qui satisfait l'équation différentielle :

page 2 sur 10 1m

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 4 —
Épreuve d'Informatique - Session 2016 - Filière MP/ PSI/ TSI

Question 3 :

Écrire une fonction de prototype def Euler(f, to, T, yo, N) : qui prend en paramètres la fonction
f :(t,y)— f(t, y), la condition initiale to, la valeur de f en ‏رن‎ le nombre de nœuds N et la valeur
final du temps 1 et qui retourne deux listes tt = [to, ‏...بق‎ fn] et Yp = (Yo, Y1,-» YN] donné par
le schéma d'Euler permettant de résoudre des équations différentielles du premier ordre.
Question 4 :

Donner la complexité de la fonction d’Euler en expliquant le descriptif du calcul.

On considère les valeurs suivantes : y(t) = U;(t) et z(t) = Ü;(t) . L’équation différentielle (I) est
du second ordre.

Question 5 :

Définissez un système de deux équations différentielles du premier ordre qui puisse satisfaire
l’équation (D).

Question 6 :

En posant Y(#) = [U;(t),Ü;(t)], montrez que l’équation (I) peut s’écrire sous la forme :
avec F : t,X — F(t,X) est une fonction à préciser (X = [X[0],X[1]}).

Question 7 :

Implémenter en Python l’équation différentielle (II) en utilisant la fonction odeint0 du module
scipy.integrate, la méthode d’Euler et celle de Heun. On affichera dans une même fenêtre le
résultat de ses trois méthodes avec les valeurs suivantes :

N = 1000, # = 0,T = 3, U;(0) = 0 et Ü;(0) = 0. Voir les résultats sur la figure 1 se trouvant dans
l'annexe du document.

On ajoutera quatre types d'informations :

le titre de la figure : ’circuit RLC, tension bobine’

- un label associé à l’axe des abscisses : temps (s)'

— un label associé à l’axe des ordonnées : tension (mV)'

— une légende associée au graphique : ' 0461717 associé à la méthode d’odeint
— une légende associée au graphique : Euler’ associé à la méthode d’Euler

- une légende associée au graphique : 'Heun' associé à la méthode d’Heun

page 3 sur 10 im

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 5 —
Épreuve d'Informatique — Session 2016 — Filière MP/ PSU/ TSI

PROBLÈME II : PROGRAMMATION

Remarque 2.1 Dans ce problème il ne sera pas possible d'utiliser les méthodes de la classe String
suivantes : capitalize(, upper0, lowerO, 0100460, 76014060, swapcase(), translate() . Par contre
l'utilisation des autres méthodes est possible comme la méthode index0.

Nous allons nous intéresser au code de Vigenère (1523-1596) qui est plus robuste que le code
de César, le premier code reconnu comme élément à coder les messages. Nous considérons
dans ce problème uniquement l'alphabet de la langue française. On ne s’intéressera qu’aux
caractères visibles. On ne prendra pas en compte les ligatures comme par exemple ‏ع‎ ou æ. On
ne s'intéresse qu’à des textes composés uniquement de majuscules, les 26 lettres de l’alphabet.
Tout autre caractère sera supprimé du texte initial.

Le code de César repose sur une substitution mono alphabétique particulière, c’est-à-dire
qu’on remplace une lettre de l’alphabet par une autre en utilisant une clé. Chaque lettre de
l’alphabet a une valeur entière (A=0, B=1, C=2, D=3, …, K=10, .... T=19, …, Z=25) que l’on
ajoute à une clé modulo 26 ) x = ymod26 x = y[26]). Par exemple : si la clé est K (sa
valeur est 10, position de la lettre K dans l'alphabet), la lettre T aura comme valeur chiffrée :
19+ 10710426 = 29710426 = 3, soit le caractère D.

Le code de Vigenère est construit sur le même principe mais il permet de donner une réponse
au point faible du code de César, à savoir l'analyse des fréquences de l’apparition des lettres.
Le code de Vigenère utilise des clés plus longues que celui de César. Le principe est que chaque
lettre peut être codée de plusieurs façons. Par exemple, prenons une clé de dimension 3 (son
nombre de lettres). Soit ABC’ cette clé alors toutes les lettres en position 3k seront codées selon
le code de César avec ‏لذ"‎ comme clé, toutes les lettres en position 3k + 1 seront codées avec la
clé ’B’ et toutes les lettres en position 3k + 2 avec la clé ’C’.

Par exemple : comment chiffrer le texte "c’est un bel été" avec la clé ’ABC’ ?

Avant d'appliquer le code de Vigenère le texte en clair sera converti en majuscules et ceci sans
aucune lettre accentuée ni d’espacement ni autre caractère.

Le texte sera donc transformé en : "CESTUNBELETE".

Appliquons le codage de Vigenère : la clé sera répétée autant de fois que nécessaire afin que
le texte composé de la répétition globale ou partielle de la clé soit de même taille que le texte
initial.

On applique le code de César à chaque lettre du texte en clair associée à une lettre de la clé.
Par exemple si on prend la deuxième lettre du texte en clair soit ’E’ (indice 4 de l’alphabet),
associée à la lettre correspondante de la clé, soit ’B’ (indice 1), le chiffré est calculé comme :

page 4 sur 10 im

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 6 —
Épreuve d'Informatique — Session 2016 - Filière MP/ PSU/ TSI

Texte en clair: CESTUNBELETE
Laclé:  ABCABCABCABC

Texte crypté: CFUTVPBFNEUG

TABLE 2.1: Un message crypté

4 + 1mod 26 = 5, soit la lettre 5 On réitère le processus sur l’ensemble des autres lettres du
texte en clair. Voir la table 2.1 pour la description du mécanisme.

Première partie
Dans la suite du problème nous utiliserons la phrase suivante définie à l’aide de la variable
texte.
In [1] : texte = "Hey Hey, cet été là, le gang des niçois a été arrêté !"
In [2] : texte

Out(3] : "Hey Hey, cet été là, le gang des niçois a été arrêté !
Question 8 :

Écrire une fonction enMajuscule(CH) qui transforme tous les caractères de la chaine de carac-
tères CH passée en tant que paramètres en une chaine composée uniquement de majuscules.
On transformera tous les caractères accentués en majuscules non accentuées. Par exemple le
caractère ‏ا‎ sera transformé en caractère ’l’. Tous les autres caractères seront conservés comme
par exemple les caractères de ponctuation.

À titre indicatif voici la liste des caractères accentués : 286888116 ‏.لإنا0‎ On ajoutera à cette liste

le caractère ‏؟‎ (c cédille). Attention on ne pourra pas utiliser la méthode upper() de la classe
String pour traiter cette question et les suivantes.

Exemple :
In [4] : enMajuscule(texte)
Out{[5] : "HEY HEY, CET ÉTÉ LA, LE GANG DES NICOIS A ETE ARRETE !'

Question 9 :

Écrire la fonction majusculesSeules(CH) qui prend une chaine de caractères CH, comme pa-
ramètre et retourne une chaine de caractères composée uniquement des lettres de l’alphabet :
ABCDEFGHIJKLMNOPQRSTUVWXYZ.

Exemple :
In [6] : majusculesSeules(texte)
Out[7] :’HEYHEYCETETELALEGANGDESNICOISAETEARRETE”

Question 10:

Écrire la fonction vigenereEncode(CH,CL) qui a deux paramètres de type chaine de caractères,
la chaine de caractères CH, à encoder suivant le critère de Vigenère et la clé CL . Cette fonction
retourne la chaine encodée.

page 5 sur 10 imp

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 7 —
Épreuve d' Informatique — Session 2016 - Filière MP/ PSI/ TSI

Remarque : la clé sera uniquement composée de lettres de l’alphabet :
ABCDEFGHIJKLMNOPQRSTUVWXYZ.

Exemple :
In [8] : vigenereEncode(texte, "ABC")
Out[9] :’HFAHFACFVEUGLBNEHCNHFETPIDQITCEUGASTEUG'

Question 11 :

Calculer la complexité de la fonction vigenereEncode().

Question 12 :

Écrire la fonction vigenereEncode() de manière récursive. On nommera cette fonction
vigenereEncodeRec() qui comportera autant de paramètres que nécessaire. Vous devez chan-
ger et commenter les différents paramètres d'entrées que vous allez utiliser,

Pour cette question le texte à traiter ne sera composé que de lettres de l’alphabet :
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Question 13 :

Calculer la complexité de la fonction vigenereEncodeRec().

Question 14 :

Écrire la fonction vigenereDecode(CH, CL) qui a deux paramètres de type chaines de caractères :
la chaîne de caractères CH, à décoder suivant le critère de Vigenère et la clé CL. Cette fonction
retourne le message en clair.

Exemple :
In [10] : vigenereDecode("HFAHFACFVEUGLBNEHCNHFETPI DQITCEUGASTEUG", "ABC")
Out[11] :'HEYHEYCETETELALEGANGDESNICOISAETEARRETE

Question 15 :

Indiquer comment on doit choisir la clé afin que le message soit considéré comme robuste à
une personne malveillante qui voudrait cracker ce message.

Seconde partie

On s'intéresse maintenant à la manière de casser le code de Vigenère, c’est-à-dire à partir du
texte crypté de pouvoir déterminer la clé. On peut remarquer que le codage d’une même lettre
du texte à crypter avec une lettre se trouvant à une même position de la clé est toujours le
même. Ainsi si p est la longueur de la clé utilisée pour coder un texte on peut remarquer que
toutes les lettres identiques aux positions ‏م + 1 +ع‎ avec0‹ 1 ‹ p-— 1 sont codées par la même
lettre pour une valeur / spécifique. Une analyse des fréquences pour les différentes valeurs de
I nous permet alors, de deviner la clé utilisée. La table 2.1 donne un exemple d'un message
crypté avec une clé de longueur 3. Si la clé est de longueur p, on aura p lettres pour crypter le
message. La première lettre du message sera cryptée à l’aide de la première lettre de la clé. La
seconde lettre du message sera cryptée à l'aide de la seconde lettre de la clé, et ainsi de suite.

page 6 sur 10 imp |

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 8 —
Épreuve d'Informatique — Session 2016 - Filière MP/ PSI/ TSI

0 p 2*p ni k*p

1 1+p 1+2*0 2 … 1+kp
2 2+p 2+2*p … 2+kp

TABLE 2.2: Mécanisme de cryptage

Tous les caractères du message distants de p caractères utiliseront une même lettre de la clef
pour réaliser le chiffrement. La table 2.2 présente le mécanisme d’un tel chiffrement. Il est
possible d'utiliser p lettres différentes pour coder chacune des séquences, cela dépend de la
nature de la clé.

Afin de simplifier le problème nous considérerons, par la suite, que la dimension de la clé est
connue. Nous allons mettre en œuvre une méthode relativement simple qui ne fonctionnera
que dans un cadre bien spécifique. Voici un message crypté dont vous devez retrouver la clé :
message = ’HFAHFACFVEUGLBNEHCNHFETPIDQITCEUGASTEUG”

Question 16 :

Écrire une fonction sousChaines(CH,d,p) qui prendra en compte trois paramètres : CH le texte
à déchiffrer, d le déplacement (c’est-à-dire la lettre utilisée de la clé) et p la dimension de la
clé. Cette fonction retourne une chaîne de caractères. Par exemple : à l’indice d de la clé on va

extraire du texte chiffré tous les caractères qui sont espacés d’une distance p, la dimension de
la clé.

Autrement dit cette fonction rend la sous chaîne composée des caractères du texte aux indices
d, 4+ p, 4+ 2p, etc.

Exemple :
In [12] : sousChaines(message, 1,3)
Out[13] :’FFFUBHHTDTUSU"”

Question 17 :

Écrire la fonction listeDesSousChaines(CH, d) qui prendra en compte deux paramètres, CH le
texte crypté et d la dimension de la clé. Cette fonction retourne comme valeur un tableau avec
l’ensemble de toutes les sous-chaines définies à la question précédente.

Exemple :
In [14] : listeDesSousChaines(message, 3)

Out[15] : l’HHCELENEIEAE) ’FFFUBHHTDTUSU", 'AAVGNCFPQCGTG"]

Question 18 :

C’est le caractère ’E’ qui apparaît le plus souvent dans un texte français. Les caractères suivants,
les plus fréquents, sont dans l’ordre [’A, ’S’ T, ’T’, ’N’]. Nous nous limiterons uniquement
au caractère ’E’. Dans chaque sous-chaine de caractères constituée à la question précédente

page 7 sur 10 imp

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 9 —
Épreuve d'Informatique — Session 2016 - Filière MP/ PSI/ TSI

il suffit de connaître la fréquence des caractères afin de déterminer quel est le caractère qui
apparaît le plus. Chacun de ces caractères correspond à un chiffrement déterminé à partir du
caractère ’E’.

Écrire la fonction frequenceCaracteres(CH) qui prend comme paramètre un texte crypté CH et
retourne comme valeur un tableau constitué des fréquences de chaque caractère de l’alphabet
de ce texte.

Exemple :
In [16] : frequenceCaracteres(message)

Question 19 :

À l’aide de la question précédente écrire une fonction qui permettra l'extraction de la clé. Afin
de simplifier le traitement on fera référence uniquement à la lettre ’E’ comme le caractère qui
apparaît le plus dans le texte en clair.

Cette fonction que l’on nomme code(CH,p) a deux paramètres : CH le texte crypté et p la
longueur de la clé. cette fonction retourne une chaine de caractères, la valeur de la clé.

Exemple :
In [18] : code(message, 3)
Out[19] :’ABC’

On retrouve bien la clé initiale à partir du texte crypté.

| page 8 sur 10 im

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 10 —
Épreuve d'Informatique — Session 2016 - Filière MP/ PSI/ TSI

Annexe

A) Image du document

0 Circui RLC

tension(mV)

80 0.5 10 1.5 2.0 2.5 3.0
temps(s)

FIGURE 1: circuit RLC

B) Syntaxe de quelques fonctions du langage Python

1) matplotlib.pyplot.xlabel

matplotlib.pyplot.xlabel(s, *args, **kwargs)

Parameters: s: string.

Returns : Set the x axis label of the current axi.

2) matplotlib.pyplot.ylabel

matplotlib.pyplot.ylabel(s, *args, **kwargs)

Parameters: s:string.

Returns : Set the y axis label of the current axi.

page 9 sur 10 im

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

— صفحة 11 —
Épreuve d'Informatique — Session 2016 - Filière MP/ PSI/ TSI

3) matplotlib.pyplot.plot
matplotlib.pyplot.plo(*args, **kwargs)

Parameters: *args:
args is a variable length argument, allowing for multiple x, y pairs with an optional
format string.
y0 : array
Initial condition on y (can be a vector).

character : description
'-' : solid line style
"› : dashed line style
*-} : dash-dot line style
* : : dotted line style
: point marker
‏:أ‎ pixel marker
"o’ : circle marker
"v’ : triangle_down marker
character : color
"b’: blue
’g’ : green
T’:red

Returns Return value is a list of lines that were added.

4) scipy.integrate.odeint

scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full output=0,
mi=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0,
mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0)

5) matplotlib.pyplot.legend

matplotlib.pyplot.legend(*args, **kwargs)

Parameters :

Returns : Places a legend on the axes.
To make a legend for lines which already exist on the axes (via plot for instance),
simply call this function with an iterable of strings, one for each legend item.

6) matplotlib.pyplot.title

matplotlib.pyplot.title(s, *args, **kwargs)

FIN DE 112018

page 10 sur 10 HN

نماذج المباريات من موقع وظيفة إنفو ‎wadifa-info.com‏

✅ التصحيح المقترح

هذا تصحيح مقترح من إعداد فريق wadifa-info لمساعدتك على فهم منهجية الإجابة — وليس تصحيحاً رسمياً صادراً عن الإدارة المنظِّمة. أسئلة هذا الامتحان محررة بالفرنسية، لذلك التصحيح محرر بالفرنسية أيضاً.

Ce sujet est l'épreuve d'informatique du Concours National Commun (CNC) 2016, commune aux filières MP, PSI et TSI, pour l'admission dans les écoles d'ingénieurs marocaines (présidence : École Nationale Supérieure des Mines de Rabat). Durée : 2 heures, calculatrice interdite, 10 pages, tout en Python. Il comporte deux problèmes indépendants : Problème I, calcul scientifique (méthodes à un pas d'Euler et de Heun, application à un circuit RLC, comparaison avec odeint) et Problème II, programmation (chiffrement de Vigenère : normalisation du texte, codage itératif et récursif, décodage, cassage par analyse de fréquences). Voici une correction méthodologique proposée.

💡 Avant de commencer : le problème II (questions 8 à 19) est long mais très mécanique : ce sont des parcours de chaînes avec des indices modulo 26 et modulo p. Donnez-lui environ 1 h 10. Dans le problème I, faites Euler et Heun avec des tableaux numpy : le même code sert alors pour une équation scalaire et pour le système d'ordre 2 de la question 7. Rappelez-vous que upper(), lower(), replace()… sont interdits dans le problème II : il faut travailler avec ord/chr ou des chaînes de référence et index().

Problème I — Calcul scientifique : méthodes à un pas

Schéma général : yn+1 = yn + h·Φ(tn, yn, h), tn+1 = tn + h, h = T/N, avec Φ(t, y, h) = α·f(t, y) + β·f(t + h, y + h·f(t, y)).

Question 1 — Euler

Euler explicite s'écrit yn+1 = yn + h·f(tn, yn), donc Φ = f : (α, β) = (1, 0). Heun correspond à (1/2, 1/2) : moyenne de la pente au début du pas et de la pente prédite à la fin du pas (méthode d'ordre 2).

Question 2 — fonction Heun

import numpy as np
def Heun(f, t0, y0, T, N):
    h = T / N
    tt = [t0]
    yh = [np.array(y0, dtype=float)]    # marche pour un scalaire ou un vecteur
    for n in range(N):
        t, y = tt[-1], yh[-1]
        k1 = f(t, y)
        k2 = f(t + h, y + h * k1)
        yh.append(y + h * (k1 + k2) / 2)
        tt.append(t + h)
    return tt, yh

On renvoie le couple (tt, yh) de N+1 valeurs chacun. Calculer f(t, y) une seule fois par pas (k1) évite une évaluation inutile.

Question 3 — fonction Euler

def Euler(f, t0, T, y0, N):    # attention : ordre des paramètres imposé, différent de Heun
    h = T / N
    tt = [t0]
    yh = [np.array(y0, dtype=float)]
    for n in range(N):
        yh.append(yh[-1] + h * f(tt[-1], yh[-1]))
        tt.append(tt[-1] + h)
    return tt, yh

Question 4 — complexité d'Euler

Avant la boucle : un nombre constant d'opérations. La boucle fait N itérations ; chacune comporte une évaluation de f, une multiplication, une addition et deux ajouts en fin de liste (append en O(1) amorti). Si le coût de f est constant (dimension d fixée), la complexité est O(N) en temps et O(N) en mémoire (on stocke les N+1 points). Heun est aussi en O(N), avec deux évaluations de f par pas.

Question 5 — système du premier ordre

L'équation (I) est Ül + U̇l + Ul = −4π2 cos(2πt). Avec y = Ul et z = U̇l :

y'(t) = z(t)
z'(t) = −z(t) − y(t) − 4π2 cos(2πt)
, avec y(0) = 0 et z(0) = 0.

Question 6 — forme vectorielle Y' = F(t, Y)

Avec Y(t) = [Ul(t), U̇l(t)], on a Y'(t) = [U̇l, Ül] = [Y[1], −Y[1] − Y[0] − 4π2 cos(2πt)]. Donc F(t, X) = [X[1], −X[0] − X[1] − 4π2 cos(2πt)].

def F(t, X):
    return np.array([X[1], -X[0] - X[1] - 4 * np.pi**2 * np.cos(2 * np.pi * t)])

Question 7 — comparaison odeint / Euler / Heun

from scipy.integrate import odeint
import matplotlib.pyplot as plt
N, t0, T = 1000, 0, 3
Y0 = [0, 0]    # U(0) = 0, U'(0) = 0
t = np.linspace(t0, t0 + T, N + 1)
sol = odeint(lambda X, s: F(s, X), Y0, t)    # odeint attend func(y, t) : on inverse l'ordre
tE, yE = Euler(F, t0, T, Y0, N)
tH, yH = Heun(F, t0, Y0, T, N)
plt.plot(t, sol[:, 0])
plt.plot(tE, [y[0] for y in yE])    # première composante = U
plt.plot(tH, [y[0] for y in yH])
plt.title('circuit RLC, tension bobine')
plt.xlabel('temps (s)')
plt.ylabel('tension (mV)')
plt.legend(['Odeint', 'Euler', 'Heun'])
plt.show()

Points notés : l'ordre des arguments (odeint appelle func(y, t) alors que F est écrite F(t, X)), le tracé de la première composante seulement (Ul, pas sa dérivée), et les trois informations titre / axes / légende dans l'ordre des tracés. Avec h = 3·10−3, Heun et odeint sont pratiquement superposés, Euler s'en écarte légèrement (ordre 1).

Remarque sur la figure de l'annexe : avec R = 1 Ω, L = 1 H, C = 1 F, le régime forcé de (I) a une amplitude d'environ 4π2/√((1 − 4π2)2 + 4π2) ≈ 1, alors que la figure descend vers −12. L'allure de la figure ne peut donc pas servir à contrôler les valeurs numériques ; seul le code est demandé.

Problème II — Programmation : le chiffre de Vigenère

Outils communs (sans upper/lower/replace) :

ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ACC = 'àâäéèêëîïôöùûüÿç'    # minuscules accentuées + ç
SANS = 'AAAEEEEIIOOUUUYC'    # majuscule sans accent correspondante (même position)

Question 8 — enMajuscule(CH)

def enMajuscule(CH):
    r = ''
    for c in CH:
        if 'a' <= c <= 'z':
            r = r + chr(ord(c) - 32)    # 'a' = 97, 'A' = 65
        elif c in ACC:
            r = r + SANS[ACC.index(c)]
        else:
            r = r + c    # majuscules, espaces, ponctuation conservés
    return r

Résultat : 'HEY HEY, CET ETE LA, LE GANG DES NICOIS A ETE ARRETE !'. L'exemple imprimé montre « ÉTÉ » avec accents : c'est une coquille de l'énoncé, puisqu'il demande de supprimer les accents (et « été » est en minuscules dans le texte).

Question 9 — majusculesSeules(CH)

def majusculesSeules(CH):
    r = ''
    for c in enMajuscule(CH):
        if c in ALPHA:
            r = r + c
    return r

On obtient bien 'HEYHEYCETETELALEGANGDESNICOISAETEARRETE' (39 lettres).

Question 10 — vigenereEncode(CH, CL)

def vigenereEncode(CH, CL):
    T = majusculesSeules(CH)
    p = len(CL)
    r = ''
    for i in range(len(T)):
        v = (ALPHA.index(T[i]) + ALPHA.index(CL[i % p])) % 26
        r = r + ALPHA[v]
    return r

La lettre i du texte est chiffrée avec la lettre i mod p de la clé (répétition de la clé). Vérification : vigenereEncode(texte, "ABC") donne exactement 'HFAHFACFVEUGLBNEHCNHFETPIDQITCEUGASTEUG' (H+0 = H, E+1 = F, Y+2 = 24+2 = 26 ≡ 0 = A, …).

Question 11 — complexité de vigenereEncode

Soit n la longueur de CH. La normalisation parcourt CH une fois avec des recherches dans des chaînes de taille constante (ACC, ALPHA) : O(n). La boucle de chiffrement fait au plus n itérations, chacune avec deux index() sur 26 lettres (coût borné) et un modulo : O(n). Complexité : O(n), à condition de compter la concaténation r + c comme O(1) (vrai en pratique en CPython ; au pire O(n2) si chaque concaténation recopie la chaîne — on l'évite en construisant une liste puis ''.join).

Question 12 — version récursive

def vigenereEncodeRec(CH, CL, i=0):
    # CH : reste du texte à chiffrer (lettres majuscules uniquement)
    # CL : clé complète ; i : position dans le texte d'origine de CH[0]
    if CH == '':    # cas de base : plus rien à chiffrer
        return ''
    v = (ALPHA.index(CH[0]) + ALPHA.index(CL[i % len(CL)])) % 26
    return ALPHA[v] + vigenereEncodeRec(CH[1:], CL, i + 1)

Le paramètre supplémentaire i remplace le compteur de boucle : il permet de savoir quelle lettre de la clé utiliser. Appel : vigenereEncodeRec('HEYHEY…', 'ABC') ; on obtient le même résultat que la version itérative.

Question 13 — complexité de la version récursive

Il y a n + 1 appels. Chaque appel fait un travail constant pour le chiffrement, mais le découpage CH[1:] recopie n − 1, n − 2, … caractères, et la concaténation du résultat aussi : Σ k = n(n+1)/2, soit O(n2). En passant le texte entier et l'indice i sans découper (CH[i] au lieu de CH[0]), le nombre d'opérations élémentaires redevient O(n) hors concaténation. La pile d'appels est de profondeur n (limite par défaut de Python ≈ 1000 appels : inadapté aux longs textes).

Question 14 — vigenereDecode(CH, CL)

def vigenereDecode(CH, CL):
    p = len(CL)
    r = ''
    for i in range(len(CH)):
        v = (ALPHA.index(CH[i]) - ALPHA.index(CL[i % p])) % 26
        r = r + ALPHA[v]
    return r

On soustrait la valeur de la lettre de clé modulo 26 ; en Python, % renvoie toujours un résultat entre 0 et 25, même si la différence est négative. On retrouve 'HEYHEYCETETELALEGANGDESNICOISAETEARRETE'.

Question 15 — choix d'une clé robuste

  • Clé longue : plus p est grand, plus chaque sous-texte (lettres distantes de p) est court et moins l'analyse de fréquences est fiable. L'idéal est une clé aussi longue que le message.
  • Aléatoire, sans mot du dictionnaire ni motif répétitif (une clé comme « AAA » revient à un César, « ABCABC » à une clé de longueur 3).
  • Utilisée une seule fois : clé aléatoire, de la longueur du message et jamais réutilisée = masque jetable (Vernam), qu'on ne peut pas casser par l'analyse des fréquences.

Question 16 — sousChaines(CH, d, p)

def sousChaines(CH, d, p):
    r = ''
    for i in range(d, len(CH), p):    # indices d, d+p, d+2p, …
        r = r + CH[i]
    return r

(Équivalent en une ligne : return CH[d::p].) sousChaines(message, 1, 3) donne 'FFFUBHHTDTUSU'.

Question 17 — listeDesSousChaines(CH, d)

def listeDesSousChaines(CH, d):    # d = longueur de la clé
    return [sousChaines(CH, i, d) for i in range(d)]

Résultat : ['HHCELENEIIEAE', 'FFFUBHHTDTUSU', 'AAVGNCFPQCGTG']. Chaque sous-chaîne est chiffrée par un simple César (une seule lettre de clé).

Question 18 — frequenceCaracteres(CH)

def frequenceCaracteres(CH):
    f = [0] * 26
    for c in CH:
        f[ALPHA.index(c)] = f[ALPHA.index(c)] + 1
    return f

Sur le message complet on obtient [3,1,3,1,5,4,3,4,2,0,0,1,0,2,0,1,1,0,1,3,3,1,0,0,0,0], conforme à l'exemple (5 'E', 4 'F', 4 'H', …). Ce sont des effectifs ; on peut diviser par len(CH) pour des fréquences relatives. Coût O(n).

Question 19 — code(CH, p) : extraction de la clé

Principe : dans la sous-chaîne numéro i, la lettre la plus fréquente est supposée être le chiffré de 'E' (valeur 4). Si elle a la valeur m, la lettre de clé vaut (m − 4) mod 26.

def code(CH, p):
    cle = ''
    for s in listeDesSousChaines(CH, p):
        f = frequenceCaracteres(s)
        m = f.index(max(f))    # lettre la plus fréquente (la première en cas d'égalité)
        cle = cle + ALPHA[(m - 4) % 26]
    return cle

Déroulé sur le message : sous-chaîne 0 → 'E' apparaît 5 fois, m = 4, clé 'A' ; sous-chaîne 1 → 'F' et 'U' à égalité (3 fois), index() retient 'F', m = 5, clé 'B' ; sous-chaîne 2 → 'G' (3 fois), m = 6, clé 'C'. On obtient 'ABC'. L'égalité dans la sous-chaîne 1 montre bien que la méthode « ne fonctionne que dans un cadre spécifique » : sur un texte court, elle peut se tromper ; on la fiabilise en comparant tout le profil de fréquences (E, A, S, I, T, N) plutôt que le seul maximum.

💡 À retenir pour le CNC informatique : les schémas d'Euler (ordre 1) et de Heun (ordre 2) écrits de façon vectorielle avec numpy, le passage d'une équation d'ordre 2 à un système Y' = F(t, Y), la signature func(y, t) de odeint, et la mise en forme matplotlib (title, xlabel, ylabel, legend). Pour la partie programmation, entraînez-vous aux manipulations de chaînes sans méthodes toutes faites (ord/chr, index, modulo), aux versions récursives avec un paramètre d'indice, au calcul de complexité (attention au coût caché des découpages CH[1:]) et aux chiffrements classiques : César, Vigenère, analyse de fréquences.

أسئلة شائعة حول هذا النموذج

هل يمكن تحميل هذا النموذج مجاناً؟
نعم. صفحات هذا النموذج (11) متاحة للاطلاع والتحميل مجاناً، وبدون تسجيل أو إنشاء حساب.
هل يتضمن هذا النموذج التصحيح؟
نعم. تجد في هذه الصفحة، أسفل صفحات الأسئلة، تصحيحاً مقترحاً يشرح منهجية الإجابة والعناصر المنتظرة، من إعداد فريق وظيفة إنفو.
ما هي الجهة المنظمة والدرجة المعنية بهذا النموذج؟
هذا النموذج من مباراة نظمتها المباراة الوطنية المشتركة CNC (الأقسام التحضيرية). ويخصّ درجة: مباراة ولوج المدارس العليا للمهندسين.
ما هي دورة هذا الامتحان ولغة أسئلته؟
الدورة: 2016. والأسئلة باللغة الفرنسية.
أين أجد نماذج أخرى لنفس المباراة؟
جمعنا نماذج نفس العائلة في صفحة ولوج المدارس والمعاهد العليا: /نماذج-مباريات/المدارس-والمعاهد-العليا، مرتّبة حسب الدورة من الأحدث إلى الأقدم.

💬 ناقش هذا النموذج (0)

شارك إجاباتك أو صحّح التصحيح — إذا كان لديك رأي مختلف حول أي نقطة، اكتبه هنا ليستفيد باقي المترشحين.

لا يوجد نقاش بعد — شارك إجابتك أو سؤالك حول هذا النموذج.

⚠️ ممنوع نشر أرقام الهاتف أو الروابط أو أي عرض مقابل مال — تُحذف هذه المشاركات تلقائياً.

المصدر: مباريات ولوج المدارس والمعاهد العليا

📲
ثبّت تطبيق وظيفة إنفو على جهازك: اضغط زر المشاركة في أسفل سفاري، ثم اختر إضافة إلى الشاشة الرئيسية. تصلك المباريات الجديدة بسرعة ودون متصفح.