Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
},
{
"cell_type": "markdown",
"id": "af8633ab",
"metadata": {},
"source": [
"**Lecture ancrée** : Ce notebook explore les jeux combinatoires impartials à travers plusieurs exemples classiques et illustratifs : jeux de soustraction, Wythoff, jeux composés et Chomp. Chaque section illustre un concept fondamental de la théorie des jeux avec des implémentations Python exécutables.\n"
Expand Down Expand Up @@ -208,9 +209,12 @@
},
{
"cell_type": "markdown",
"id": "3a0b98a5",
"metadata": {},
"source": [
"**Lecture ancrée** : Les fonctions mex (minimum excludant) et find_periodicity sont les outils de base pour analyser les jeux de soustraction. La fonction mex calcule le nombre de Grundy d'une position, tandis que find_periodicity détecte les motifs répétitifs dans ces valeurs, essentiel pour déterminer les stratégies gagnantes optimales.\n\n**Lecture ancrée** : Le code met en œuvre la définition exacte : `grundy_subtraction` explore chaque coup m ≤ n, collecte les valeurs atteintes dans `reachable` et leur applique `mex` ; le dictionnaire `memo` évite tout recalcul. `nim_sum` accumule le XOR de plusieurs valeurs — l'opération qui, par le théorème de Sprague-Grundy, donnera la valeur d'une somme de jeux."
"**Lecture ancrée** : Les fonctions mex (minimum excludant) et find_periodicity sont les outils de base pour analyser les jeux de soustraction. La fonction mex calcule le nombre de Grundy d'une position, tandis que find_periodicity détecte les motifs répétitifs dans ces valeurs, essentiel pour déterminer les stratégies gagnantes optimales.\n",
"\n",
"**Lecture ancrée** : Le code met en œuvre la définition exacte : `grundy_subtraction` explore chaque coup m ≤ n, collecte les valeurs atteintes dans `reachable` et leur applique `mex` ; le dictionnaire `memo` évite tout recalcul. `nim_sum` accumule le XOR de plusieurs valeurs — l'opération qui, par le théorème de Sprague-Grundy, donnera la valeur d'une somme de jeux."
]
},
{
Expand Down Expand Up @@ -323,10 +327,10 @@
},
{
"cell_type": "markdown",
"id": "7f8a1242",
"metadata": {},
"source": [
"**Lecture ancrée** : Le tableau montre que chaque configuration de coups possibles ({1,2}, {1,3}, {1,3,4}, etc.) produit sa propre périodicité. Par exemple, le jeu S({1,3,4}) a une période de 7, ce qui signifie donc que les valeurs de Grundy correspondantes se répètent tous les 7 jetons. Cette régularité permet de calculer efficacement les stratégies gagnantes pour des nombres arbitrairement grands.\n",
""
"**Lecture ancrée** : Le tableau montre que chaque configuration de coups possibles ({1,2}, {1,3}, {1,3,4}, etc.) produit sa propre périodicité. Par exemple, le jeu S({1,3,4}) a une période de 7, ce qui signifie donc que les valeurs de Grundy correspondantes se répètent tous les 7 jetons. Cette régularité permet de calculer efficacement les stratégies gagnantes pour des nombres arbitrairement grands.\n"
]
},
{
Expand Down Expand Up @@ -444,6 +448,7 @@
},
{
"cell_type": "markdown",
"id": "0e95cacb",
"metadata": {},
"source": [
"**Lecture ancrée** : La sortie donne `Pre-periode: 0, Periode: 7` : le cycle [0, 1, 0, 1, 2, 3, 2] démarre dès n = 0, sans pré-période — le cas le plus simple de l'ultime périodicité (théorème de Guy, 1996). Le graphique colore chaque barre selon sa valeur de Grundy et marque en pointillés la fin de la pré-période et de la première période."
Expand Down Expand Up @@ -563,6 +568,7 @@
},
{
"cell_type": "markdown",
"id": "e1f0e82d",
"metadata": {},
"source": [
"**Lecture ancrée** : Les P-positions de Wythoff s'alignent sur deux droites de pentes φ et 1/φ. Le nombre d'or vaut φ ≈ 1.618034 et vérifie φ² = 2.618034 = φ + 1 (sortie du notebook). Cette structure se lit déjà dans le tableau : la différence des coordonnées de chaque paire vaut exactement n (n = 8 : (12, 20), différence = 8) et croît régulièrement d'une ligne à l'autre."
Expand Down Expand Up @@ -689,6 +695,7 @@
},
{
"cell_type": "markdown",
"id": "bed2a5fc",
"metadata": {},
"source": [
"**Lecture ancrée** : Chaque point noir de la figure marque une position perdante ; les deux faisceaux suivent les pentes φ ≈ 1.618 et son inverse 1/φ ≈ 0.618."
Expand Down Expand Up @@ -805,9 +812,12 @@
},
{
"cell_type": "markdown",
"id": "8a1c35d0",
"metadata": {},
"source": [
"**Lecture ancrée** : La stratégie gagnante consiste à déplacer les jetons vers une P-position. Par exemple, depuis (5,8), le coup (5,3) aligné les pieces sur la droite de pente φ, forçant l'adversaire dans une position perdante.\n\n**Lecture ancrée** : La sortie illustre les trois familles de coups du Wythoff — retirer du tas A seul, du tas B seul, ou le même nombre des deux (diagonale). Depuis (7, 11) le coup gagnant est (7, 4) ; depuis (10, 15) c'est (9, 15) ; mais (3, 5) est une P-position : la fonction rend `None`. L'exercice suivant demande de générer ces positions par la formule du nombre d'or et de les vérifier avec `is_wythoff_p_position`."
"**Lecture ancrée** : La stratégie gagnante consiste à déplacer les jetons vers une P-position. Par exemple, depuis (5,8), le coup (5,3) aligné les pieces sur la droite de pente φ, forçant l'adversaire dans une position perdante.\n",
"\n",
"**Lecture ancrée** : La sortie illustre les trois familles de coups du Wythoff — retirer du tas A seul, du tas B seul, ou le même nombre des deux (diagonale). Depuis (7, 11) le coup gagnant est (7, 4) ; depuis (10, 15) c'est (9, 15) ; mais (3, 5) est une P-position : la fonction rend `None`. L'exercice suivant demande de générer ces positions par la formule du nombre d'or et de les vérifier avec `is_wythoff_p_position`."
]
},
{
Expand Down Expand Up @@ -1033,6 +1043,7 @@
},
{
"cell_type": "markdown",
"id": "a6baa9cd",
"metadata": {},
"source": [
"**Lecture ancrée** : Le calcul montre comment la fonction de Grundy d'un jeu composé se détermine par le XOR des valeurs de Grundy de ses composantes. Ici, le XOR des valeurs (1, 3, 0) donne 2, ce qui classe la position comme gagnante (N-position). La réduction proposée sur la composante 1 passe le Grundy total à 0.\n"
Expand Down Expand Up @@ -1222,6 +1233,7 @@
},
{
"cell_type": "markdown",
"id": "4c4a27b1",
"metadata": {},
"source": [
"**Lecture ancrée** : La visualisation compare les fonctions de Grundy de quatre jeux de soustraction différents. Malgré des ensembles de coups variés, chaque jeu atteint une périodicité stable, démontrant la puissance de l'analyse par la fonction de Grundy en théorie des jeux combinatoires.\n"
Expand Down Expand Up @@ -1345,9 +1357,10 @@
},
{
"cell_type": "markdown",
"id": "1f4b6852",
"metadata": {},
"source": [
"**Lecture ancrée** : Parmi les 8 coups légaux depuis (3, 3, 3), un seul — (3, 1, 1) — mène à une P-position ; les 7 autres laissent une N-position à l'adversaire. C'est le coup optimal, et la fonction ci-dessous le visualise sur la tablette : carré empoisonné en rouge au coin (0, 0), carrés de chocolat, une figure par position."
"**Lecture ancrée** : Parmi les 8 coups légaux depuis (3, 3, 3), un seul — (3, 1, 1) — mène à une P-position ; les 7 autres laissent une N-position à l'adversaire. C'est le coup optimal. La visualisation (carré empoisonné en rouge au coin (0, 0), carrés de chocolat, une figure par position) est portée par la fonction `visualize_chomp` plus bas dans le carnet."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -477,9 +477,10 @@
},
{
"cell_type": "markdown",
"id": "15a0451a",
"metadata": {},
"source": [
"**Lecture chiffree — trois points pour deux frontieres.** La sortie aligne trois entrees : `x=-1.0 -> G1.forward=+0.0 -> G_compose.forward=+0.0`, `x=+0.0 -> G1.forward=+1.0 -> G_compose.forward=+2.0`, `x=+0.5 -> G1.forward=+1.5 -> G_compose.forward=+3.0`. Deux regles se lisent colonne par colonne : G1 fait `x + 1` (0.0, 1.0, 1.5 sur les trois lignes), G2 fait `2 y` (0.0, 2.0, 3.0) — et la composee `2 (x + 1)` verifie ses trois lignes d'un coup : 2 x (-1+1) = 0, 2 x (0+1) = 2, 2 x (0.5+1) = 3. La lecture complete de la table va au-dela du cas temoin `x = 0` que la section suivante reprend : les trois points tracent la frontiere avant entiere de la composition, et sa linearite est la raison pour laquelle la BR chainee restera definie partout — la propriete de Hedges que la cellule suivante verifie sur le cas temoin.\n"
"**Lecture chiffree — trois points pour deux frontieres.** La sortie aligne trois entrees : `x=-1.0 -> G1.forward=+0.0 -> G_compose.forward=+0.0`, `x=+0.0 -> G1.forward=+1.0 -> G_compose.forward=+2.0`, `x=+0.5 -> G1.forward=+1.5 -> G_compose.forward=+3.0`. Deux regles se lisent colonne par colonne : G1 fait `x + 1` (0.0, 1.0, 1.5 sur les trois lignes), G2 fait `2 y` (0.0, 2.0, 3.0) — et la composee `2 (x + 1)` verifie ses trois lignes d'un coup : 2 x (-1+1) = 0, 2 x (0+1) = 2, 2 x (0.5+1) = 3. La lecture complete de la table va au-dela du cas temoin `x = 0` que la section suivante reprend : les trois points tracent la frontiere avant entiere de la composition, et sa linearite est la raison pour laquelle la BR chainee restera definie partout — la propriete de Hedges, dont la verification explicite sur le cas temoin `x = 0` est reprise plus bas dans le carnet.\n"
]
},
{
Expand Down Expand Up @@ -818,9 +819,17 @@
},
{
"cell_type": "markdown",
"id": "57a89dc7",
"metadata": {},
"source": [
"### Lecture de la boucle\n\n**Mesure** :\n- **Cas 1** (`delta=0.5`, `a0=0.5`) : point fixe `a* = 1.0` atteint en 1 étape. Convergence triviale — l'addition `0.5 + 0.5` tombe pile sur le point fixe `1.0`, la distance au point fixe passe directement de `0.5` à `0` sans transition.\n- **Cas 2** (`delta=-0.3`, `a0=0.5`) : pas de point fixe strict (`delta != 0` -> équation `a* = clip(a* + delta)` n'a pas de solution dans l'intérieur), convergence vers le bord `-1.0` (imposé par le clip). Les distances successives `1.5, 1.2, 0.9, 0.6, 0.3, 0.0` forment une suite arithmétique de pas exactement `0.3 = |delta|` : la **vitesse de convergence EST le paramètre**, et le bord tombe à la 5e étape (0.5 - 5 × 0.3 = -1.0), le clip gelant ensuite la distance à zéro. Le nombre d'étapes d'une trajectoire clippée se prédit avant de lancer la boucle.\n- **Cas 3** (`a' = -a`) : oscillation `0.5 -> -0.5 -> 0.5 -> ...`, point fixe trivial `a* = 0` instable.\n\n**Pédagogie** : la phrase ICT << une représentation locale peut modifier le global >> est réalisable, mais **le geste n'aboutit pas toujours à un point fixe**. Le système converge, diverge ou oscille selon la nature de `decision_function`. C'est précisément cette variété qui rend la représentation locale intéressante : on peut choisir la dynamique du global en composant des décisions locales simples.\n"
"### Lecture de la boucle\n",
"\n",
"**Mesure** :\n",
"- **Cas 1** (`delta=0.5`, `a0=0.5`) : point fixe `a* = 1.0` atteint en 1 étape. Convergence triviale — l'addition `0.5 + 0.5` tombe pile sur le point fixe `1.0`, la distance au point fixe passe directement de `0.5` à `0` sans transition.\n",
"- **Cas 2** (`delta=-0.3`, `a0=0.5`) : pas de point fixe strict (`delta != 0` -> équation `a* = clip(a* + delta)` n'a pas de solution dans l'intérieur), convergence vers le bord `-1.0` (imposé par le clip). Les distances successives `1.5, 1.2, 0.9, 0.6, 0.3, 0.0` forment une suite arithmétique de pas exactement `0.3 = |delta|` : la **vitesse de convergence EST le paramètre**, et le bord tombe à la 5e étape (0.5 - 5 × 0.3 = -1.0), le clip gelant ensuite la distance à zéro. Le nombre d'étapes d'une trajectoire clippée se prédit avant de lancer la boucle.\n",
"- **Cas 3** (`a' = -a`) : oscillation `0.5 -> -0.5 -> 0.5 -> ...`, point fixe trivial `a* = 0` instable.\n",
"\n",
"**Pédagogie** : la phrase ICT << une représentation locale peut modifier le global >> est réalisable, mais **le geste n'aboutit pas toujours à un point fixe**. Le système converge, diverge ou oscille selon la nature de `decision_function`. C'est précisément cette variété qui rend la représentation locale intéressante : on peut choisir la dynamique du global en composant des décisions locales simples.\n"
]
},
{
Expand Down Expand Up @@ -1037,4 +1046,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
date: '2026-10-08'
by: myia-po-2026:CoursIA-2
python_sha: 2de25e4dd28e9e470d4a0800674e6979ec54f035
csharp_sha: ff702e1605ed50c98a97107655b3087f2bf20179
content_python_sha: 56629955a787edcf3bab12b8930e2c9dfe1ea8c65219a66d664a4f931a6705fe
content_csharp_sha: 533cbd8da01649018c4192738d45f525d03a17c95f0f940ec3642bf042fab37b
Loading