Skip to content

Commit 121c2db

Browse files
committed
Add January exam
1 parent 2ea5378 commit 121c2db

8 files changed

Lines changed: 573 additions & 0 deletions

File tree

Exams/2026_01/diffie.jl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function modinv(a, n)
2+
g, x, y = gcdx(a, n)
3+
return mod(x, n)
4+
end
5+
6+
function smallest_primitive_root(p)
7+
for g in 2:(p-1)
8+
if length(Set(g.^(0:(p-2)) .% p)) == p-1
9+
return g
10+
end
11+
end
12+
error("$p has no primitive root")
13+
end
14+
15+
n = 4
16+
p = n^2 + 1
17+
g = smallest_primitive_root(p)
18+
inv_g = modinv(g, p)
19+
20+
gi = g.^(0:(n-1)) .% p
21+
gj = g.^(0:n:(n^2-n)) .% p
22+
inv_gj = inv_g.^(0:n:(n^2-n)) .% p
23+
24+
25+
sort(vec(gi .* gj' .% p))
26+
27+
a = 3
28+
b = 5
29+
30+
A = g^a % p
31+
B = g^b % p
32+
33+
K = A^b % p
34+
K2 = B^a % p
35+
36+
println(K)
37+
println(K2)

Exams/2026_01/diffie.tex

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
\titledquestion{Cryptographie}
2+
3+
Alice et Bob veulent communiquer de manière sécurisée.
4+
Ils utilisent le protocole de Diffie-Hellman pour échanger une clé secrète.
5+
Ils choisissent un nombre premier $p = 17$ et une racine primitive $g = 3$ modulo $p$.
6+
Alice choisit un nombre secret $a$ et envoie $A = g^a \mod p$ à Bob.
7+
Vous arrivez à intercepter la valeur de $A$, $A = 7$.
8+
9+
\begin{parts}
10+
\part Que valent les puissances $g^2, g^3$ modulo $p$ ?
11+
\begin{solutionbox}{2.5cm}
12+
$g^2 = 9$ et $g^3 = 27 \equiv 10 \pmod{17}$.
13+
\end{solutionbox}
14+
15+
\part Quel est l'inverse $g^{-1}$ de $g$ modulo $p$ ?
16+
\begin{solutionbox}{2.5cm}
17+
$g^{-1} = 6$ car $3 \cdot 6 \equiv 1 \pmod{17}$.
18+
\end{solutionbox}
19+
20+
\part Que valent les puissances $g^{-4}, g^{-8}, g^{-12}$ modulo $p$ ?
21+
\begin{solutionbox}{5cm}
22+
\begin{align*}
23+
g^{-2} = 6^2 \equiv 36 \equiv 2 \pmod{17}\\
24+
g^{-4} = 2^2 \equiv 4 \pmod{17}\\
25+
g^{-8} = 4^2 \equiv 16 \equiv -1 \pmod{17}\\
26+
g^{-12} = -1 \cdot 4 \equiv 13 \pmod{17}
27+
\end{align*}
28+
\end{solutionbox}
29+
30+
\part Que valent les produit $Ag^{-4}$, $Ag^{-8}$ et $Ag^{-12}$ modulo $p$ ?
31+
\begin{solutionbox}{5cm}
32+
\begin{align*}
33+
Ag^{-4} = 7 \cdot 4 \equiv 28 \equiv 11 \pmod{17}\\
34+
Ag^{-8} = 7 \cdot (-1) \equiv -7 \equiv 10 \pmod{17}\\
35+
Ag^{-12} = 7 \cdot 13 \equiv 91 \equiv 6 \pmod{17}
36+
\end{align*}
37+
\end{solutionbox}
38+
39+
\part Quel est le nombre secret $a$ choisi par Alice ?
40+
\begin{solutionbox}{6cm}
41+
$g^3 \equiv 10 \equiv Ag^{-8} \pmod{17}$ donc
42+
$g^{3} g^{8} \equiv 10 \pmod{17}$ donc
43+
$g^{11} \equiv 10 \pmod{17}$.
44+
Le nombre secret $a$ choisi par Alice est donc $11$.
45+
\end{solutionbox}
46+
47+
\part Comment généraliser cet méthode pour des nombre $A, g$ et $p$ quelconques ?
48+
\begin{solutionbox}{6cm}
49+
On peut utiliser l'algorithme de Shanks's Baby-Step Giant-Step pour trouver $a$.
50+
Voir slides.
51+
\end{solutionbox}
52+
53+
\part Quel est la complexité de cette algorithme ? Quel taille de nombre $p$ faut-il pour qu'il soit difficile de trouver
54+
$a$ à partir de $A, g, p$ avec un ordinateur personnel ($\pm 10^9$ opérations par secondes) ?
55+
\begin{solutionbox}{5cm}
56+
$\mathcal{O}(\sqrt(p)\log(p))$ opérations. Avec 18 chiffres, il faut $10^9$ opérations donc juste une seconde, c'est pas assez.
57+
Avec 36 chiffres, il faut $10^{18}$ opérations donc un milliard de secondes soit un peu plus de 30 ans, c'est pas mal.
58+
\end{solutionbox}
59+
\end{parts}

Exams/2026_01/fft.tex

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
\titledquestion{Mathématiques du signal}
2+
3+
Considérons le signal suivant :
4+
$$x(t) = 2\cos(3\pi t) + \sin(6\pi t).$$
5+
6+
\vskip2ex
7+
8+
\begin{parts}
9+
\part Quelle est la transformée de Fourier de $x(t)$ ? Identifiez les fréquences présentes dans le signal et dessinez le spectre $|X(f)|$.
10+
\begin{solutionbox}{18cm}
11+
Pour trouver la transformée de Fourier de $x(t)$, on utilise les formules classiques :
12+
13+
\begin{align*}
14+
\cos(3\pi t) &= \frac{e^{i3\pi t} + e^{-i3\pi t}}{2}\\
15+
\sin(6\pi t) &= \frac{e^{i6\pi t} - e^{-i6\pi t}}{2i}
16+
\end{align*}
17+
18+
Donc :
19+
\begin{align*}
20+
x(t) &= 2 \cdot \frac{e^{i3\pi t} + e^{-i3\pi t}}{2} + \frac{e^{i6\pi t} - e^{-i6\pi t}}{2i}\\
21+
&= e^{i3\pi t} + e^{-i3\pi t} + \frac{1}{2i}e^{i6\pi t} - \frac{1}{2i}e^{-i6\pi t}
22+
\end{align*}
23+
24+
La transformée de Fourier est :
25+
$$X(f) = \delta(f - 1.5) + \delta(f + 1.5) + \frac{1}{2i}\delta(f - 3) - \frac{1}{2i}\delta(f + 3)$$
26+
27+
où les fréquences sont $f_1 = 1.5$ Hz (de $\cos(3\pi t)$) et $f_2 = 3$ Hz (de $\sin(6\pi t)$).
28+
29+
Le spectre d'amplitude $|X(f)|$ est :
30+
$$|X(f)| = \delta(f - 1.5) + \delta(f + 1.5) + \frac{1}{2}\delta(f - 3) + \frac{1}{2}\delta(f + 3)$$
31+
32+
\begin{center}
33+
\begin{tikzpicture}
34+
\begin{axis}[
35+
axis lines=middle,
36+
xlabel={$f$ (Hz)},
37+
ylabel={$|X(f)|$},
38+
xmin=-4, xmax=4,
39+
ymin=-0.2, ymax=1.5,
40+
width=12cm,
41+
height=6cm,
42+
ytick={0, 0.5, 1},
43+
xtick={-3, -1.5, 0, 1.5, 3},
44+
xticklabels={$-3$, $-1.5$, $0$, $1.5$, $3$}
45+
]
46+
% Dirac delta à f = -3
47+
\draw[thick, blue, ->] (axis cs:-3,0) -- (axis cs:-3,0.5);
48+
\node[above] at (axis cs:-3,0.5) {$\frac{1}{2}$};
49+
50+
% Dirac delta à f = -1.5
51+
\draw[thick, blue, ->] (axis cs:-1.5,0) -- (axis cs:-1.5,1);
52+
\node[above] at (axis cs:-1.5,1) {$1$};
53+
54+
% Dirac delta à f = 1.5
55+
\draw[thick, blue, ->] (axis cs:1.5,0) -- (axis cs:1.5,1);
56+
\node[above] at (axis cs:1.5,1) {$1$};
57+
58+
% Dirac delta à f = 3
59+
\draw[thick, blue, ->] (axis cs:3,0) -- (axis cs:3,0.5);
60+
\node[above] at (axis cs:3,0.5) {$\frac{1}{2}$};
61+
\end{axis}
62+
\end{tikzpicture}
63+
\end{center}
64+
\end{solutionbox}
65+
66+
\part Dessinez le spectre $|X_s(f)|$ du signal échantillonné $x_s(t)$ pour des fréquences d'échantillonnage de $f_e = 5$ Hz et $f_e = 7$ Hz. Que constatez-vous ?
67+
\begin{solutionbox}{20.5cm}
68+
La fréquence maximale du signal est $f_{max} = 3$ Hz. La fréquence de Nyquist est donc $f_{max} = 3$ Hz, ce qui signifie qu'il faut échantillonner à $f_e > 6$ Hz pour éviter le repliement spectral.
69+
70+
\textbf{Échantillonnage à $f_e = 5$ Hz :}
71+
72+
Comme $f_e = 5$ Hz $< 6$ Hz, il y a repliement spectral. Le spectre se répète périodiquement tous les 5 Hz.
73+
La fréquence de Nyquist est $f_e/2 = 2.5$ Hz.
74+
75+
\begin{itemize}
76+
\item La fréquence $f = 1.5$ Hz $< 2.5$ Hz, donc pas de repliement.
77+
\item La fréquence $f = 3$ Hz $> 2.5$ Hz, donc repliement : $3$ Hz se replie à $5 - 3 = 2$ Hz.
78+
\item Les fréquences négatives se replient également : $-1.5$ Hz se replie à $-1.5 + 5 = 3.5$ Hz, et $-3$ Hz se replie à $-3 + 5 = 2$ Hz.
79+
\end{itemize}
80+
81+
Le spectre échantillonné contient des impulsions aux fréquences : $-3.5$, $-2$, $-1.5$, $1.5$, $2$, $3.5$ Hz (et leurs répétitions périodiques tous les 5 Hz).
82+
83+
\begin{center}
84+
\begin{tikzpicture}
85+
\begin{axis}[
86+
axis lines=middle,
87+
xlabel={$f$ (Hz)},
88+
ylabel={$|X_s(f)|$ ($f_e = 5$ Hz)},
89+
xmin=-6, xmax=6,
90+
ymin=-0.2, ymax=1.5,
91+
width=12cm,
92+
height=6cm,
93+
ytick={0, 0.5, 1},
94+
xtick={-5, -3.5, -2, -1.5, 0, 1.5, 2, 3.5, 5},
95+
xticklabels={$-5$, $-3.5$, $-2$, $-1.5$, $0$, $1.5$, $2$, $3.5$, $5$}
96+
]
97+
% Répétitions périodiques (une période de chaque côté)
98+
% Période -5 à 0
99+
\draw[thick, blue, ->] (axis cs:-3,0) -- (axis cs:-3,0.5);
100+
\draw[thick, red, ->] (axis cs:-3.5,0) -- (axis cs:-3.5,1);
101+
\draw[thick, red, ->] (axis cs:-2,0) -- (axis cs:-2,0.5);
102+
\draw[thick, blue, ->] (axis cs:-1.5,0) -- (axis cs:-1.5,1);
103+
% Période 0 à 5
104+
\draw[thick, blue, ->] (axis cs:1.5,0) -- (axis cs:1.5,1);
105+
\draw[thick, red, ->] (axis cs:2,0) -- (axis cs:2,0.5);
106+
\draw[thick, blue, ->] (axis cs:3,0) -- (axis cs:3,0.5);
107+
\draw[thick, red, ->] (axis cs:3.5,0) -- (axis cs:3.5,1);
108+
% Ligne pointillée pour f_e/2
109+
\draw[dashed, gray] (axis cs:-2.5,-0.1) -- (axis cs:-2.5,1.5);
110+
\draw[dashed, gray] (axis cs:2.5,-0.1) -- (axis cs:2.5,1.5);
111+
\node[below] at (axis cs:-2.5,-0.1) {$-f_e/2$};
112+
\node[below] at (axis cs:2.5,-0.1) {$f_e/2$};
113+
\end{axis}
114+
\end{tikzpicture}
115+
\end{center}
116+
117+
\textbf{Échantillonnage à $f_e = 7$ Hz :}
118+
119+
Comme $f_e = 7$ Hz $> 6$ Hz, il n'y a pas de repliement spectral. Le spectre se répète périodiquement tous les 7 Hz sans distorsion.
120+
121+
\begin{center}
122+
\begin{tikzpicture}
123+
\begin{axis}[
124+
axis lines=middle,
125+
xlabel={$f$ (Hz)},
126+
ylabel={$|X_s(f)|$ ($f_e = 7$ Hz)},
127+
xmin=-7, xmax=7,
128+
ymin=-0.2, ymax=1.5,
129+
width=12cm,
130+
height=6cm,
131+
ytick={0, 0.5, 1},
132+
xtick={-7, -3, -1.5, 0, 1.5, 3, 7},
133+
xticklabels={$-7$, $-3$, $-1.5$, $0$, $1.5$, $3$, $7$}
134+
]
135+
% Période -7 à 0
136+
\draw[thick, blue, ->] (axis cs:-3,0) -- (axis cs:-3,0.5);
137+
\draw[thick, blue, ->] (axis cs:-1.5,0) -- (axis cs:-1.5,1);
138+
% Période 0 à 7
139+
\draw[thick, blue, ->] (axis cs:1.5,0) -- (axis cs:1.5,1);
140+
\draw[thick, blue, ->] (axis cs:3,0) -- (axis cs:3,0.5);
141+
% Ligne pointillée pour f_e/2
142+
\draw[dashed, gray] (axis cs:-3.5,-0.1) -- (axis cs:-3.5,1.5);
143+
\draw[dashed, gray] (axis cs:3.5,-0.1) -- (axis cs:3.5,1.5);
144+
\node[below] at (axis cs:-3.5,-0.1) {$-f_e/2$};
145+
\node[below] at (axis cs:3.5,-0.1) {$f_e/2$};
146+
\end{axis}
147+
\end{tikzpicture}
148+
\end{center}
149+
150+
\textbf{Conclusion :} Avec $f_e = 5$ Hz, on observe un repliement spectral : la fréquence $3$ Hz se replie à $2$ Hz, créant de la distorsion. Avec $f_e = 7$ Hz, le spectre est préservé sans repliement, confirmant le théorème de Shannon-Nyquist.
151+
\end{solutionbox}
152+
\end{parts}

Exams/2026_01/graph.tex

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
\titledquestion{Théorie des graphes}
2+
3+
Après une tempête de neige exceptionnelle, toutes les routes entre les villages de votre région sont enneigées.
4+
Vous devez décider quelles routes déneiger pour que tous les villages soient reliés entre eux, tout en minimisant le coût total de déneigement.
5+
Le réseau routier est représenté ci-dessous, où chaque nombre indique le coût de déneigement (en milliers d'euros) pour chaque route :
6+
7+
\begin{center}
8+
\begin{tikzpicture}[scale=1.2]
9+
\node[draw,circle] (A) at (0,2) {A};
10+
\node[draw,circle] (B) at (2,3) {B};
11+
\node[draw,circle] (C) at (4,3) {C};
12+
\node[draw,circle] (D) at (6,2) {D};
13+
\node[draw,circle] (E) at (1,0) {E};
14+
\node[draw,circle] (F) at (3,1) {F};
15+
\node[draw,circle] (G) at (5,1) {G};
16+
\node[draw,circle] (H) at (7,0) {H};
17+
\node[draw,circle] (I) at (2,-1.5) {I};
18+
\node[draw,circle] (J) at (4,-1.5) {J};
19+
20+
\path [draw,-,>=stealth] (A) edge node[midway,fill=white,inner sep=1pt]{8} (B);
21+
\path [draw,-,>=stealth] (A) edge node[midway,fill=white,inner sep=1pt]{5} (E);
22+
\path [draw,-,>=stealth] (B) edge node[midway,fill=white,inner sep=1pt]{3} (C);
23+
\path [draw,-,>=stealth] (B) edge node[midway,fill=white,inner sep=1pt]{6} (F);
24+
\path [draw,-,>=stealth] (C) edge node[midway,fill=white,inner sep=1pt]{4} (D);
25+
\path [draw,-,>=stealth] (C) edge node[midway,fill=white,inner sep=1pt]{7} (G);
26+
\path [draw,-,>=stealth] (D) edge node[midway,fill=white,inner sep=1pt]{9} (H);
27+
\path [draw,-,>=stealth] (E) edge node[midway,fill=white,inner sep=1pt]{2} (F);
28+
\path [draw,-,>=stealth] (E) edge node[midway,fill=white,inner sep=1pt]{4} (I);
29+
\path [draw,-,>=stealth] (F) edge node[midway,fill=white,inner sep=1pt]{5} (G);
30+
\path [draw,-,>=stealth] (F) edge node[midway,fill=white,inner sep=1pt]{3} (I);
31+
\path [draw,-,>=stealth] (G) edge node[midway,fill=white,inner sep=1pt]{6} (H);
32+
\path [draw,-,>=stealth] (G) edge node[midway,fill=white,inner sep=1pt]{4} (J);
33+
\path [draw,-,>=stealth] (I) edge node[midway,fill=white,inner sep=1pt]{7} (J);
34+
\path [draw,-,>=stealth] (J) edge node[midway,fill=white,inner sep=1pt]{8} (H);
35+
\end{tikzpicture}
36+
\end{center}
37+
38+
\begin{parts}
39+
\part Déterminez manuellement quelles routes déneiger pour que tous les villages soient reliés avec un coût minimal. Indiquez le coût total.
40+
\begin{solutionbox}{10.5cm}
41+
On cherche un arbre couvrant minimal (minimum spanning tree) qui relie tous les villages.
42+
43+
On peut utiliser l'algorithme de Kruskal (ou Prim) mentalement :
44+
\begin{enumerate}
45+
\item Trier les arêtes par coût croissant : $EF(2)$, $BC(3)$, $FI(3)$, $CD(4)$, $EI(4)$, $GJ(4)$, $FG(5)$, $AE(5)$, $CG(7)$, $IJ(7)$, $AB(8)$, $DH(9)$
46+
\item Ajouter les arêtes une par une si elles ne créent pas de cycle :
47+
\begin{itemize}
48+
\item $EF$ (coût 2), $BC$ (coût 3), $FI$ (coût 3), $CD$ (coût 4) - ajouté
49+
\item $EI$ (coût 4) - crée un cycle avec $EF$ et $FI$, ignoré
50+
\item $GJ$ (coût 4), $FG$ (coût 5), $AE$ (coût 5) - ajouté
51+
\item $BF$ (coût 6), $GH$ (coût 6) - ajouté
52+
\end{itemize}
53+
\end{enumerate}
54+
55+
L'arbre couvrant minimal contient les arêtes : $EF$, $BC$, $FI$, $CD$, $GJ$, $FG$, $AE$, $BF$, $GH$.
56+
57+
Coût total : $2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 = \boxed{38}$ milliers d'euros.
58+
\end{solutionbox}
59+
60+
\part Considérons maintenant le problème avec un nombre $|V|$ de sommets et $|E|$ d'arêtes bien plus grand, de tel sorte que vous ne sachiez plus le résoudre à la main.
61+
Quel algorithme utiliseriez-vous pour trouver les routes à déneiger pour que tous les villages soient reliés avec un coût minimal ?
62+
Décrivez brièvement son principe et donnez sa complexité temporelle.
63+
\begin{solutionbox}{18cm}
64+
On utilise l'algorithme de Kruskal (ou l'algorithme de Prim) pour trouver un arbre couvrant minimal.
65+
66+
\textbf{Algorithme de Kruskal :}
67+
\begin{enumerate}
68+
\item Trier toutes les arêtes par poids croissant.
69+
\item Initialiser une forêt (chaque sommet est son propre arbre).
70+
\item Pour chaque arête dans l'ordre croissant :
71+
\begin{itemize}
72+
\item Si les deux extrémités de l'arête sont dans des arbres différents, ajouter l'arête et fusionner les deux arbres.
73+
\item Sinon, ignorer l'arête (elle créerait un cycle).
74+
\end{itemize}
75+
\item S'arrêter quand on a $|V| - 1$ arêtes (un arbre a toujours $|V| - 1$ arêtes).
76+
\end{enumerate}
77+
78+
\textbf{Complexité :}
79+
\begin{itemize}
80+
\item Tri des arêtes : $\mathcal{O}(|E| \log |E|)$
81+
\item Pour chaque arête, vérifier si elle crée un cycle : $\mathcal{O}(\log |V|)$ avec une structure Union-Find efficace
82+
\item Total : $\mathcal{O}(|E| \log |E|) = \mathcal{O}(|E| \log |V|)$ (car $|E| \leq |V|^2$)
83+
\end{itemize}
84+
85+
\textbf{Alternative : Algorithme de Prim}
86+
\begin{itemize}
87+
\item Commencer avec un sommet arbitraire.
88+
\item À chaque étape, ajouter l'arête de poids minimal qui connecte un sommet dans l'arbre à un sommet hors de l'arbre.
89+
\item Complexité : $\mathcal{O}(|E| + |V|\log|V|)$ avec une file de priorité efficace.
90+
\end{itemize}
91+
\end{solutionbox}
92+
\end{parts}

0 commit comments

Comments
 (0)