Readme.org et un exemple

master
Sébastien Miquel 2026-05-01 22:20:03 +02:00
parent 47ab69132b
commit 81be54b5f7
54 changed files with 5016 additions and 93 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

View File

@ -0,0 +1,23 @@
{
"Ex 1": "4.0",
"Ex 2 : 1)": "2.5",
"Ex 2 : 2)": "1.5",
"Ex 3 : 1)": "3.5",
"Ex 3 : 2)": "",
"Ex 4": "2.0",
"Ex 5 : 1)": "2.5",
"Ex 5 : 2)": "1.0",
"Ex 6 : 1)": "1.5",
"Ex 6 : 2)": "1.5",
"Ex 6 : 3)": "2.5",
"Ex 7 : 1)": "0.0",
"Ex 7 : 2)": "0.0",
"Ex 7 : 3)": "0.0",
"Ex 8 : 1)": "3.0",
"Ex 8 : 2)": "",
"Ex 9 : 1)": "2.0",
"Ex 9 : 2)": "",
"Ex 10 : 1)": "0",
"Ex 10 : 2)": "",
"Ex 11": ""
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 MiB

View File

@ -0,0 +1,132 @@
{
"width": 1955,
"height": 22256,
"images": [
{
"id": "01",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 0,
"hmax": 1542
},
{
"id": "01",
"label": "Ex 2 : 2)",
"header_height": 80,
"hmin": 1542,
"hmax": 3191
},
{
"id": "02",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 3191,
"hmax": 3889
},
{
"id": "02",
"label": "Ex 2 : 2)",
"header_height": 119,
"hmin": 3889,
"hmax": 6096
},
{
"id": "03",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 6096,
"hmax": 7435
},
{
"id": "03",
"label": "Ex 2 : 2)",
"header_height": 80,
"hmin": 7435,
"hmax": 9335
},
{
"id": "04",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 9335,
"hmax": 10232
},
{
"id": "04",
"label": "Ex 2 : 2)",
"header_height": 80,
"hmin": 10232,
"hmax": 11406
},
{
"id": "05",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 11406,
"hmax": 12022
},
{
"id": "05",
"label": "Ex 2 : 2)",
"header_height": 150,
"hmin": 12022,
"hmax": 14145
},
{
"id": "06",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 14145,
"hmax": 14616
},
{
"id": "06",
"label": "Ex 2 : 2)",
"header_height": 122,
"hmin": 14616,
"hmax": 15251
},
{
"id": "07",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 15251,
"hmax": 15823
},
{
"id": "07",
"label": "Ex 2 : 2)",
"header_height": 122,
"hmin": 15823,
"hmax": 18154
},
{
"id": "08",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 18154,
"hmax": 18922
},
{
"id": "08",
"label": "Ex 2 : 2)",
"header_height": 80,
"hmin": 18922,
"hmax": 20133
},
{
"id": "09",
"label": "Ex 2 : 1)",
"header_height": 80,
"hmin": 20133,
"hmax": 20887
},
{
"id": "09",
"label": "Ex 2 : 2)",
"header_height": 119,
"hmin": 20887,
"hmax": 22256
}
]
}

File diff suppressed because it is too large Load Diff

BIN
Example/Copie02.pdf Normal file

Binary file not shown.

0
Example/Persp/Ex 1 Normal file
View File

0
Example/Persp/Ex 10 Normal file
View File

0
Example/Persp/Ex 11 Normal file
View File

0
Example/Persp/Ex 2 Normal file
View File

0
Example/Persp/Ex 3 Normal file
View File

0
Example/Persp/Ex 4 Normal file
View File

0
Example/Persp/Ex 5 Normal file
View File

0
Example/Persp/Ex 6 Normal file
View File

0
Example/Persp/Ex 7 Normal file
View File

0
Example/Persp/Ex 8 Normal file
View File

0
Example/Persp/Ex 9 Normal file
View File

1
Example/Sol/Ex 1 Normal file
View File

@ -0,0 +1 @@
$$\tr (AB) = \sum_{i=1}^n (AB)_{ii} = \sum_{i=1}^n \sum_{k=1}^n a_{ik} b_{ki} = \sum_{k=1}^n \sum_{i=1}^n b_{ki} a_{ik} = \tr (BA).$$

7
Example/Sol/Ex 10 Normal file
View File

@ -0,0 +1,7 @@
1) Puisque $G$ est un groupe, l'application $\varphi_k : A \mapsto A_k A$ est une bijection de $G$ dans lui-même (translation à gauche). On en déduit :
$A_k \sum_{i=1}^p A_i = \sum_{i=1}^p A_k A_i = \sum_{j=1}^p A_j = M$.
En sommant la relation précédente pour $k$ allant de $1$ à $p$, on obtient :
$$M^2 = (\sum_{k=1}^p A_k) M = \sum_{k=1}^p (A_k M) = \sum_{k=1}^p M = pM$$
Soit $u = \frac{1}{p} f$. On a alors $u^2 = \frac{1}{p^2} f^2 = \frac{1}{p^2} (pf) = \frac{1}{p} f = u$. L'endomorphisme $u$ est donc un projecteur et $f = pu$ (soit $\lambda = p$).
2) Dans une base adaptée à la décomposition $\R^n = \op{Im } u \oplus \op{Ker } u$, la matrice de $u$ est une matrice diagonale avec $\op{rg } u$ fois la valeur $1$ et le reste de zéros. Ainsi, $\op{tr } u = \op{rg } u$ et $\sum_{i=1}^p \op{tr}(A_i) = \op{tr}(M) = \op{tr}(p u) = p \op{tr}(u) = p \op{rg}(u)$, qui est bien un multiple de $p$.

1
Example/Sol/Ex 11 Normal file
View File

@ -0,0 +1 @@
La condition est $\dim \Ker u \geq 2 + \dim \Ker u \cap \Im u$.

11
Example/Sol/Ex 2 Normal file
View File

@ -0,0 +1,11 @@
1) On évalue $f$ sur les vecteurs de la base canonique $(1, X, X^2)$ :
+ $f(1) = 1 + 1 - 2 = 0$
+ $f(X) = (X+2) + X - 2(X+1) = 0$
+ $f(X^2) = (X+2)^2 + X^2 - 2(X+1)^2 = 2X^2+4X+4 - 2X^2-4X-2 = 2$
La matrice de $f$ dans la base canonique est donc :
$$A = \begin{pmatrix} 0 & 0 & 2 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix}$$
2) On cherche une base $(P_1, P_2, P_3)$ telle que $f(P_1)=0$, $f(P_2)=P_3$ et $f(P_3)=0$.
D'après les calculs précédents, on a $f(X^2) = 2$. On peut donc choisir $P_2 = X^2$, ce qui impose $P_3 = 2$.
On a alors bien $f(P_3) = f(2) = 0$. Il suffit de compléter avec un vecteur $P_1 \in \ker(f)$ indépendant de $P_3$, par exemple $P_1 = X$.
La famille $(X, X^2, 2)$ est une famille de polynômes de degrés échelonnés, c'est donc une base de $\R_2[X]$ dans laquelle la matrice de $f$ a la forme voulue.

4
Example/Sol/Ex 3 Normal file
View File

@ -0,0 +1,4 @@
1) $A$ est $B$ sont équivalentes s'il existe $P,Q\in GL_n(\R)$ tels que $A = PBQ$. Par ailleurs, on sait que deux matrices (de même tailles) sont équivalentes si et seulement si elles ont le même rang.
2) En notant $r = \rg A$, on sait que $A$ est équivalente à $J_r$, donc qu'il existe $P,Q\in GL_n(\R)$ telles que $A = PJ_r Q$.
Alors $UAUA = U PJ_r Q U P J_r Q$, et il suffit de prendre $U = Q^{-1} P^{-1}$ (et d'utiliser le fait que $J_rJ_r = J_r$) pour avoir $UAUA = UA$.

5
Example/Sol/Ex 4 Normal file
View File

@ -0,0 +1,5 @@
Soit $(e_1,\dots, e_p)$ une base de $V$, que l'on complète en une base $(e_1,\dots, e_n)$ de $E$. Un endomorphisme $u\in\mc L(E)$ vérifie $V\subset \Ker u$ si et seulement si $e_1,\dots, e_p\in \Ker u$, donc si et seulement si la matrice de $u$ dans la base $\mc B$ a ses $p$-premières colonnes nulles.
L'ensemble $\mc M$ des matrices qui vérifient cette condition est de dimension $(n-p) n$.
Comme l'application $\Phi$ qui à $u$ associe $\op{Mat}_{\mc B}(u)$ est un isomorphisme, l'ensemble $\mc V = \Phi^{-1}(\mc M)$ est de dimension $(n-p)n$.

2
Example/Sol/Ex 5 Normal file
View File

@ -0,0 +1,2 @@
1) Les colonnes de $X Y^T$ sont les $y_i X$, donc sont toutes colinéaires à $X$, donc $\rg X Y^T\leq 1$ et $\Im (XY^T)\subset \vect X$. Le rang est nul si et seulement si $X = \vec 0$ ou $Y = \vec 0$, auquel cas l'image est $\{\vec 0\}$.
2) Si $M$ est de rang $1$ et $m\colon X\mapsto MX$, $\dim \Ker M = n-1$, donc en complétant n'importe quelle base $(e_2,\dots, e_n)$ de $\Ker M$ en une base de l'espace $\mc B = (e_1,\dots, e_n)$, on aura $\op{Mat}_{\mc B}(m)$ qui sera de la forme voulue. Comme $M = \op{Mat}_{\mc B_{can}}(m)$, $M$ est semblable à la matrice voulue.

18
Example/Sol/Ex 6 Normal file
View File

@ -0,0 +1,18 @@
1) Notons $C_1, C_2, C_3, C_4$ les colonnes de $A$. On remarque que $C_2 = -C_1$. De plus, la famille $(C_1, C_3, C_4)$ est libre car :
$$\alpha C_1 + \beta C_3 + \gamma C_4 = 0 \iff \begin{cases} \alpha + 2\beta - 2\gamma = 0 \\ \beta - \gamma = 0 \\ \alpha + \beta = 0 \\ \alpha + \beta = 0 \end{cases} \iff \beta = \gamma, \alpha = -\beta, -\beta + 2\beta - 2\beta = 0 \iff \alpha=\beta=\gamma=0$$
On en déduit :
+ $\op{rg}(f) = 3$ ;
+ $\op{Im } f = \op{Vect}((1, 0, 1, 1), (2, 1, 1, 1), (-2, -1, 0, 0))$ ;
+ Par le théorème du rang, $\dim \ker f = 1$. Comme $C_1+C_2=0$, $\ker f = \op{Vect}((1, 1, 0, 0))$.
2) On cherche $e'_1, e'_2$ dans $\ker(f^2)$ et $e'_3, e'_4$ dans $\ker(f-\op{id})^2$ tels que $f(e'_1)=0, f(e'_2)=e'_1, f(e'_3)=e'_3, f(e'_4)=e'_3+e'_4$.
On peut vérifier que $A e_2 = e_1$, donc on va prendre $e_1' = e_1$ et $e_2' = e_2$.
On peut aussi vérifier que $A e_3 = e_3 + e_4$, donc $e_3' = e_4$ et $e_4' = e_3$ conviennent.
La famille $(e_1', e_2', e_3', e_4')$ est bien une base.
3) La matrice de passage est $P = \begin{pmatrix} 1 & 0 & 0 & 1 \\ 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 1 & 0 \end{pmatrix}$. Par inversion du système $Y=PX$, on trouve $P^{-1} = \begin{pmatrix} 0 & 1 & -1 & 1 \\ 0 & 0 & 1 & -1 \\ 0 & 0 & 0 & 1 \\ 1 & -1 & 1 & -1 \end{pmatrix}$.
Pour $n \ge 2$, $T^n = \begin{pmatrix} 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & n \\ 0 & 0 & 0 & 1 \end{pmatrix}$. On en déduit $A^n = P T^n P^{-1}$.

5
Example/Sol/Ex 7 Normal file
View File

@ -0,0 +1,5 @@
1) On a $\Im (AB) \subset \Im A$, d'où $\rg AB \leq \rg A$. De plus, $\Im (AB) = A(\Im B)$, donc $\dim \Im (AB) \leq \dim \Im B$, ce qui donne $\rg AB \leq \rg B$.
2) On a $\Im (A+B) \subset \Im A + \Im B$, et $\dim (\Im A + \Im B) \leq \dim \Im A + \dim \Im B$, d'où $\rg (A+B) \leq \dim (\Im A) + \dim (\Im B) = \rg A + \rg B$.
En écrivant $A = (A+B) - B$, la première inégalité donne $\rg A \leq \rg (A+B) + \rg (-B) = \rg (A+B) + \rg B$, soit $\rg (A+B) \geq \rg A - \rg B$. Par symétrie des rôles de $A$ et $B$, on a également $\rg (A+B) \geq \rg B - \rg A$, d'où l'inégalité en valeur absolue.
3) On a $A(B-I_n) = B$, donc $\rg B\leq \rg A$. De même, $(A-I_n)B = AB - B = A$, ce qui implique par la question 1 que $\rg A \leq \rg B$. Finalement, $\rg A = \rg B$.

8
Example/Sol/Ex 8 Normal file
View File

@ -0,0 +1,8 @@
1) On a
$$V_n = \vvvv{v_0}{v_1}{\vdots}{v_n} = \vvvv{u_0}{u_0 + u_1}{\vdots}{\sum_{k=0}^n u_k {n\choose k}} = M U_n = \begin{pmatrix}1 & & & \\ 1 & 1 & & \\ \vdots & \ddots & \ddots & \\ 1 & \dots & \dots & 1 \end{pmatrix} \vvvv{u_0}{u_1}{\vdots}{u_n},$$
où $M\in\M_{n+1}(\R)$ est la matrice $M= \big({i+1\choose j+1}\big)_{i,j\leq n+1}$, triangulaire inférieure.
2) On sait que la matrice $M$ est inversible (triangulaire inférieure, avec une diagonale de $1$).
On sait par ailleurs que la transposée de $M$ est la matrice de l'application $u\in \mc L(\R_n(X))\colon P\mapsto P(X+1)$, donc que $M^{-T}$ est la matrice de $u^{-1}\colon P\mapsto P(X-1)$, c'est-à-dire $M^{-T} = \big({j+1\choose i+1} (-1)^{i+j}\big)_{i,j\leq n+1}$, et $M^{-1} = \big({i+1\choose j+1} (-1)^{i+j}\big)_{i,j\leq n+1}$.
On a alors $U_n = M^{-1} V_n$, c'est-à-dire $u_n = \sum_{k=0}^{n} {n \choose k} (-1)^{n+k} v_k = \sum_{k=0}^{n} {n \choose k} (-1)^{n-k}v_k$.

24
Example/Sol/Ex 9 Normal file
View File

@ -0,0 +1,24 @@
1) Avec la représentation du cours d'une file par une liste [3, *,
*, A, B, C] où l[0] est l'indice du premier élément de la file,
les opérations enfile et défile ont des complexités en $O(1)$. La
fonction peek consiste à renvoyer l[l[0]] si l[0] > 0, et None sinon.
2)
#+begin_src python
def hamming(n):
f2, f3, f5 = nouvelle_file(), nouvelle_file(), nouvelle_file()
l = [1]
enfile(f2, 2);enfile(f3, 3);enfile(f5, 5)
while True:
k2, k3, k5 = peek(f2), peek(f3), peek(f5)
m = min(k2, k3, k5)
if k2 == m: defile(f2)
if k3 == m: defile(f3)
if k5 == m: defile(f5)
enfile(f2, 2*m); enfile(f3, 3*m); enfile(f5, 5*m)
if m<n:
l)append(m)
else:
break
return l
#+end_src

1
Example/Text/Ex 1 Normal file
View File

@ -0,0 +1 @@
Soient $A\in\M_{n,p}(\K)$, $B\in\M_{p,n}(\K)$. Montrer que $\tr(AB) = \tr (BA)$.

6
Example/Text/Ex 10 Normal file
View File

@ -0,0 +1,6 @@
Soit $G$ un sous-groupe fini de $(GL_n(\R), \times)$, on note $G = \{A_1, \dots, A_p\}$.
L'objectif est de montrer que $\sum_{i=1}^p \text{tr}(A_i)$ est un multiple entier de $p$.
1) Soit $M = \sum_{i=1}^p A_i$, montrer que $M^2 = pM$.
On note $f$ l'endomorphisme de $\R^n$ canoniquement associé à $M$.
Montrer que l'on peut écrire $f = \lambda u$, où $u$ est un projecteur et $\lambda$ une constante à déterminer.
2) Conclure.

2
Example/Text/Ex 11 Normal file
View File

@ -0,0 +1,2 @@
[X 2022]
Soit $n\geq 3$. caractériser les endomorphismes de $\K^n$ pour lesquels il existe une base dans laquelle $u$ est représenté par une matrice de la forme $\begin{pmatrix}0 & 0 & 0 \\ 0 & M & 0 \\ 0 & 0 & 0 \end{pmatrix}$, où $M\in\M_{n-2}(\K)$.

3
Example/Text/Ex 2 Normal file
View File

@ -0,0 +1,3 @@
Soit $f\in\mc L(\R_2[X])$ définie par $f(P) = P(X+2) + P(X) - 2P(X+1)$.
1) Donner la matrice de $f$ dans la base canonique de $\R_2[X]$.
2) Déterminer une base de $\R_2[X]$ dans laquelle la matrice de $f$ est $\begin{pmatrix}0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix}$.

3
Example/Text/Ex 3 Normal file
View File

@ -0,0 +1,3 @@
Soient $A,B\in\M_n(\R)$.
1) À quelle condition $A$ et $B$ sont-elles équivalentes ? Rappeler la définition, et une caractérisation simple.
2) Montrer qu'il existe $U\in GL_n(\R)$ tel que $UA$ soit une matrice de projection.

1
Example/Text/Ex 4 Normal file
View File

@ -0,0 +1 @@
Soit $E$ un espace de dimension $n$ et $V$ un sous-espace vectoriel de $E$ de dimension $p$. On note $\mc V = \{u\in \mc L(E)\mid V\subset \Ker u\}$. Déterminer la dimension de $\mc V$.

2
Example/Text/Ex 5 Normal file
View File

@ -0,0 +1,2 @@
1) Pour $X,Y\in\K^n$, dessiner la matrice $M = X Y^T$, préciser son rang et son image.
2) Montrer que toute matrice $M$ de rang $1$ est semblable à une matrice de la forme $\scalemath{0.5}{\begin{pmatrix}* & 0 & \dots & 0 \\ \vdots & \vdots & \dots & \vdots \\ \vdots & \vdots & \dots & \vdots \\ * & 0 & \dots & 0 \end{pmatrix}}$.

7
Example/Text/Ex 6 Normal file
View File

@ -0,0 +1,7 @@
Soit $A = \scalemath{0.6}{\begin{pmatrix} 1 & -1 & 2 & -2 \\ 0 & 0 & 1 & -1 \\ 1 & -1 & 1 & 0 \\ 1 & -1 & 1 & 0 \end{pmatrix}}$ et $f$ l'endomorphisme de $\R^4$ canoniquement associé à la matrice $A$.
1) Déterminer $\op{rg}(f)$, $\ker f$ et $\op{Im } f$.
On admet que les espaces $\ker(f^2)$ et $\ker(f - \op{id})^2$ sont supplémentaires dans $\R^4$ et que $\big(e_1 = (1, 1, 0, 0), e_2 = (0, 1, 1, 0)\big)$ et $\big(e_3 = (1, 0, 0, 0), e_4 = (0, 0, 1, 1)\big)$ forment des bases de ces deux espaces.
2) Montrer qu'il existe une base $\mathcal{B}' = (e'_1, e'_2, e'_3, e'_4)$ de $\R^4$ dans laquelle la matrice de $f$ est égale à $T = \scalemath{0.6}{\begin{pmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 \end{pmatrix}}$.
3) Calculer $T^n$ pour tout $n$ de $\N^*$. Expliquer comment en déduire $A^n$.

4
Example/Text/Ex 7 Normal file
View File

@ -0,0 +1,4 @@
Soient $A,B\in\M_n(\K)$.
1) Montrer que $\rg AB\leq \min (\rg A, \rg B)$.
2) Montrer que $\rg (A+B)\leq \rg A + \rg B$, puis en déduire que $\rg (A+B)\geq |\rg A - \rg B|$.
3) Montrer que si $AB = A+B$ alors $\rg A= \rg B$.

3
Example/Text/Ex 8 Normal file
View File

@ -0,0 +1,3 @@
On considère une suite réelle $(u_n)_{n\in\N}$, et la suite $(v_n)$ définie par $\displaystyle\forall n\in\N,\, v_n = \sum_{k=0}^n {n\choose k} u_k$.
1) On note $V_n = (v_0,\dots, v_n)$ et $U_n = (u_0,\dots,u_n)$, interprétés comme des vecteurs colonnes. Expliciter une matrice $M$ tel que $V_n = M U_n$.
2) Déterminer une expression explicite de $u_n$ en fonction des $v_k$, pour $0\leq k\leq n$.

9
Example/Text/Ex 9 Normal file
View File

@ -0,0 +1,9 @@
1) Proposer une représentation naïve d'une file. Pour cette
représentation, donner les complexité des opérations \texttt{enfile} et
\texttt{defile}. Implémenter une fonction \texttt{peek} qui prend en argument la
file et renvoie le premier élément de la file, ou \texttt{None} si elle
est vide, sans le retirer de la file.
2) Les nombres de Hamming sont les entiers de la forme $2^a 3^b 5^c$.
On veut écrire une fonction \texttt{hamming} qui prend un entier $n$ en
argument et renvoie la liste des entiers de Hamming $\leq n$, dans
un ordre croissant, avec une complexité linéaire en la longueur de la liste renvoyée.

11
Example/label_groups Normal file
View File

@ -0,0 +1,11 @@
Ex 1
Ex 2 : 1),Ex 2 : 2)
Ex 3 : 1),Ex 3 : 2)
Ex 4
Ex 5 : 1),Ex 5 : 2)
Ex 6 : 1),Ex 6 : 2),Ex 6 : 3)
Ex 7 : 1),Ex 7 : 2),Ex 7 : 3)
Ex 8 : 1),Ex 8 : 2)
Ex 9 : 1),Ex 9 : 2)
Ex 10 : 1),Ex 10 : 2)
Ex 11

21
Example/labels Normal file
View File

@ -0,0 +1,21 @@
Ex 1
Ex 2 : 1)
Ex 2 : 2)
Ex 3 : 1)
Ex 3 : 2)
Ex 4
Ex 5 : 1)
Ex 5 : 2)
Ex 6 : 1)
Ex 6 : 2)
Ex 6 : 3)
Ex 7 : 1)
Ex 7 : 2)
Ex 7 : 3)
Ex 8 : 1)
Ex 8 : 2)
Ex 9 : 1)
Ex 9 : 2)
Ex 10 : 1)
Ex 10 : 2)
Ex 11

View File

@ -1,136 +1,267 @@
#+title: Script #+title: Script
#+author: Sébastien Miquel #+author: Sébastien Miquel
#+date: 14-03-2026 #+date: 14-03-2026
# Time-stamp: <22-04-26 10:54> # Time-stamp: <01-05-26 22:35>
#+OPTIONS: #+OPTIONS:
NEEDS : * Quézaco
- `export GEMINI_API_KEY=…`
- fichier `names` in the directory. Ce dépôt contient un certain nombre de script Python que j'utilise
pour faire corriger des copies par Gemini.
1. Les copies sont découpées suivant les labels des questions.
2. Des requêtes de correction sont faites à Gemini, qui met une note
entre 0 et 4 à la question, ajoute des commentaires, et encadre
certaines parties de la réponse.
3. Une version pdf annotée de la copie est générée, faite pour être
éditée sur tablette tactile. Le correcteur humain peut modifier la
note, supprimer des commentaires de l'IA, ou ajouter des remarques
manuscrites.
4. Ces annotations manuscrites sont lues et recompilées en une
version de la copie pour l'élève.
* Disclaimer
J'utilise régulièrement cet outil et j'en suis satisfait, mais j'ai
fait peu d'efforts pour le rendre universel et simple à l'emploi.
Plusieurs parties de mon workflow sont spécifiques à mes
représentations internes des sujets d'examens et/ou à mon environment.
L'utilisation de ce système nécessite une familiarité avec python et
la ligne de commande unix ; cette familiarité n'est probablement pas
suffisante en l'état, mais en théorie il devrait être possible de le
faire tourner sur le dossier =Example= qui contient une copie
initiale, les fichiers correspondant au sujet de l'interro, et des
examples du rendu final (dans le sous dossier =BGnot=).
Cette situation s'améliorera peut-être, mais faciliter l'utilisation
de ce système n'est pas une priorité.
* Requirements
** Python
Libraries :
#+BEGIN_SRC bash
pip install numpy pandas matplotlib pillow pydantic pypdf pdf2image reportlab img2pdf pymupdf ftfy ezodf google
#+END_SRC
** Poppler (for pdf2image)
+ Linux : install poppler-utils
+ Windows : Download from: https://github.com/oschwartz10612/poppler-windows
and add it to your PATH
** Accès à Gemini
Il faut créer une clef API pour Gemini (pas facile).
NB : Lors de la création, google offre (offrait ?) 300€ d'utilisation,
mais seulement pendant les trois mois à venir.
Puis ajouter =GEMINI_API_KEY= à l'environnement avec :
#+BEGIN_SRC bash
export GEMINI_API_KEY=…
#+END_SRC
* Correction d'un paquet de copies
1. Créer un fichier =names= dans le dossier courant, avec les
noms/prénoms des élèves, un par ligne
2. Créer un dossier correspondant à l'évaluation, comme =Interro=
3. Mettre les fichiers pdfs scannés dans =Interro=.
4. Dans le dossier =Interro= créer un fichier =labels= avec les labels
des questions, comme =Ex 1 : 1)a)=, un par ligne.
5. Il faudra créer des dossiers =Text=, =Sol= et =Persp=, et dans ces
dossiers créer, pour chaque label (ou groupe de labels : par
exemple un seul fichier =Ex 1= peut être utilisé pour toutes les
questions de l'exercice 1) un fichier texte qui contient
respectivement l'énoncé, un corrigé, et des indications de comment
corriger (Gemini met une note sur 4, on peut demander 2 points
pour tel truc, etc)
6. Suivre les étapes plus bas.
* Prétraitement * Prétraitement
1. Rotate every single page 180 1. =./rotate_all.sh Interro=
`./rotate_all.sh Interro14` (facultatif)
2. `./rename_to_copie.sh Interro14` Retourne toutes les pdf de 180°
3. `python page_splitter.py Interro`. 2. =./rename_to_copie.sh Interro=
Fix issues with `python page_splitter.py Interro14/Copie01.pdf` change le nom des copies en =Copie{id}.pdf=
4. `python cutleft.py Interro` 3. =python page_splitter.py Interro=
Rerun on a single file with `python cutleft.py Interro/Copie01.pdf`
5. `python enonce_info.py Interro` Découpe des copies A3 en pages A4, en retirant les pages vides.
+ s pour garder les deux pages
+ t/n pour garder celle de gauche/de droite
+ r pour jeter les deux pages
Les key bindings ne sont pas adaptés à un clavier azerty… À changer…
Fix issues with =python page_splitter.py Interro14/Copie01.pdf=
4. =python cutleft.py Interro=
Découpe la partie gauche des copies, là où il devrait y avoir les
labels des exercices/questions.
Rerun on a single file with =python cutleft.py Interro/Copie01.pdf=
5. =python enonce_info.py Interro= (gestion perso)
* Labelisation et regroupement * Labelisation et regroupement
Set proxy with `export HTTPS_PROXY="http://192.168.241.1:3128"` Set proxy with ~export HTTPS_PROXY="http://10.0.0.1:3128"~
7. `python gemini_for_labels.py Interro`, avec éventuellement `--overwrite` 1. =python gemini_for_labels.py Interro=, avec éventuellement =--overwrite=
8. Vérification visuelle : `python plotting.py Interro`
`python plotting.py InterroTest/Copie01.pdf`
It also generates les `Copie01.json`, à partir des `Copie01_01.json` Fait des requêtes à Gemini pour identifier les labels des
questions dans images générées à partir des parties gauches des copies.
2. =python plotting.py Interro=
In case of issue, you may need to Permet de vérifier visuellement les labels trouvés.
- Reorder the pdf + Sous linux, on peut faire =e= pour ouvrir le fichier .json et
- Run `python cutleft.py Interro/Copie` l'éditer a la main.
- Run `python gemini_dir_batching.py Interro/Copie` + Quand un label est manquant, il est possible de cliquer sur
9. `python splitting_int.py Interro` l'image, ce qui copie les coordonnées dans le presse papier
10. `python grouping.py Interro` (sous linux…), puis on peut l'ajouter à la main.
Pour modifier une seule copie :
=python plotting.py Interro/Copie01.pdf=
It also generates les =Copie01.json=, à partir des =Copie01_01.json=
3. En cas de soucis, (par exemple les pages ne sont pas dans le bon ordre)
- Réordonner les pages du fichier pdf
- Rerun =python cutleft.py Interro/Copie{id}=
- Rerun =python gemini_dir_batching.py Interro/Copie{id}= ?? À
vérifier, pas sûr que ça marche.
4. =python splitting_int.py Interro=
Découpe les copies suivant les exercices
5. =python grouping.py Interro=
Regroupe les mêmes questions de différentes copies en groupes de
tailles raisonnables.
* Correction et annotation * Correction et annotation
Success! Batch Job Name: batches/0hc83m3anayrs5iljygg2v6ozsvxz58k6a5r Set proxy with ~export HTTPS_PROXY="http://10.0.0.1:3128"~
Processing batch_requests_pro.jsonl for model gemini-3.1-pro-preview...
Uploading file...
Uploaded successfully! File ID: files/oasj4aty5kco
Starting batch job...
Success! Batch Job Name: batches/8pk4m2snr17n31pun3vwzn646qvtkj8ao192
Set proxy with `export HTTPS_PROXY="http://10.0.0.1:3128"`
1. Il faut créer des persp, pour indication de comment corriger, et 1. Il faut créer des persp, pour indication de comment corriger, et
relancer `enonce_info.py` relancer =enonce_info.py=
2. `python correction.py Interro --limit 240` OU 2. =python correction.py Interro --limit 240= OU
`python correction.py Interro/Ex\ 2/Group_1.jpg` OU =python correction.py Interro/Ex\ 2/Group_1.jpg= OU
`python correction.py Interro --overwrite` =python correction.py Interro --overwrite=
Fais les requêtes de correction à Gemini.
L'argument =limit= limite le nombre de requêtes à Gemini Pro
(chères), pour une version low cost, passer =--limit 0=, toutes
les requêtes seront sur Gemini Flash.
Will it resume ? It seems so. Best to wait a bit. Will it resume ? It seems so. Best to wait a bit.
To batch it :
+ `python correction.py Interro --batch`
+ `python submit_batches.py Interro`
+ `python batch_status.py`
+ `python fetch_batched_results.py DS08VB`
+ `python correction.py DS08VB --deal-with-batched`
3. Try `python post-correction.py Interro` ; It makes a
`fixed_correction.json`, to check.
4. Facultatif : `python annotating.py Interro` dans `Anot`, pass `--overwrite`
5.
+ `python annotating_with_checks.py Interro` dans `Bnot`, pass `--overwrite`
OU
+ `python annotating_by_label.py Interro` dans `BGnot`
_Needs_ : label_groups file. (made automatically by this function)
6. `python to_tablette.py Interro` Pour diminuer le coût, il est possible de batch les requêtes, qui
Cela déplace les groupes dans `SyncCopies/À Annoter`. seront alors traitées sous au plus 24h.
- Les mettre dans le dossier racine de la tablette, et renommer en `aaa`. + =python correction.py Interro --batch=
- Vider `Syncthing/Annotées` sur la tablette et localement. + =python submit_batches.py Interro=
+ =python batch_status.py=
+ =python fetch_batched_results.py Interro=
+ =python correction.py Interro --deal-with-batched=
3. =python post-correction.py Interro=
Essaye de corriger des erreurs d'encodage/d'accents dans
=correction.json=.
* Génération des copies annotées
1. =python annotating.py Interro= (facultatif)
Ajoute les annotations Gemini aux copies, enregistrées dans le dossier =Anot=.
On peut passer l'argument =--overwrite=.
2. =python annotating_with_checks.py Interro=
Ajoute les annotations Gemini, et des checkboxes à cocher.
Enregistrées dans le dossier =Bnot=,
=--overwrite=
OU
2. =python annotating_by_label.py Interro= dans =BGnot=
Ajoute les annotations Gemini, et des checkboxes, et regroupe les
réponses par question.
Enregistrées dans =BGnot=
_Needs_ : label_groups file (made automatically by this function),
qui dit quelles questions regrouper.
3. =python to_tablette.py Interro= (gestion perso)
Cela déplace les groupes dans =SyncCopies/À Annoter=.
- Les mettre dans le dossier racine de la tablette, et renommer en =aaa=.
- Vider =Syncthing/Annotées= sur la tablette et localement.
À automatiser, aussi c'est lent… À automatiser, aussi c'est lent…
* Lecture de la correction manuelle * Lecture de la correction manuscrite
16. Manually : delete `~/SyncCopies/Annotées`, copy from the tablette to here. 1. =python from_tablette.py Interro= (gestion perso)
Then `python from_tablette.py Interro` _Before_ : delete =~/SyncCopies/Annotées=, copy from the tablette to here.
17. Une fois les corrections manuelles appliquées aux fichiers
+ `python reading_annotations.py Interro` =Concat.pdf=, il faut enregistrer le fichier annoté au même endroit,
sous le nom =Concat_annotated.pdf=.
(À faire : universaliser =to_tablette.py= et =from_tablette.py=)
2. =python reading_annotations.py Interro=
Lit les =Concat_annotated= dans =Bnot=, regénère les copies avec
les modifications.
OU OU
+ `python reading_grouped_annotations.py Interro` 2. =python reading_grouped_annotations.py Interro=
18. `python giving_names.py InterroTest BGnot`
It will make `A Rendre` with symlink to the Concat.jpg file Idem, mais pour =BGnot=.
either in Anot or Bnot, and score.json.
+ In case of Unknown : rename both directory and file inside. 3. =python giving_names.py Interro BGnot=
+ Here, you can change `score.json` manually.
19.
+ `gestion_classe ne` pour créer l'interro puis
+ `gestion_classe we` (set barème here)
+ `python update_ods.py Interro`
+ `gestion_classe re`
+ `gestion_classe wsent`
+ `python add_final_score.py Interro21`
(this makes files in `Server/copies`)
20.
+ Deploy `miqmacs-copies-assets`, and
+ update the copies from `miqmacs.fr/admin`.
* Recorrection d'une seule copie Crée un dossier =A Rendre= avec des liens symboliques vers
+ La copie à rendre
+ un fichier =score.json= qui contient les notes par question
Si un nom est =Unknown= : renommer à la main le dossier et le fichier dedans.
On peut faire des changements manuels aux =score.json= ici.
4. (gestion perso)
+ =gestion_classe ne= pour créer l'interro puis
+ =gestion_classe we= (set barème here)
+ =python update_ods.py Interro=
+ =gestion_classe re=
+ =gestion_classe wsent=
+ =python add_final_score.py Interro21=
(this makes files in =Server/copies=)
5. (gestion perso)
+ Deploy =miqmacs-copies-assets=, and
+ update the copies from =miqmacs.fr/admin=.
* Recorrection d'une seule copie (peu testé)
!! Attention, refaire ne marchera pas si tu fais une annotation non !! Attention, refaire ne marchera pas si tu fais une annotation non
groupée into refaire !! groupée into refaire !!
1. Redécoupage 1. Redécoupage
+ `python plotting.py InterroTest/Copie01.pdf` + =python plotting.py InterroTest/Copie01.pdf=
+ `python splitting_int.py InterroTest/Copie20.pdf` + =python splitting_int.py InterroTest/Copie20.pdf=
2. Créer `refaire.json`, avec un contenu comme 2. Créer =refaire.json=, avec un contenu comme
[["Copie01", []], [["Copie01", []],
["Copie01", ["Ex 1 : 1)"]]] ["Copie01", ["Ex 1 : 1)"]]]
3. Appeler `correction` avec --refaire. Il doit créer des groupes 3. Appeler =correction= avec --refaire. Il doit créer des groupes
individuels, faire des requêtes, et remplacer les corrections individuels, faire des requêtes, et remplacer les corrections
précédentes (à sauver ailleurs). précédentes (à sauver ailleurs).
Ou non, si tu veux le faire à la main. Ou non, si tu veux le faire à la main.
4. ?? Si je fais refaire, avant d'avoir créer les annotating with 4. ?? Si je fais refaire, avant d'avoir créer les annotating with
checks, que se passe-t-il ??? checks, que se passe-t-il ???
5. Appeler `annotating_with_checks.py --refaire --overwrite` avec --refaire. 5. Appeler =annotating_with_checks.py --refaire --overwrite= avec --refaire.
6. `python to_tablette.py --refaire Interro24` 6. =python to_tablette.py --refaire Interro24=
6. `python from_tablette.py --refaire Interro24` 6. =python from_tablette.py --refaire Interro24=
7. `python reading_grouped_annotations.py --refaire Interro24` 7. =python reading_grouped_annotations.py --refaire Interro24=
* Install
#+BEGIN_SRC bash
pip install highlight-text --break-system-packages
#+END_SRC