Readme.org et un exemple
|
After Width: | Height: | Size: 4.9 MiB |
|
After Width: | Height: | Size: 4.7 MiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 526 KiB |
|
After Width: | Height: | Size: 342 KiB |
|
After Width: | Height: | Size: 294 KiB |
|
After Width: | Height: | Size: 404 KiB |
|
After Width: | Height: | Size: 574 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 183 KiB |
|
After Width: | Height: | Size: 341 KiB |
|
|
@ -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": ""
|
||||
}
|
||||
|
After Width: | Height: | Size: 7.8 MiB |
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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).$$
|
||||
|
|
@ -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$.
|
||||
|
|
@ -0,0 +1 @@
|
|||
La condition est $\dim \Ker u \geq 2 + \dim \Ker u \cap \Im u$.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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}$.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
Soient $A\in\M_{n,p}(\K)$, $B\in\M_{p,n}(\K)$. Montrer que $\tr(AB) = \tr (BA)$.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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)$.
|
||||
|
|
@ -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}$.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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}}$.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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$.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
315
Readme.org
|
|
@ -1,136 +1,267 @@
|
|||
#+title: Script
|
||||
#+author: Sébastien Miquel
|
||||
#+date: 14-03-2026
|
||||
# Time-stamp: <22-04-26 10:54>
|
||||
# Time-stamp: <01-05-26 22:35>
|
||||
#+OPTIONS:
|
||||
|
||||
NEEDS :
|
||||
- `export GEMINI_API_KEY=…`
|
||||
- fichier `names` in the directory.
|
||||
* Quézaco
|
||||
|
||||
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
|
||||
|
||||
1. Rotate every single page 180
|
||||
`./rotate_all.sh Interro14`
|
||||
2. `./rename_to_copie.sh Interro14`
|
||||
3. `python page_splitter.py Interro`.
|
||||
Fix issues with `python page_splitter.py Interro14/Copie01.pdf`
|
||||
4. `python cutleft.py Interro`
|
||||
Rerun on a single file with `python cutleft.py Interro/Copie01.pdf`
|
||||
5. `python enonce_info.py Interro`
|
||||
1. =./rotate_all.sh Interro=
|
||||
(facultatif)
|
||||
Retourne toutes les pdf de 180°
|
||||
2. =./rename_to_copie.sh Interro=
|
||||
change le nom des copies en =Copie{id}.pdf=
|
||||
3. =python page_splitter.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
|
||||
|
||||
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`
|
||||
8. Vérification visuelle : `python plotting.py Interro`
|
||||
`python plotting.py InterroTest/Copie01.pdf`
|
||||
1. =python gemini_for_labels.py Interro=, avec éventuellement =--overwrite=
|
||||
|
||||
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
|
||||
- Reorder the pdf
|
||||
- Run `python cutleft.py Interro/Copie`
|
||||
- Run `python gemini_dir_batching.py Interro/Copie`
|
||||
9. `python splitting_int.py Interro`
|
||||
10. `python grouping.py Interro`
|
||||
Permet de vérifier visuellement les labels trouvés.
|
||||
+ Sous linux, on peut faire =e= pour ouvrir le fichier .json et
|
||||
l'éditer a la main.
|
||||
+ Quand un label est manquant, il est possible de cliquer sur
|
||||
l'image, ce qui copie les coordonnées dans le presse papier
|
||||
(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
|
||||
|
||||
Success! Batch Job Name: batches/0hc83m3anayrs5iljygg2v6ozsvxz58k6a5r
|
||||
|
||||
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"`
|
||||
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
|
||||
relancer `enonce_info.py`
|
||||
2. `python correction.py Interro --limit 240` OU
|
||||
`python correction.py Interro/Ex\ 2/Group_1.jpg` OU
|
||||
`python correction.py Interro --overwrite`
|
||||
relancer =enonce_info.py=
|
||||
2. =python correction.py Interro --limit 240= OU
|
||||
=python correction.py Interro/Ex\ 2/Group_1.jpg= OU
|
||||
=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.
|
||||
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`
|
||||
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.
|
||||
Pour diminuer le coût, il est possible de batch les requêtes, qui
|
||||
seront alors traitées sous au plus 24h.
|
||||
+ =python correction.py Interro --batch=
|
||||
+ =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…
|
||||
|
||||
* 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.
|
||||
+ `python reading_annotations.py Interro`
|
||||
Une fois les corrections manuelles appliquées aux fichiers
|
||||
=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
|
||||
+ `python reading_grouped_annotations.py Interro`
|
||||
18. `python giving_names.py InterroTest BGnot`
|
||||
2. =python reading_grouped_annotations.py Interro=
|
||||
|
||||
It will make `A Rendre` with symlink to the Concat.jpg file
|
||||
either in Anot or Bnot, and score.json.
|
||||
Idem, mais pour =BGnot=.
|
||||
|
||||
+ In case of Unknown : rename both directory and file inside.
|
||||
+ 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`.
|
||||
3. =python giving_names.py Interro BGnot=
|
||||
|
||||
* 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
|
||||
groupée into refaire !!
|
||||
|
||||
1. Redécoupage
|
||||
+ `python plotting.py InterroTest/Copie01.pdf`
|
||||
+ `python splitting_int.py InterroTest/Copie20.pdf`
|
||||
2. Créer `refaire.json`, avec un contenu comme
|
||||
+ =python plotting.py InterroTest/Copie01.pdf=
|
||||
+ =python splitting_int.py InterroTest/Copie20.pdf=
|
||||
2. Créer =refaire.json=, avec un contenu comme
|
||||
[["Copie01", []],
|
||||
["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
|
||||
précédentes (à sauver ailleurs).
|
||||
|
||||
Ou non, si tu veux le faire à la main.
|
||||
4. ?? Si je fais refaire, avant d'avoir créer les annotating with
|
||||
checks, que se passe-t-il ???
|
||||
5. Appeler `annotating_with_checks.py --refaire --overwrite` avec --refaire.
|
||||
6. `python to_tablette.py --refaire Interro24`
|
||||
6. `python from_tablette.py --refaire Interro24`
|
||||
7. `python reading_grouped_annotations.py --refaire Interro24`
|
||||
|
||||
* Install
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
pip install highlight-text --break-system-packages
|
||||
#+END_SRC
|
||||
5. Appeler =annotating_with_checks.py --refaire --overwrite= avec --refaire.
|
||||
6. =python to_tablette.py --refaire Interro24=
|
||||
6. =python from_tablette.py --refaire Interro24=
|
||||
7. =python reading_grouped_annotations.py --refaire Interro24=
|
||||
|
|
|
|||