From c5baed0e2745d8eac8dd2323c6109c61a042de9f Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 25 Oct 2026 09:00:46 +0100 Subject: [PATCH] Add(research,#16334): carnet 27 -- Pell-Fermat, fractions continues et unite fondamentale Carnet 27 de la serie Serre 100 : l'equation x^2 - d y^2 = 1 comme equation de l'unite fondamentale de Z[sqrt(d)]. Contenu mesure (chaque nombre est produit par une cellule du carnet) : - obstruction triviale (d carre) et solubilite universelle pour d non carre ; tailles erratiques de la solution minimale (d=13 -> 649, d=61 -> 1766319049) ; - periode de la fraction continue de sqrt(d) par l'algorithme de Lagrange (m, delta, a), terminaison canonique au premier terme 2*a0, palindrome de Galois verifie sur sqrt(23) et sqrt(61) ; - theoreme d'indice sur les convergents : p_{l-1}^2 - d q_{l-1}^2 = (-1)^l, solution minimale de +1 en p_{l-1} si l pair et en p_{2l-1} si l impair ; - theoreme central mesure : periode impaire <=> Pell negative soluble, 186 concordances sur 186 pour d <= 200, zero ecart ; - critere de Legendre : exact pour les premiers (44/44 pour p = 1 mod 4, 0/50 pour p = 3 mod 4 sous 500) et mis en defaut par les composes (d = 34, 146, 205, 221) ; - unite fondamentale : composition de Brahmagupta, puissances de 3 + 2 sqrt2 et de l'unite de sqrt(61), groupe cyclique infini (Dirichlet rang 1), contraste avec les corps imaginaires du carnet 11 ; - figure log(x1) vs d sur d <= 100, records d = 61, 97, 73. Trois exemples guides resolus et trois exercices sur le meme instrument (d=109, composition pour d=2, extension du critere de Legendre et plus petit compose contre-exemple). C.1 respecte (aucune erreur volontaire, stubs `return None` avec TODO et indices), C.2 (execution complete commitee : 13 cellules code, 0 erreur, execution_count 1..13). Carnet ajoute au README de la serie (rangee 27, apres la derniere rangee merges ; les carnets 18-26 sont en PR, conflit de voisinage resolu a l'ordre de merge). See #16334 Co-Authored-By: Claude Sonnet 5.5 --- .../Lean/Serre100/27-pell-fermat.ipynb | 1434 +++++++++++++++++ .../SymbolicAI/Lean/Serre100/README.md | 1 + 2 files changed, 1435 insertions(+) create mode 100644 MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/27-pell-fermat.ipynb diff --git a/MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/27-pell-fermat.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/27-pell-fermat.ipynb new file mode 100644 index 00000000000..5b8f4edb6b5 --- /dev/null +++ b/MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/27-pell-fermat.ipynb @@ -0,0 +1,1434 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-27-00", + "metadata": { + "papermill": { + "duration": 0.002888, + "end_time": "2026-10-25T08:00:15.315074+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.312186+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# 27 - Pell-Fermat : l'équation $x^2 - d\\,y^2 = 1$, ses fractions continues et son unité fondamentale\n", + "\n", + "Le carnet [11](11-corps-quadratiques-reciprocite-quadratique.ipynb) a étudié les corps quadratiques **imaginaires** $\\mathbb{Q}(\\sqrt{-d})$ : leurs unités sont en nombre **fini** — les racines de l'unité, rien de plus — et le nombre de classes y gouverne tout. En passant au signe opposé, aux corps quadratiques **réels** $\\mathbb{Q}(\\sqrt{d})$, un phénomène nouveau apparaît : le groupe des unités y est **infini**, engendré par une seule d'entre elles, l'**unité fondamentale**. L'équation de **Pell-Fermat**\n", + "$$x^2 - d\\,y^2 = 1$$\n", + "n'est rien d'autre que l'équation de cette unité : ses solutions *sont* les unités de $\\mathbb{Z}[\\sqrt{d}]$ de norme $1$. Le carnet [15](15-quatre-carres-lagrange.ipynb) a déjà rencontré l'identité de **Brahmagupta-Fibonacci**, qui compose deux solutions en une troisième ; c'est la loi de groupe dont ce carnet exploite la structure.\n", + "\n", + "Le fil calculatoire, en arithmétique `stdlib` pure :\n", + "\n", + "1. **L'équation, et l'obstruction triviale** — $d$ carré parfait : aucune solution non triviale ; $d$ non carré : toujours une, mais d'une taille imprévisible.\n", + "2. **La fraction continue de $\\sqrt{d}$** — l'algorithme $(m, \\delta, a)$ de Lagrange, sa période, et le palindrome de Galois.\n", + "3. **Les convergents** — le théorème d'indice : la solution de $x^2 - d\\,y^2 = -1$ tombe au convergent $p_{\\ell-1}$, celle de $+1$ au convergent $p_{2\\ell-1}$.\n", + "4. **Le théorème central, mesuré** — la période est **impaire** si et seulement si l'équation de Pell **négative** $x^2 - d\\,y^2 = -1$ est soluble.\n", + "5. **Le critère de Legendre** — pour $d$ premier, la solubilité de la Pell négative équivaut à $d \\equiv 1 \\pmod 4$ ; et pourquoi ce critère cesse d'être suffisant pour les composés.\n", + "6. **L'unité fondamentale** — Brahmagupta compose les solutions, leurs puissances les épuisent, et le groupe obtenu est cyclique infini (le rang $1$ du théorème des unités de Dirichlet).\n", + "7. **Exemples guidés résolus et exercices** — trois de chaque, dans la convention de la série.\n", + "\n", + "*Sources primaires* : Fermat, lettre à Wallis (février 1657) — l'énoncé du défi ; Lagrange, *Solution d'un problème d'arithmétique* (1766-1770) — la preuve de solubilité universelle ; Bhāskara II, *Bījagaṇita* (XIIe siècle) — la méthode **chakravala** (« la roue »), l'algorithme cyclique qui précède Lagrange de six siècles ; H. W. Lenstra Jr., « Solving the Pell Equation », *Notices of the AMS* **49** (2002) — la mise au point moderne, et l'histoire du problème des bœufs d'Archimède qui se ramène à une telle équation." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-01", + "metadata": { + "papermill": { + "duration": 0.002341, + "end_time": "2026-10-25T08:00:15.322117+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.319776+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 1. L'équation, et l'obstruction triviale\n", + "\n", + "On cherche des entiers $x, y$ avec $y \\neq 0$ vérifiant $x^2 - d\\,y^2 = 1$. Deux remarques suffisent à cadrer le problème.\n", + "\n", + "- Si $d = a^2$ est un **carré parfait**, alors $x^2 - (ay)^2 = 1$ se factorise en $(x - ay)(x + ay) = 1$ : deux entiers de produit $1$ valent $\\pm 1$, d'où $y = 0$. **Aucune solution non triviale** — l'obstruction est complète et élémentaire.\n", + "- Si $d$ n'est **pas** un carré, l'équation admet **toujours** une solution non triviale. C'est le théorème de Lagrange (1766), et c'est loin d'être évident : on demande à une forme quadratique indéfinie de représenter exactement $1$, ce qu'aucun argument de comptage ne garantit.\n", + "\n", + "Reste la question qui fait tout l'intérêt du sujet : **quelle taille** a la plus petite solution ? La première cellule la mesure par balayage naïf sur les petits $d$ — le balayage ne passe pas l'échelle, mais il donne l'étalon." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-27-02", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:15.330324Z", + "iopub.status.busy": "2026-10-25T08:00:15.330005Z", + "iopub.status.idle": "2026-10-25T08:00:15.338737Z", + "shell.execute_reply": "2026-10-25T08:00:15.338109Z" + }, + "papermill": { + "duration": 0.013183, + "end_time": "2026-10-25T08:00:15.339807+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.326624+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " d x1 y1\n", + " 2 3 2\n", + " 3 2 1\n", + " 5 9 4\n", + " 6 5 2\n", + " 7 8 3\n", + " 8 3 1\n", + " 10 19 6\n", + " 11 10 3\n", + " 12 7 2\n", + " 13 649 180\n", + " 14 15 4\n", + " 15 4 1\n" + ] + } + ], + "source": [ + "import math\n", + "\n", + "def est_carre(n):\n", + " \"\"\"Vrai si n est un carre parfait.\"\"\"\n", + " return math.isqrt(n) ** 2 == n\n", + "\n", + "\n", + "def pell_balayage(d, limite=10**7):\n", + " \"\"\"Plus petite solution de x^2 - d y^2 = 1 par balayage sur y.\n", + "\n", + " Ne passe pas l'echelle : pour d = 61 il faudrait atteindre y = 226 153 980.\n", + " Sert d'etalon pour les petits d.\n", + " \"\"\"\n", + " for y in range(1, limite):\n", + " cible = 1 + d * y * y\n", + " x = math.isqrt(cible)\n", + " if x * x == cible:\n", + " return x, y\n", + " return None\n", + "\n", + "\n", + "print(f\"{'d':>3} {'x1':>12} {'y1':>12}\")\n", + "for d in range(2, 17):\n", + " if est_carre(d):\n", + " continue\n", + " x1, y1 = pell_balayage(d)\n", + " print(f\"{d:>3} {x1:>12} {y1:>12}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-03", + "metadata": { + "papermill": { + "duration": 0.004022, + "end_time": "2026-10-25T08:00:15.348241+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.344219+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat\n", + "\n", + "La colonne $x_1$ est **erratique**. $d = 3$ donne la solution minuscule $(2, 1)$, $d = 2$ donne $(3, 2)$ — puis $d = 13$ saute à $(649, 180)$, et l'on verra en section 6 que $d = 61$ exige $x_1 = 1\\,766\\,319\\,049$, dix chiffres pour un paramètre à deux. Aucune monotonie, aucune formule fermée : la taille de la solution minimale est gouvernée par le développement en fraction continue de $\\sqrt{d}$, et par lui seul.\n", + "\n", + "Le balayage naïf, lui, est déjà hors d'échelle sur ces petits cas : pour $d = 61$ il faudrait énumérer $y$ jusqu'à $226\\,153\\,980$, et la solution de $d = 109$ (exercice 1) a quinze chiffres. Il faut un algorithme — il vient de l'analyse, pas de l'arithmétique." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-04", + "metadata": { + "papermill": { + "duration": 0.004841, + "end_time": "2026-10-25T08:00:15.356485+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.351644+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 2. La fraction continue de $\\sqrt{d}$\n", + "\n", + "Tout irrationnel quadratique a un développement en fraction continue **périodique** à partir d'un certain rang ; pour $\\sqrt{d}$ la période commence immédiatement :\n", + "$$\\sqrt{d} = [a_0; \\overline{a_1, a_2, \\ldots, a_\\ell}] \\qquad \\text{avec } a_0 = \\lfloor \\sqrt{d} \\rfloor.$$\n", + "L'algorithme de Lagrange le calcule par une récurrence sur trois entiers $(m_k, \\delta_k, a_k)$ — c'est la forme que l'on implémente, la plus stable numériquement (elle ne manipule que des entiers) :\n", + "$$m_{k+1} = \\delta_k a_k - m_k, \\qquad \\delta_{k+1} = \\frac{d - m_{k+1}^2}{\\delta_k}, \\qquad a_{k+1} = \\left\\lfloor \\frac{a_0 + m_{k+1}}{\\delta_{k+1}} \\right\\rfloor$$\n", + "partant de $m_0 = 0$, $\\delta_0 = 1$, $a_0 = \\lfloor\\sqrt{d}\\rfloor$.\n", + "\n", + "Un point de terminaison est nécessaire, et il existe un critère **canonique** : la période se referme exactement au premier terme valant $2a_0$. C'est ce critère qu'utilise la cellule, plutôt qu'un test sur le triplet d'état — ce dernier ne se referme jamais, $m = 0$ n'apparaissant qu'à l'état initial." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-27-05", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:15.364679Z", + "iopub.status.busy": "2026-10-25T08:00:15.364457Z", + "iopub.status.idle": "2026-10-25T08:00:15.369318Z", + "shell.execute_reply": "2026-10-25T08:00:15.368770Z" + }, + "papermill": { + "duration": 0.009358, + "end_time": "2026-10-25T08:00:15.370125+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.360767+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " d a0 periode l\n", + " 2 1 [2] 1\n", + " 3 1 [1, 2] 2\n", + " 5 2 [4] 1\n", + " 6 2 [2, 4] 2\n", + " 7 2 [1, 1, 1, 4] 4\n", + " 13 3 [1, 1, 1, 1, 6] 5\n", + " 23 4 [1, 3, 1, 8] 4\n", + " 29 5 [2, 1, 1, 2, 10] 5\n", + " 43 6 [1, 1, 3, 1, 5, 1, 3, 1, 1, 12] 10\n", + " 61 7 [1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14] 11\n", + " 97 9 [1, 5, 1, 1, 1, 1, 1, 1, 5, 1, 18] 11\n", + " 109 10 [2, 3, 1, 2, 4, 1, 6, 6, 1, 4, 2, 1, 3, 2, 20] 15\n" + ] + } + ], + "source": [ + "def periode_sqrt(d):\n", + " \"\"\"Periode du developpement en fraction continue de sqrt(d), d non carre.\n", + "\n", + " Algorithme de Lagrange sur (m, delta, a) ; terminaison canonique au\n", + " premier terme a = 2*a0.\n", + " \"\"\"\n", + " a0 = math.isqrt(d)\n", + " m, delta, a = 0, 1, a0\n", + " periode = []\n", + " while True:\n", + " m = delta * a - m\n", + " delta = (d - m * m) // delta\n", + " a = (a0 + m) // delta\n", + " periode.append(a)\n", + " if a == 2 * a0:\n", + " return periode\n", + "\n", + "\n", + "print(f\"{'d':>4} {'a0':>3} {'periode':<34} {'l':>3}\")\n", + "for d in [2, 3, 5, 6, 7, 13, 23, 29, 43, 61, 97, 109]:\n", + " per = periode_sqrt(d)\n", + " texte = \"[\" + \", \".join(str(a) for a in per) + \"]\"\n", + " print(f\"{d:>4} {math.isqrt(d):>3} {texte:<34} {len(per):>3}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-06", + "metadata": { + "papermill": { + "duration": 0.002498, + "end_time": "2026-10-25T08:00:15.375318+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.372820+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat\n", + "\n", + "Deux régularités sautent aux yeux, et toutes deux sont des théorèmes.\n", + "\n", + "La première est le **palindrome de Galois** : la période, privée de son dernier terme $2a_0$, se lit identiquement dans les deux sens. Pour $\\sqrt{23}$ : $[1, 3, 1]$ ; pour $\\sqrt{61}$ : $[1, 4, 3, 1, 2, 2, 1, 3, 4, 1]$. Ce n'est pas un hasard des exemples — c'est une conséquence de la théorie de Galois pour les irrationnels quadratiques, et la section 7 la vérifiera sur toute une plage.\n", + "\n", + "La seconde est la **parité** de $\\ell$ : elle est **impaire** pour $d = 2, 5, 13, 29, 61, 97, 109$ (longueurs $1, 1, 5, 5, 11, 11, 15$) et **paire** pour $d = 3, 6, 7, 23, 43$ (longueurs $2, 2, 4, 4, 10$). Cette parité n'est pas un détail combinatoire : c'est la clé de la section 4, elle décide si l'équation $x^2 - d\\,y^2 = -1$ a une solution." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-07", + "metadata": { + "papermill": { + "duration": 0.004247, + "end_time": "2026-10-25T08:00:15.382201+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.377954+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 3. Les convergents, et où tombent les solutions\n", + "\n", + "Les convergents $p_k/q_k$ de $\\sqrt{d}$ sont les meilleures approximations rationnelles du nombre, et ils se calculent depuis les termes de la fraction continue par la récurrence classique :\n", + "$$p_{-1} = 1,\\ q_{-1} = 0, \\qquad p_k = a_k\\,p_{k-1} + p_{k-2}, \\qquad q_k = a_k\\,q_{k-1} + q_{k-2}.$$\n", + "\n", + "Leur intérêt pour Pell-Fermat tient à un théorème d'indice, que l'on va lire directement dans les valeurs de la forme $p_k^2 - d\\,q_k^2$ :\n", + "\n", + "- au convergent d'indice $\\ell - 1$ (le dernier avant que la période ne se referme), la forme vaut $(-1)^\\ell$ — donc $-1$ **exactement quand la période est impaire** ;\n", + "- au convergent d'indice $2\\ell - 1$ elle vaut $+1$ ; mais la solution **minimale** de l'équation de Pell est atteinte plus tôt : c'est $p_{\\ell-1}$ quand $\\ell$ est **pair** (où la forme vaut déjà $+1$), et seulement $p_{2\\ell-1}$ quand $\\ell$ est impair.\n", + "\n", + "Le cas $d = 61$, période de longueur $\\ell = 11$, est le plus parlant : la solution de $-1$ tombe en $k = 10$ et celle de $+1$ en $k = 21$." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-27-08", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:15.389441Z", + "iopub.status.busy": "2026-10-25T08:00:15.389204Z", + "iopub.status.idle": "2026-10-25T08:00:15.395105Z", + "shell.execute_reply": "2026-10-25T08:00:15.394344Z" + }, + "papermill": { + "duration": 0.010674, + "end_time": "2026-10-25T08:00:15.396703+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.386029+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sqrt(61) = [7; 1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14] (l = 11)\n", + " k p_k q_k p^2 - 61 q^2\n", + " 0 7 1 -12\n", + " 1 8 1 3\n", + " 2 39 5 -4\n", + " 3 125 16 9\n", + " 4 164 21 -5\n", + " 5 453 58 5\n", + " 6 1070 137 -9\n", + " 7 1523 195 4\n", + " 8 5639 722 -3\n", + " 9 24079 3083 12\n", + " 10 29718 3805 -1 <- indice l-1\n", + " 11 440131 56353 12\n", + " 12 469849 60158 -3\n", + " 13 2319527 296985 4\n", + " 14 7428430 951113 -9\n", + " 15 9747957 1248098 5\n", + " 16 26924344 3447309 -5\n", + " 17 63596645 8142716 9\n", + " 18 90520989 11590025 -4\n", + " 19 335159612 42912791 3\n", + " 20 1431159437 183241189 -12\n", + " 21 1766319049 226153980 1 <- indice 2l-1 : solution minimale\n" + ] + } + ], + "source": [ + "def convergents_sqrt(d, nmax):\n", + " \"\"\"Liste des convergents (p_k, q_k) de sqrt(d) pour k = 0..nmax.\"\"\"\n", + " a0 = math.isqrt(d)\n", + " per = periode_sqrt(d)\n", + " liste = []\n", + " p_m1, q_m1, p, q = 1, 0, a0, 1\n", + " liste.append((p, q))\n", + " for k in range(1, nmax + 1):\n", + " a = per[(k - 1) % len(per)]\n", + " p, q, p_m1, q_m1 = a * p + p_m1, a * q + q_m1, p, q\n", + " liste.append((p, q))\n", + " return liste\n", + "\n", + "\n", + "d = 61\n", + "per = periode_sqrt(d)\n", + "l = len(per)\n", + "print(f\"sqrt({d}) = [{math.isqrt(d)}; {', '.join(map(str, per))}] (l = {l})\")\n", + "print(f\"{'k':>3} {'p_k':>14} {'q_k':>12} {'p^2 - 61 q^2':>14}\")\n", + "for k, (p, q) in enumerate(convergents_sqrt(d, 2 * l - 1)):\n", + " forme = p * p - d * q * q\n", + " marque = \"\"\n", + " if k == l - 1:\n", + " marque = \" <- indice l-1\"\n", + " elif k == 2 * l - 1:\n", + " marque = \" <- indice 2l-1 : solution minimale\"\n", + " print(f\"{k:>3} {p:>14} {q:>12} {forme:>14}{marque}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-09", + "metadata": { + "papermill": { + "duration": 0.002714, + "end_time": "2026-10-25T08:00:15.402349+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.399635+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat\n", + "\n", + "La colonne de droite ne prend que trois valeurs : $\\pm 1$ et un résidu borné — la forme oscille sans jamais s'éloigner. Et les deux indices annoncés tombent exactement où le théorème le dit : $k = 10 = \\ell - 1$ donne $p_{10}^2 - 61\\,q_{10}^2 = -1$ avec $(p_{10}, q_{10}) = (29\\,718, 3\\,805)$, puis $k = 21 = 2\\ell - 1$ donne $+1$ avec $(1\\,766\\,319\\,049, 226\\,153\\,980)$ — la solution minimale, celle que le balayage naïf n'aurait jamais atteinte.\n", + "\n", + "Le rapport entre les deux est la seconde moitié de l'histoire : *élever au carré* la solution de $-1$ la transforme en solution de $+1$. En langage de corps quadratiques, $\\left(29\\,718 + 3\\,805\\sqrt{61}\\right)^2 = 1\\,766\\,319\\,049 + 226\\,153\\,980\\sqrt{61}$ — le carré d'une unité de norme $-1$ est une unité de norme $+1$. C'est cette structure de groupe que la section 6 exploite." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-10", + "metadata": { + "papermill": { + "duration": 0.00537, + "end_time": "2026-10-25T08:00:15.412708+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.407338+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 4. Le théorème central : la période est impaire si et seulement si Pell négative est soluble\n", + "\n", + "Les sections 2 et 3 ont exhibé deux séries de faits séparés. Le théorème les soude :\n", + "\n", + "> **Théorème.** Soit $d > 0$ non carré, et $\\ell$ la longueur de la période de $\\sqrt{d}$. L'équation de Pell **négative** $x^2 - d\\,y^2 = -1$ admet une solution entière si et seulement si $\\ell$ est **impaire**.\n", + "\n", + "La raison est déjà visible dans la section 3 : la forme $p_{\\ell-1}^2 - d\\,q_{\\ell-1}^2$ vaut $(-1)^\\ell$. Si $\\ell$ est impair, ce convergent **est** une solution de $-1$ ; si $\\ell$ est pair, aucune solution de $-1$ ne peut apparaître, car la théorie des convergents épuise les approximations suffisamment bonnes, et une solution de $-1$ en serait une.\n", + "\n", + "La cellule vérifie le théorème sur toute la plage $2 \\leq d \\leq 200$ (les carrés exclus), puis affiche le témoin de chaque cas." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-27-11", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:15.422007Z", + "iopub.status.busy": "2026-10-25T08:00:15.421526Z", + "iopub.status.idle": "2026-10-25T08:00:15.449613Z", + "shell.execute_reply": "2026-10-25T08:00:15.448734Z" + }, + "papermill": { + "duration": 0.033229, + "end_time": "2026-10-25T08:00:15.451155+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.417926+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theoreme sur 2 <= d <= 200 : 186 concordances, 0 ecart(s) []\n", + "\n", + " d l parite Pell -1 predite Pell -1 mesuree\n", + " 2 1 impaire soluble soluble x=1, y=1\n", + " 3 2 paire insoluble insoluble\n", + " 5 1 impaire soluble soluble x=2, y=1\n", + " 6 2 paire insoluble insoluble\n", + " 7 4 paire insoluble insoluble\n", + " 13 5 impaire soluble soluble x=18, y=5\n", + " 29 5 impaire soluble soluble x=70, y=13\n", + " 61 11 impaire soluble soluble x=29718, y=3805\n" + ] + } + ], + "source": [ + "def pell_minimale(d, cible):\n", + " \"\"\"Plus petite solution x, y > 0 de x^2 - d y^2 = cible (cible = +1 ou -1).\"\"\"\n", + " for k in range(4 * len(periode_sqrt(d)) + 10):\n", + " p, q = convergents_sqrt(d, k)[k]\n", + " if q > 0 and p * p - d * q * q == cible:\n", + " return p, q\n", + " return None\n", + "\n", + "\n", + "concordances, ecarts = 0, []\n", + "for d in range(2, 201):\n", + " if est_carre(d):\n", + " continue\n", + " l = len(periode_sqrt(d))\n", + " soluble = pell_minimale(d, -1) is not None\n", + " if (l % 2 == 1) == soluble:\n", + " concordances += 1\n", + " else:\n", + " ecarts.append(d)\n", + "\n", + "print(f\"theoreme sur 2 <= d <= 200 : {concordances} concordances, {len(ecarts)} ecart(s) {ecarts}\")\n", + "print()\n", + "print(f\"{'d':>4} {'l':>3} {'parite':>7} {'Pell -1 predite':>17} {'Pell -1 mesuree':>30}\")\n", + "for d in [2, 3, 5, 6, 7, 13, 29, 61]:\n", + " l = len(periode_sqrt(d))\n", + " predite = \"soluble\" if l % 2 == 1 else \"insoluble\"\n", + " sol = pell_minimale(d, -1)\n", + " mesuree = f\"soluble x={sol[0]}, y={sol[1]}\" if sol else \"insoluble\"\n", + " parite = \"impaire\" if l % 2 == 1 else \"paire\"\n", + " print(f\"{d:>4} {l:>3} {parite:>7} {predite:>17} {mesuree:>30}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-12", + "metadata": { + "papermill": { + "duration": 0.00458, + "end_time": "2026-10-25T08:00:15.460260+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.455680+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat\n", + "\n", + "**$186$ concordances, zéro écart.** La parité de la longueur de la période est un indicateur parfaitement fiable, sur toute la plage, de la solubilité de l'équation négative.\n", + "\n", + "Le tableau des témoins montre les deux régimes. $d = 2, 5, 29, 61$ ont une période impaire et possèdent une solution de $-1$ — pour $d = 61$, c'est le $(29\\,718, 3\\,805)$ de la section 3. $d = 3, 6, 7$ ont une période paire et n'en possèdent aucune : pour $d = 7$, $x_1 = 8$ est la plus petite solution de $+1$, et rien ne la précède au signe négatif.\n", + "\n", + "La conséquence pratique est nette : la solution minimale de $+1$ est $p_{\\ell-1}$ quand $\\ell$ est pair, et le **carré** de $p_{\\ell-1}$ (c'est-à-dire $p_{2\\ell-1}$) quand $\\ell$ est impair. Le coût du calcul ne dépend donc que de la longueur de la période — jamais de la taille de la solution." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-13", + "metadata": { + "papermill": { + "duration": 0.006236, + "end_time": "2026-10-25T08:00:15.472211+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.465975+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 5. Le critère de Legendre, et sa limite\n", + "\n", + "Le théorème de la section 4 dit *quand* la Pell négative est soluble, mais il faut déjà connaître la période pour l'appliquer. Existe-t-il un critère purement local, sur $d$ lui-même ?\n", + "\n", + "Une condition **nécessaire** est élémentaire. Si $x^2 - d\\,y^2 = -1$, alors $x^2 \\equiv -1 \\pmod d$ : $-1$ doit être un résidu quadratique modulo $d$ — et en particulier modulo chacun de ses facteurs premiers. Or pour $p$ premier impair, $-1$ est un résidu quadratique modulo $p$ si et seulement si $p \\equiv 1 \\pmod 4$ (c'est le supplément à la loi de réciprocité quadratique, établi dans les carnets [11](11-corps-quadratiques-reciprocite-quadratique.ipynb) et [13](13-jacobi-kronecker-reciprocite-II.ipynb)).\n", + "\n", + "Pour $d$ **premier**, Legendre a montré que cette condition nécessaire est aussi **suffisante**. Pour $d$ **composé**, elle ne l'est plus — et c'est précisément là que le critère tombe. La cellule mesure les deux phénomènes." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-27-14", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:15.484937Z", + "iopub.status.busy": "2026-10-25T08:00:15.484602Z", + "iopub.status.idle": "2026-10-25T08:00:15.517921Z", + "shell.execute_reply": "2026-10-25T08:00:15.517351Z" + }, + "papermill": { + "duration": 0.040798, + "end_time": "2026-10-25T08:00:15.519222+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.478424+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "premiers < 500 : 95\n", + " p = 1 mod 4 : 44, Pell -1 soluble : 44\n", + " p = 3 mod 4 : 50, Pell -1 soluble : 0\n", + "\n", + "composes dont TOUS les facteurs premiers valent 1 mod 4 (ou 2) :\n", + " d facteurs l Pell -1\n", + " 34 [2, 17] 4 INSOLUBLE\n", + " 146 [2, 73] 2 INSOLUBLE\n", + " 205 [5, 41] 8 INSOLUBLE\n", + " 221 [13, 17] 6 INSOLUBLE\n" + ] + } + ], + "source": [ + "def est_premier(n):\n", + " \"\"\"Test de primalite par division jusqu'a sqrt(n).\"\"\"\n", + " if n < 2:\n", + " return False\n", + " return all(n % k for k in range(2, math.isqrt(n) + 1))\n", + "\n", + "\n", + "def facteurs_premiers(n):\n", + " \"\"\"Facteurs premiers distincts de n.\"\"\"\n", + " f, m = [], n\n", + " for p in range(2, n + 1):\n", + " if p * p > m:\n", + " break\n", + " if m % p == 0:\n", + " while m % p == 0:\n", + " m //= p\n", + " f.append(p)\n", + " if m > 1:\n", + " f.append(m)\n", + " return f\n", + "\n", + "\n", + "premiers = [p for p in range(2, 500) if est_premier(p)]\n", + "un_mod_4 = [p for p in premiers if p % 4 == 1]\n", + "trois_mod_4 = [p for p in premiers if p % 4 == 3]\n", + "\n", + "resolus_1 = [p for p in un_mod_4 if pell_minimale(p, -1)]\n", + "resolus_3 = [p for p in trois_mod_4 if pell_minimale(p, -1)]\n", + "print(f\"premiers < 500 : {len(premiers)}\")\n", + "print(f\" p = 1 mod 4 : {len(un_mod_4)}, Pell -1 soluble : {len(resolus_1)}\")\n", + "print(f\" p = 3 mod 4 : {len(trois_mod_4)}, Pell -1 soluble : {len(resolus_3)}\")\n", + "print()\n", + "print(\"composes dont TOUS les facteurs premiers valent 1 mod 4 (ou 2) :\")\n", + "print(f\"{'d':>4} {'facteurs':<18} {'l':>3} {'Pell -1':>9}\")\n", + "for d in [34, 146, 205, 221]:\n", + " l = len(periode_sqrt(d))\n", + " sol = pell_minimale(d, -1)\n", + " print(f\"{d:>4} {str(facteurs_premiers(d)):<18} {l:>3} {'soluble' if sol else 'INSOLUBLE':>9}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-15", + "metadata": { + "papermill": { + "duration": 0.005559, + "end_time": "2026-10-25T08:00:15.530652+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.525093+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat\n", + "\n", + "Pour les premiers, le critère de Legendre est **exact sur toute la plage** : $44$ premiers $\\equiv 1 \\pmod 4$ sur $44$ possèdent une solution de $-1$, et $0$ sur $50$ parmi ceux $\\equiv 3 \\pmod 4$. La condition nécessaire est suffisante — c'est le théorème de Legendre.\n", + "\n", + "Pour les composés, elle ne l'est plus. Considérez $d = 34 = 2 \\times 17$ : chaque facteur premier admet $-1$ comme résidu quadratique ($2$ trivialement, $17 \\equiv 1 \\pmod 4$), et pourtant $x^2 - 34\\,y^2 = -1$ n'a **aucune** solution — la période de $\\sqrt{34}$ est de longueur $4$, paire. Même chose pour $146$, $205$ et $221$ : la condition locale est satisfaite, le théorème de la section 4 tranche à l'opposé.\n", + "\n", + "La morale est celle de toute la série : le comportement se décide au **signe** de la norme, pas seulement modulo les facteurs. C'est un phénomène global, invisible à l'arithmétique modulaire composante par composante." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-16", + "metadata": { + "papermill": { + "duration": 0.005191, + "end_time": "2026-10-25T08:00:15.541617+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.536426+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 6. L'unité fondamentale : Brahmagupta, les puissances, et le rang 1\n", + "\n", + "Revenons à la structure. L'identité de **Brahmagupta-Fibonacci**, croisée au carnet [15](15-quatre-carres-lagrange.ipynb), énonce que la norme $N(x + y\\sqrt{d}) = x^2 - d\\,y^2$ est **multiplicative** :\n", + "$$(x_1 + y_1\\sqrt{d})(x_2 + y_2\\sqrt{d}) = (x_1x_2 + d\\,y_1y_2) + (x_1y_2 + x_2y_1)\\sqrt{d}.$$\n", + "Composer deux unités donne une unité, et leurs normes se multiplient. En particulier :\n", + "\n", + "- composer deux solutions de $+1$ donne une solution de $+1$ ;\n", + "- composer deux solutions de $-1$ donne une solution de $+1$ — c'est le carré de la section 3 ;\n", + "- composer une solution de $-1$ avec une de $+1$ donne une solution de $-1$.\n", + "\n", + "La cellule vérifie la structure sur les deux exemples les plus parlants : $d = 2$, où les puissances successives de l'unité fondamentale $3 + 2\\sqrt{2}$ épuisent toutes les solutions, et $d = 61$, où les puissances de l'unité sont les unes après les autres les solutions d'indice croissant." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-27-17", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:15.551204Z", + "iopub.status.busy": "2026-10-25T08:00:15.550814Z", + "iopub.status.idle": "2026-10-25T08:00:15.556793Z", + "shell.execute_reply": "2026-10-25T08:00:15.556253Z" + }, + "papermill": { + "duration": 0.012814, + "end_time": "2026-10-25T08:00:15.558035+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.545221+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d = 2 : les puissances de l'unite fondamentale 3 + 2*sqrt(2)\n", + " (3 + 2 sqrt2)^1 = 3 + 2 sqrt2 norme = 1\n", + " (3 + 2 sqrt2)^2 = 17 + 12 sqrt2 norme = 1\n", + " (3 + 2 sqrt2)^3 = 99 + 70 sqrt2 norme = 1\n", + " (3 + 2 sqrt2)^4 = 577 + 408 sqrt2 norme = 1\n", + " (3 + 2 sqrt2)^5 = 3363 + 2378 sqrt2 norme = 1\n", + " (3 + 2 sqrt2)^6 = 19601 + 13860 sqrt2 norme = 1\n", + "\n", + "d = 61 : les puissances de 1766319049 + 226153980*sqrt(61)\n", + " unite^1 : 1766319049 + 226153980 sqrt61 norme = 1 (10 chiffres)\n", + " unite^2 : 6239765965720528801 + 798920165762330040 sqrt61 norme = 1 (19 chiffres)\n", + " unite^3 : 22042834973108102061352541449 + 2822295814832482312327709940 sqrt61 norme = 1 (29 chiffres)\n" + ] + } + ], + "source": [ + "def composer(s1, s2, d):\n", + " \"\"\"Compose deux solutions par l'identite de Brahmagupta-Fibonacci.\"\"\"\n", + " x1, y1 = s1\n", + " x2, y2 = s2\n", + " return x1 * x2 + d * y1 * y2, x1 * y2 + x2 * y1\n", + "\n", + "\n", + "print(\"d = 2 : les puissances de l'unite fondamentale 3 + 2*sqrt(2)\")\n", + "u = (3, 2)\n", + "for n in range(1, 7):\n", + " print(f\" (3 + 2 sqrt2)^{n} = {u[0]:>6} + {u[1]:>6} sqrt2\"\n", + " f\" norme = {u[0]**2 - 2 * u[1]**2:>2}\")\n", + " u = composer(u, (3, 2), 2)\n", + "\n", + "print()\n", + "print(\"d = 61 : les puissances de 1766319049 + 226153980*sqrt(61)\")\n", + "u = pell_minimale(61, 1)\n", + "for n in range(1, 4):\n", + " print(f\" unite^{n} : {u[0]} + {u[1]} sqrt61\"\n", + " f\" norme = {u[0]**2 - 61 * u[1]**2}\"\n", + " f\" ({len(str(u[0]))} chiffres)\")\n", + " u = composer(u, pell_minimale(61, 1), 61)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-18", + "metadata": { + "papermill": { + "duration": 0.005929, + "end_time": "2026-10-25T08:00:15.569950+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.564021+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat\n", + "\n", + "Pour $d = 2$, les normes valent $1$ à chaque puissance, comme la multiplicativité l'exige : $(3, 2)$, puis $(17, 12)$, $(99, 70)$, $(577, 408)$, $(3\\,363, 2\\,378)$, $(19\\,601, 13\\,860)$. On reconnaît au passage $(17, 12)$ — la solution de $y = 12$ qui intervient dans l'approximation de $\\sqrt{2}$ par $17/12$. Toutes les solutions de $x^2 - 2y^2 = 1$ s'obtiennent ainsi : elles forment le groupe **cyclique infini** engendré par $3 + 2\\sqrt{2}$.\n", + "\n", + "Pour $d = 61$, la même mécanique produit des nombres dont la longueur croît linéairement en $n$ — $10$ chiffres, puis $19$, puis $29$. C'est exactement ce que prédit le théorème des unités de Dirichlet : le groupe des unités de $\\mathbb{Z}[\\sqrt{d}]$ est de rang $1$, c'est-à-dire isomorphe à $\\mathbb{Z}/2 \\times \\mathbb{Z}$ — le facteur $\\mathbb{Z}/2$ étant $\\pm 1$, et le $\\mathbb{Z}$ étant engendré par l'unité fondamentale. Le contraste avec le carnet [11](11-corps-quadratiques-reciprocite-quadratique.ipynb) est total : dans un corps imaginaire, ce groupe se réduit à ses racines de l'unité, donc il est **fini**.\n", + "\n", + "La figure suivante mesure la taille de l'unité fondamentale sur toute la plage $d \\leq 100$ : elle rend visible l'échelle logarithmique du phénomène, et le fait que la longueur de la période en est le vrai paramètre." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-27-19", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:15.582144Z", + "iopub.status.busy": "2026-10-25T08:00:15.581735Z", + "iopub.status.idle": "2026-10-25T08:00:16.367878Z", + "shell.execute_reply": "2026-10-25T08:00:16.367197Z" + }, + "papermill": { + "duration": 0.793893, + "end_time": "2026-10-25T08:00:16.369336+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:15.575443+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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Y25wUrdYjyFAUiQlFzmQIrzpKwp7/PDDD4X+22eeecZNAaNppzp27Oimsihsui1NiRMqdIqKcNNtLVu2LHDssce66TH0XPBURevWrXNTxTRs2DBQrly5QN26dd00K4888kix7zvcdFuybds2N3VH/fr13TY1fYrKHjy1h1d2vXYk0ynNnj070LlzZ7eftL80XUq49/r6668H2rdv76azadKkSeAf//hHYNKkSQWmItFrnHzyyQVeO1yZCtv/33zzTWDgwIFun+l9HnDAAYFTTjkl8PLLLxc7FZs3/Uzw1CRr1651ZapSpUq+aZI03c3VV1/tptPRZ3jUUUe56Vgimd4o0nIW5pdffgmcd955gapVq7ppe/T7okWL4vo63pQuxT2Km25L072onmu6K01FduCBBwauueaawJYtW0pUlwqrn6LpZ7xthH4Hr7jiCjeNVihNTXPqqacGKlWqFKhZs2Zg2LBhgbfffjvsdFuHH364m7ornERMtyW33nqr+8w0PVHw9yXS71RJptvyvPLKK24aIU0NqEerVq3cvl++fHmx5Y7kGFbUPlNd0muGo2mwNC1R5cqV3Wd24YUX5k0JGPy+NP3R5ZdfHqhVq5abdin4PYabmi3SOqipmDSVlr57Oi6ceeaZgfXr14fdZqTHcr2unotEpN9pHSeGDh3qntd7atCggduv3vRfhe3/wo5ZOsb069cv77us77ze+4wZM6Kabkt2797t6qzOVdpW9erV3T64+eabCxwbQoWb8inS85um09PnkZ2d7eqPpllTfVaZ77jjjry/27x5c2Dw4MGufunvNNWYztmhx7mipvUMty8KO59Ec06K9TwZrk7//vvv7hipz1bfuz59+rhrpHB1etq0aYF27dq5OtWyZUt3vZSIYwhQ2rL0v+SE9AAA/L8mTZq4Ltdq5VPrsdcNNxY33XRT2K6EJaG8CWrtVDIdje2MlqYcOuSQQ1yrTHACJ7W0qbVULfpqldFwgODpu5Da4lkHC6OxwephoZbUyy67LGGvg8K/2506dXJTCZ577rnJLo6vqBVfsw/oewCkO8ZYAwB8Y/LkyS5pk7oK+o26zGpoh7rnloT+nQLm0KzIGgKg96ygGigJdSVX12p17UZiaQx3KN3QUHf3Y489NillAuAPjLEGAPiCxpd7F61+mC4nnOCEbyW5aRCOxkkGZ6QujenwkF6Ub0APJN6dd97p8iloTLbmSVcPFj005tevxy0ApYPAGgDgC0pAlIk05VkippUCEH9KzKUbYbfeeqtL+qfp6tTNWYnPAGQ2xlgDAAAAABADxlgDAAAAABADAmsAAAAAAGKQ8WOsc3Nz7eeff3aTzmtKAAAAAABA6gkEAm4Kwvr167ts/aUp4wNrBdVkcQQAAACA9PDDDz9YgwYNSvU1Mz6wVku1t/OrVq0a99bwDRs2uPlJS/uOCVAU6ib8iHoJP6Jewq+om/Cj3CTXy61bt7pGUy/GK00ZH1h73b8VVCcisN65c6fbLgc8+Al1E35EvYQfUS/hV9RN+FGuT+plMob4Rh1Y79q1y+bPn2+rV6+2HTt2uLsRnTp1sqZNmyamhAAAAAAA+FjEgfWHH35oEyZMsDfeeMP++OMPq1atmu277762adMmF2w3a9bMLrroIrvkkkuS0vQOAAAAAEAyRNQ+f+qpp1r//v2tSZMmNm3aNJdp7ZdffrEff/zRtVqvWLHCbrjhBpsxY4YddNBBNn369MSXHAAAAACAVGmxPvnkk+2VV16xcuXKhX1erdV6DBo0yL788ktbs2aNpYucnBzXQl/SMQb6txpnwNgX+Emm1U0du8qWLZvsYgBAPjVr1rSFCxe6hotIzZ4920aMGOEaNjStzOOPP25du3a1jz/+2IYNG2aLFy+2E044waZOnVrkds444wwbPny4+7fnn3++dezY0a688sqIy3H66afbRx995K75Nm/ebPvvv3+xz+mcc9RRR9l7773nej4CQMYF1hdffHHEG2zTpo17pIPt27e7VnmduEpC/04BjFr4mSMbfpJpdVPvUVMuVK5cOdlFAYCYpghVI8Zbb71lrVu3dkPxfv/9d/dcvXr17N5777VFixa554uyYMECN5RPQXVJaejfgw8+aHXq1In4uYoVK9p5551nd911l91yyy0lfm0A8KOMzwpeVEu1gupKlSq5BG0lCT4UvOzZs8f22WefjAhekDoyqW7qvWraB32fW7RoQcs1gKR5/fXX7dprr3W9aE466aSo/72C1XPOOccF1VKhQgX3EN081EM9B4vz8MMPu+3EomfPniV67qyzznJJb2+++ea0P/8AyCxRB9bVq1cPeyDUOt2JbN68uetSNHjwYEtl6iarC3IF1UrSVhKZFLwgtWRa3dT3+LvvvnPfawJrAMmwfv16d230/vvvu559jzzyiMtX47nqqqts5syZhQbChx9+uAuaGzdu7ALXjRs32jHHHGN33HGH7bffflGVZdasWe71wlEZCntOQwNvu+02i0XdunXdddUXX3xh7dq1i2lbAJDSgfWYMWPcQbV3797WpUuXvC5Fb7/9tl122WW2atUq+9vf/uYu2i+88EJLdZkQdADpju8xgGSbN2+etW/fPm+43AUXXGCXX3553vP33HNPsdvQtdWcOXPs3XffdUNbFKjfeOON9s9//jOqsqgHT7gu3NKjRw83TjuRFFyrDATWADI6sP7ggw9s7NixbvxM6N1UZQxXkjOdOO677760CKwBAAASfcMvkhbrRo0auSRj6j0oZ599to0bNy7q19YwNyUSS0aLtei1S9obEAD8Kup0wO+8807YsTPHH3+8e07+9Kc/2bfffhufEqJUff/99+4u+JYtW0r075U4pXv37iX6t+oep/FhyaL3vXTp0rhuc/LkyXbmmWfGvB112wvOuKp9rH3tN9GU68knn3QXiIW56aab7LTTTotoW+rm3apVK5fIBwD8SInCPvvsM1u2bJlbnjRpku3evTtfi7VaisM9FFSLxkUr8PWOdUpS1qFDh6jLogaQ5cuXF9liHe4Rj6BaOWy++eYbO/jgg2PeFgCkdGCdnZ1tb7zxRoH1Wqfn5LfffrMqVarEp4QoVbobrmzoyZgGQ2PF1DUsWfS+43miV9btv//97zZ69Oi8dZpSRXfpFcRrmpU+ffq4C4xEe/HFF+3II490rRRFBbOpSvtVF60TJ05MdlEAoNBcDwqm+/bt64LhFStWWI0aNaLaho7jp556qkv+pfOVxll7wa4CZd2c1hRaaujQ70p2Fo6mw/IaQ0pKrdfezfC2bdvmu6le1HPq+XjYYYflXTMCQMZ2BVeQoDHUumPqjbHW3Ilvvvlm3kXt9OnTrVu3bpbJ9uTk2nvL1tt3G7dbk5qV7bhWtW2fsv6eL1iJnQqbqzzTlWTf6DuhC4fQYP355593LbFbt251wyUGDhxoH374oSWSyqH5SXUh99JLL1k60hQ02p+axxUA/OjPf/6ze3j+8Y9/RL2Na665xj1CtWzZMuKb0xqbrSBdPYOU+Ew9iKL13//+t0TPPfTQQy4zOgCkm6gjPV24zp492x2Ip0yZ4h5qBdM6JeKQq6++2l544QXLVCvWbbNj7pxpF/37E7vj7eXup5a1PhEtdbpbfcghh1jVqlXtxBNPdPNcBmchPffcc938lvXr13fBldeFzOterJOcWqp1klWXWo37+vXXX/MCyuuuu849r7vt/fv3d1MXeZTV84gjjnA9FNR9LPi1i3v9SLo7jxw50g0zUH3T6/z000/uQkBl0d3wV199Ne/vlY1+yJAhLmhVi7C6uunOuOeZZ55xiVJUVr0f3SQKnqNc79tL2KLXOOWUU9xNJAWlo0aNcn+r3AHqcqxyqnxfffVVkdOqHHfccYU+r89L83mqa2C0+ypaGr6hLukHHHBARH9/9913u32kfaU69thjj+Xbj5rqRfvg6KOPtk8//TTirt5aDr2AU6u+Wm30eoW1rkSyf4466ih3UVnUZwIAibiRPv3Ldfb4B6vcTy37nc6R6nquhLOlSWOr1fDSq1evUn1dACgNJWpC1QWsWt10Qa2HfldQhr0n2IGTFtj6rXsv+HP/F7dpWesTccJV0PPcc8/Z2rVrXabNAQMGuPUKBNVlTOvU3Vjjh5csWeKSz3m2bdvm1mnMl26OhFJSlP/85z8uQNUJWMGnghv3XvfscdtX4KspQ26//fZ8AVgkr18c1S0Fs5s2bXJBnk7ICnTXrFnj5sDUjR4F/x7tB93g0Y2BSy+91L2+d5NAwZtuBKmlWEGvpjrR3xdGme41rk0B3a233upuQDz++ONu2IO63/Xr18915Q4eIxdMQbqC8MKoXE8//bS7KRKPfRUvX3/9td1www0uGaHqx/z58/N6pygbrW42KJGObrCoO6HmYi3pmPzPP//c1Sl9nroZpxsYeo1Qkewf9SjQdH+JzmYLAKE30i98eqHd9t8v3c9E3UiPN527Szsrt6Zl1TkEANJRmZImnlD2b13U6qFWQ62D2czlG2zNlp2WE9QSKlrW+lnL/7+1N150klIAp54Dd955p+umr5a7hQsXuq6/48ePd88psFTrYHAwqXHAmgNTz+sR6t///rcLstSaqDvcaslUV3+1TM+dO9cFmGrdLV++vBvjqhZtTySvXxzdJND4rAoVKrhxaRq/f8UVV7j5l5UNVQH96tWr8/5eLcQKdvW8MtdrOhHdGBBNEXfQQQe5QE4tp/r3aiUvjC441Aquban8DzzwgN1yyy3WokULt07l+P33313gGc7mzZtdq3Qo3ZhQRle9L+1/Bdfx2FfxonmeFciqN4Len/ahWv+9+qDP5Nhjj3WBrFqN9V6K6vZXFPVECK4/2jfaH6Ei3T/a39rvAJCON9IBAP4V9RjrlStXuqzf6pKr8Txeq2bDhg3dxfWBBx5omez7TTusTNb/n2CDaf3qTTvi/pqNGzfO+11BkIJQfT7K8K1W0eAEIQqYgm+CqBU4uPt1KAXo6grsURdcbV/rFVxrOXjsscridcVVt/LiXr84wfNsKqAKXfaSjoXbF96y9oUoUYtaudUiq1ZudSNWsF0Y3UwIpvejoFKBp0et1YWNaVPAqdbxUM8++2yBbNeaCz7WfeXRe1KGdVHwqUc09B1+6qmn7F//+pcbh6cu+Lpho5sReq+hWd+bNm1a4qRz4epPuJ4TkdYl7W9vGhoAKI0b6aGCb6T3bBN+rmgAQPqJOrBWK50uvOfNm5d3katWQwUceq6kLVfpolF2pbBBtWh94+yCrcKxCm6xVbdlBYwaS6vAo3bt2q6bbWHKlCm604LGMSuo8ab6UHdzbV/r9VPBdXBiLwXzHt1sKe71E7kvvPJoXygAVtdtjeE966yz3M0BtbbqvUW6b/R+NJWUuj5HQoGoN61KceK5rzT9Sqw0HlsPtViPGTPGjQVX92uvPgTTcrhp0tTDYceO/DeSVH+Chas/4caBR7J/tB3d+EvHrOcA/CcZN9IBAGnUFVytSWq9Cm45UrdMdScO19KUaXq0rGX1qlW0sllZ+dZrWeu7t6wV99fUeFdNs6EgSJk21U1XgY6ms1BAoq7cGiurQFuBZzSBl26YaOz0Dz/84FqGNY2HEmGppVEtmaoHGn+swFVdooOT1sXj9aP13nvvuZs7Gv/96KOPukBM037oJoCSpqiuKqhWWaPtZn3ZZZe5INOb+1Oto6+99pp7b+GoS7q65Uci0ftKLbt6/wo+tW39XlhiNL0/dfdXfVIXbQXI6vru1Qe1uCuLufbx/fff726sqRdLKAW4ms9eref6Wx039LfB1LU/uP5o294Y/mj3z0cffeSCciVWA4B0vJEOAEijwFpBSbhAQkGXLsIznabUenpIF6tdtULeXWvRstYnYsotZcLWeGF1k1a3ZwUnoi7LGl+sdQo2NDe1gky16kVKGcGVaVzjX9UlXIGZskKLWhmVBExdrL3M2SqLJx6vH61zzjnHBdTq3q6kZwp81TVYXd41Rvqiiy5y43CVST14PHgkhg4d6sZcq+Vb29B7Kio4V7CpMehK0FWcRO8rjY3W/Nl6/8pCrm70hSWtUZCrjOmqT7oRoZsVXiZvJY9TMK0EcXpu8uTJLrgNN5xAicQUTCvBmTJ5K5DXuPJgKoOCbj2vv9PnouzyJdk/Gputmx8AkK430gEA/pUVCJ5vKAKac1eZwJUd2csUrJYmZWfu3LlzieZCTCa1OuoiXVmNgxNNqUVPWbA1flRZLKOlpCUzl6+3VRu2W9Nala1Hy8TMY61gV92TQ8fsZiIFvQrwtD/8QlnNp06d6rvp5/S1V0Crlmglc0t1ar1WF31lBNfNv1Cxfp9ROpTMT8NZ1O2/uGEqgB/qpbJ/K1GZxlR73cIVVOtGeos6VZJWZmQGjpnwo9wk18vCYjtfjrFWK+CgQYNcC6Y3LtKbdmnChAmWDP/85z/tiSeecAGCWk296aaSSUF0z9Z1bE+LGmkTvCB66kmgBxIrOGkeAJQWBc/vj+zhEpVpTLW6f6ulOhE30gEA/hZ1YK0WQXWv1dQ3XmImdc1Ut89kUEIldcf95JNPXCucupGecsopRWa6BgAAiNuNdLJ/A0DGizqw9mguXz2STa1Uaj33und26NDB3n77bZf5ORMUldU606TaMAQAAAAAGRRYKxN0pO6+++6oCjBnzhwbP368a3FWBudXX321wHhhJZ3S32iqHgXOSp7kje9W8iPNTaw5btViPWvWLDvooIOiKgMAAAAAAAkNrBctWhTRxkoyjljT7ShYVjZpZVsOpaRPCuwnTpzo5lJWYiplqdaUQBoU36ZNGzd/9nHHHecGqmsKKGUQBgAAAADAN4F1pHPxlkTv3r3do6gWcGUcHzx4sFtWgK15iidNmuQSlcnFF1/sHvLXv/61yC7qmvIneP5eZY7zMtjp4dHvagH3HiXl/dtYtgEkQibVTe97HPo9h794x10+I/gJ9RJ+Rd2EH+UmuV4m8/tQ4jHWpUHz6aqLuOZS9ihte8+ePW3u3Ll567yU7mrFXrBggQu+CzNu3DjXdTzUhg0b3JQ8Hs3XrA9GGc/1KAlVqpycHPc7WcHhJ5lWN/Ud1vf5l19+yZvNAP6jz0jTY6h+MnUM/IJ6Cb+ibsKPcpNcL7dt22bJ4uvAeuPGje7iv06d/Nk2texlJJc///nP7gPcb7/93LRbmt6qMArSg8eMq8W6YcOGVqtWrQLzWOuD0baK2l4kuJCHX2VK3dR3WAf3GjVqMI+1z0/GutGj4zEXifAL6iX8iroJP8pNcr1M5nWerwPrSAW3XhenQoUK7hFKH3zwh6/fVSm8R0noTo33b1OlVfD7779349Z/+uknN2Y9WhoDP3XqVJdErrRdcsklrsz/+Mc/4rZN3Xjp1KmTzZs3zx0gYtGkSRO3f5ScTxnM9fvixYstEW6//XY3Fd3zzz+f0Lqpf6scDB07diz2b88//3w3DZ7edzjdu3d3++bKK68sdlvPPvusvfnmm+5npOXUI/R7Dv/hc4IfUS/hV9RN+FFWEutlMr8Lvv4W1qxZ0yUiW7duXb71Wq5bt27SypXOGjVqZNu3by9RUJ1sGgIQz6Ba7rrrLhfseUH1TTfd5Fo/K1eu7Ho4HHzwwYUGr/GkjPmnnnqq1a9f3x2sigvI//73v5dKuZLl7LPPdsM+Ik2sCAAAAGRsYF2+fHnr3LmzzZgxI1/3Ai1r7mrEl8aVp6uSvDeNy33kkUfyEud5TjnlFHfzQVO8jR492s4777x8QxMSdfftpJNOcr0BsHd/nHvuufbggw8muygAAABAyQLrf//733bUUUe51rPVq1e7dere+dprr0W9LQUoan3zWuBWrVrlfleXZNF46EcffdSeeuop++qrr+xvf/ubm6IrNNjxnZw9ZsvftDILJrqfbjkB1L34tttus0MOOcS1oGoqsp9//jlfYjcFIPXq1XOfl7rZelnR1V1bXXMfeugh11J95JFH2nfffedaRBU0egGpxqXrebXa9u/f3yV683zxxRduirMqVapYjx498r12ca8fyiuP5inX36tXwo033piXtVp1olevXq4c1atXt5NPPtmVN7irsdeN2HsfGnPfvHlza9CggVv/6aefunJmZ2e79apbhVGLqMb4a670woK7M88805VZ+0HlvO+++6xVq1Zunbo2q87Gg/IKXHrppXnztxdHLevB88FrX6hFX+9F9cTLSyD6PDTdnXqIqKeC/ubjjz+O6PMPFrz/RXVIrxv8GalrvcqlFv/27dvbBx98UOh7KO6zOv744+2NN96IaH8AAAAAvgqsFYQp2P3Tn/7kLpy9zMJFjZ0sysKFC90YVj1E29bvY8aMccu6kP/nP//pljWOU0H322+/XSChma+sX2Y2ob1lTT7Hyrw7xv3UslufAI899pg999xztnbtWheMDhgwwK1XoKfuw1r3zTffuDG3S5YssbFjx+b9WyVo0zq1uM6ePTtsFvX//Oc/LgDSTQ8FSgqUvRZdbV8BjrIta1yvyuKJ5PVDqTwKqPT3CrQ1rdrTTz+d11tB9eOHH35wN3QqVarkpmIryuuvv+7qmMqu/aPAXDdnFByq9VeBe3CPiGCqawqSC6O6P3nyZBcsKkjUd+Pxxx93wZ4S72le9j59+rjs9n7w4osv2nvvveduUPz44482YcIEt143rfS5rFy50n2np0yZkjfUoqjPvyRUTy+44AL3OrpRoPrh3cQJFslnpVwAGhaibvIAAABASgXWak1Uy9H111/vxj97Dj30UBc4RUutesHzRXsPJXfyDB061AVSalmbP3++HX744eZbapl+pp/ZtrVuMSvwv7nUtKz1CWi5VvChAFCB5p133unmHVfgpIByxYoVNn78ePecMiJr7K2CG4+C1TvuuMM9r0e43gk33HCDa7FUK6PmFZ8+fbprmVbSOAWQah1Vt311z9eNEE8krx9K5dE4af293pM+e5XBa53XnOfK9qdWV9XB999/v8j56hSM6aaPtqftHHvssa6VWXVXLbPq+VBYeTZv3pwvU7xH86hrm7q5ozHYGsusudMfeOABu+WWW9zvGod9xRVX2O+//+7qrB+MHDnSTUunsivo1w0MLzO4bmiodV3fvYMOOshlyi/u8y+J4447zt1s0P5RsjntQwXuoSL5rLzPRp8TAAAAkExRZwVXq5XXuhxMmbbVRTvjrZhmtvWngusDOXvXr5xu1rJ3XF+ycePGeb8rUNFnoazeaplUa6C60oabv1jUhVuBVmEUoCug9ag7t7av9QqutBw8ZZPK4nV/Vhfg4l4/lIJmBX/B29N7EbVcDhs2zAXTwd2YFRQWlmxNAaFH5VEm6eD3q7Icc8wxYf+tupurNTqUuqCHG+us7au3QPANJ7VWa19FQ5muL7744rz3r27m8RCc8E9T02kYhmiMuFp9FeiqN4BakdVLRF3Di/r89XssdTX08w0WyWflfTb6nAAAAICUarFu2rRp2IzE6p7dunXreJUrdW3+ziyrkN2q9ZtWxf0lvXHu3phmBZsHHHCAa3VUkKrg1nsoIPUCqkhS0mtscvAYWXXR1fa1XoGVguvgxGDe2HiJ5PVDaf5wvYfg7em9iMb67tixw7W0KqiaM2eOW++NwQ4n+P2pPH379s1XHgXlCuDC0dCD5cuXW6S0/Zdeeinf9lVeZbCOhrpaax/pEa+guihqPVZPAnUH100R7fObb7652M8/lFq09X494bpoB9fV0M83WCSf1ZdffuluJGk8PgAAAJBSgbXGuF522WX2wgsvuIBGCZ6UPEtBj7qaZrzqTcy87t+htD67adxf8uGHH3YBoLodX3vtta4LrQKfww47zAUo6sqroESflwKbt956K+JtqwVWY6fVkqlAT59/z549XVCtpGVqjb711ltdy6y6PKteeEry+gqEVZf0XvSe1L3aG9OrYFpdutWKqTHdXvAXKbXMaozxK6+84m4G6KGbRF6irlBeorBIg1t9L5QLwAvGVV4l9NN7jwfddNBDtL/1e1Hd4COlfaL9oDHzaslWrwEF28V9/qGUQO+dd95xAbXec7jPR6+lrvR6LQ0p0d+qB0BJPis9H+7fAgAAAL4PrP/617+6MbAKltQ6dc4557ikTUqEdNZZZyWmlKmkxQlmVQ8wy/r/7sCOlrW+ea+4v6QyOqtVVK136larrsSiLskav6p16k2g7tIKRJSkKlIKcpVpXOOn1SVYAc4zzzzjnlMXcCUHUzClAHvUqFGuLJ6SvL66pquluFmzZu4GwcCBA23QoEHuOQVq+rfq+qus9BpvHQ21jKqsuhGhVk7tLwXD4bp7i4JLdclWZvFIaDy4MmNr/LLG/+o9FzWePFr77ruve4jyDOh3r9U+FkoApvqjGxbqkaLPSWPTi/v8QykI79atmxsbr88wXNCr44UCar2WMqjrxkO4rtzFfVa6oaB6rnUAAABAsmUFiupHWwwF1mrFCh4Tm2p0oa5AQl2UgxNVqTVQ48kVaKgFLyrK/q1EZVt/skBWmb0JzBRUD5hiVrvwLNMloWBH2diDp1ZKVcoCrvcRLkt0MuuHcgrMmzfPTTeVLvS1V6uxbh4o03eq0Q0LtXx7N5GKE9P3GaVGN0w0FETnlOKGqQClhXoJv6Juwo9yk1wvC4vtfJm8LFhhmaQznoLnYZ9ZYMU0y/3lGytT40DLUkt22Zh2N5JAX0hN/QV/Ucu3HgAAAIAfRBTpqcUu0lYtbwqfjKcgumVvy92zx8povGoKtgoCAAAAAOIUWKdDN+N0FZyxOdVpTnM/dQMHAAAAgLgF1l4iIwAAAAAAkB+ZDooRQ243AD7B9xgAAABJb7HWdDiRjrHetGmTpQNNFeXNF+xNcQQgNel7HPy9BgAAAEo9sNZ0TplG0xAp4/mGDRvcfM0lSRef6lMaIX1lUt3UtA/6Huv7rPcLAAAAxFtEV5mDBg2yTKNgo169em7u29WrV5c4eNFFvYLydA9ekFoyrW7qfTZq1Cgj3isAAABKX4mabzSv7xNPPOF+TpgwwU0A/tZbb7kL17Zt21q6KF++vLVo0SKvG2m0FLj88ssvVqNGjaRMkA4UJtPqpr7LmfA+AQAAkCKB9ezZs61379521FFH2Zw5c+y2225zgfWSJUvs8ccft5dfftnSiS7GK1asWOLgRd3I9e+5qIefUDcBAACA+In6inrUqFE2duxYmz59umsF8hx33HE2b968OBYNAAAAAIA0DKyXLl1qffv2LbBerdYbN26MV7kAAAAAAEjPwHr//fe3NWvWFFi/aNEiO+CAA+JVLgAAAAAA0jOwPuuss+zaa6+1tWvXugy7Gqv54Ycf2ogRI2zgwIGJKSUAAAAAAOkSWN9+++3WqlUra9iwoW3fvt3atGljxx57rB155JF2ww03JKaUAAAAAACkS1ZwJSx79NFHbfTo0fb555+74LpTp05uWioAAAAAADJNieaxFs1ZrQcAAAAAAJks6sA6JyfHnnzySZsxY4atX7/ejbEO9t5778WzfAAAAAAApFdgPWzYMBdYn3zyydauXTuXwAwAAAAAgEwVdWA9efJke/HFF+1Pf/pTYkoEAAAAAEA6ZwVX8rLmzZsnpjQAAAAAAKR7YH311VfbhAkTLBAIJKZEAAAAAACkW1fwfv36FUhQ9tZbb1nbtm2tXLly+Z6bMmVKfEsIAAAAAECqt1hXq1Yt36Nv377WrVs3q1mzZoHnAAAAAADpQTHfd999F/Hf79ixw4YMGWIHH3ywtWrVykaNGpXX2/mJJ56wjh075j207dBG3GD/+te/7I477nC/K4H2aaedFlXZb7/9dmvZsqWVKVPGpk6dGvFzZ5xxhn300Ufxb7HWDgAAAAAAoCgTJkxwUzR/9tlntmfPHjv11FPt5ZdfdsHq4MGD3cOjWabOPffcsNv5/fff7e6777alS5eWuCw9e/a0s846ywX60Tx3/fXX2xVXXGFz5sxJ3BjrVatW2YoVKwqs17po7mQAAAAAAPzl9ddft9atW1v79u1t5MiRUf/7L7/80k488UQ3LbOGDffq1cv+/e9/F/i7+fPn2/r1613gHY6C8aOOOsr2228/K6kuXbpYs2bNon5OrekbNmywr776KnHTbZ1//vkuqm/RokWBHfPYY4/ZrFmzot0kAAAAACDJFOiqRfn999+3Nm3a2COPPGK//PJL3vNXXXWVzZw5M+y/ffjhh+2www5zAbnXQv3HH3+4bta//vprgb9//PHH7bzzziuQs8ujuPLwww8P+9y2bdvsmGOOKbA+NzfX4qVr1642Y8YMd5MhIYH1okWL3J2DUEcccYQNHTo02s0BAAAAAHxg3rx5LjBWUC0XXHCBXX755XnP33PPPUX++9zcXBcT6u8UFCsHl1qGlfw62G+//WaTJ092r1eYH3/80U466aSwz1WpUsUWL15cYP3WrVvjlverbt26rgyRijqwVpO+7hCE2rJli+tLDwAAAABIfYr9gkXSYr3vvvvavffe65KCiZKPaTapYC+99JJb5wXw4VSqVMl27tyZtBZrvXY0QXrUgfWxxx5r48aNs+eff97Kli3r1img1rqjjz462s0BAAAAAHxA3Z/VFXzZsmUuo/ekSZNs9+7dUbVYb9u2zSpXruweys/10EMP2WuvvVagG7haw4uilvPly5cnrcVa46svvvjixCUv+8c//uGa8pWa3Mvqpt+VMW38+PHRbg4AAAAA4AO1atVywbSmV+7QoYNLUF2jRo2otrF69Wo75JBDXGv0n//8ZxeMKxmYR8GyguL+/fsXuZ3TTz/d3nnnHYvF2LFjrUGDBjZ37lz761//6n5XUrLinlNXdWUjV+bwSGUFvEnFovDzzz+7OcWWLFnimvp1N0F96bOzsy3VeHc11JW9atWqcd227tgoAUDt2rXzukIAfkDdhB9RL+FH1Ev4FXUTmVAvTz75ZLvppptcF/PSjO0mTpzoxlcr+E5YV3CpX7++m1AbAAAAAOBve3JybebyDfb9ph3WKLuS9WhZy/Yp6/8bMvfdd19UU17Fi24KXHfddVH9mxIF1kq/rsHp3377rRt4fsABB7i5yZo2bco4awAAAADwiRXrttnASQtszZadVibLLDdgVq9aRXt6SBdrUaeK+dmBBx7oHqXtoosuivrfRH2b4pVXXnETfqsL+Keffmq7du1y69XcTis2AAAAAPinpVpB9fqte2M2BdWiZa3X84iPqANr9TNXn/NHH30032TemttagTYAAAAAIPnU/Vst1TkhabW0rPWzlu9N1oUkBNbK4qYpt0JpkPivv/4ahyIBAAAAAGKlMdXq/h2O1q/etKO0i5S2og6s69ataytXriyw/oMPPrBmzZrFq1wAAAAAgBgoUZnX/TuU1jfOrlTaRUpbUQfWF154oQ0bNszmz59vWVlZbuqtZ5991kaMGGF/+9vfElNKAAAAAEBUlP1bicrKZuVvttay1ndvWStpZUs3UWcFHzVqlJuf7Pjjj7cdO3a4buEVKlRwgfXll1+emFICAAAAAKKiKbWU/Ts0K3jtqhXc+lSYcittA2u1Ul9//fV2zTXXuC7h27dvtzZt2ljlypUTU0IAAAAAQIloSq33R/Zwico0plrdv9VSTVAdXyWax1rKly/vAmoAAAAAgH8piO7Zpk6yi5HWIrpNcckll9iPP/4Y0QZfeOEFN+YaAAAAAIBMEFGLda1ataxt27Zuruo+ffrYoYceavXr17eKFSva5s2b7csvv3RZwSdPnuzWP/LII4kvOQAAAAAAqRJY33rrrTZ06FB77LHH7MEHH3SBdLAqVapYz549XUB90kknJaqsAAAAAACk7hjrOnXquKRleqiV+vvvv7fff//datasaQceeKBLagYAAAAAQKYpUfKy6tWruwcAAAAAAJmOHOsAAAAAAMSAwBoAAAAAgBgQWAMAAAAAEAMCawAAAAAAYkBgDQAAAACAHwLrr776ypo1axavzQEAAAAAkFmB9e7du2316tXx2hwAAAAAAOk1j/Xw4cOLfH7Dhg3xKA8AAAAAAOkZWE+YMME6duxoVatWDfv89u3b41kuAAAAAADSK7Bu3ry5XXXVVTZgwICwzy9evNg6d+4cz7IBAAAAAJA+Y6wPPfRQ++STTwp9PisrywKBQLzKBQAAAABAerVY33XXXbZr165Cn+/QoYPl5ubGq1wAAAAAAKRXYF23bt3ElgQAAAAAgEyebgsAAAAAgExEYA0AAAAAQAwIrAEAAAAAyOTAevny5W5+be+x77772tSpU5NdLAAAAABAhog4eZlftWzZ0s2hLdu3b7cmTZpYr169kl0sAAAAAECGKFGL9fPPP2+//fZbgd+T7fXXX7fjjz/e9ttvv2QXBQAAAACQIUoUWF988cW2bt26Ar+XxJw5c6xPnz5Wv359y8rKCtuN+4EHHnAt0RUrVrTDDz/cFixYEHZbL774ovXv37/EZQEAAAAAoFQC60AgEPb3klBrd4cOHVzwHM4LL7xgw4cPtxtvvNE+/fRT97cnnniirV+/Pt/fbd261T766CP705/+FFN5AAAAAABIqTHWvXv3do/C3H333XbhhRfa4MGD3fLEiRPtv//9r02aNMlGjRqV93evvfaanXDCCa5Vuyi7du1yj+CAXHJzc90jnrQ93XiI93aBWFE34UfUS/gR9RJ+Rd2EH+UmuV4m8/uQ9MC6KLt377ZPPvnErrvuurx1ZcqUsZ49e9rcuXMLdAO/6KKLit3muHHj7Oabby6wfsOGDbZz506L9we7ZcsWV7lUbsAvqJvwI+ol/Ih6Cb+ibsKPcpNcL7dt22bJ4uvAeuPGjZaTk2N16tTJt17Ly5Yty1vWh6dx16+88kqx21SQrq7lwS3WDRs2tFq1alnVqlXjXrE0blzb5oAHP6Fuwo+ol/Aj6iX8iroJP8pNcr0srvdyxgbWkapWrVrECdQqVKjgHqH0wSfiw1fFStS2gVhQN+FH1Ev4EfUSfkXdhB9lJbFeJvO74OtvYc2aNa1s2bIFgmYt161bN2nlAgAAAAAgJQLr8uXLW+fOnW3GjBn5uhdouWvXrkktGwAAAAAAJe4K/tZbb9kBBxxQ4PeS2L59u61cuTJvedWqVbZ48WLLzs62Ro0aufHQgwYNskMPPdS6dOli9957r5uiy8sSDgAAAABAygXWRx99dNjfS2LhwoXWo0ePvGUvsZiC6SeffNL69+/vMnaPGTPG1q5dax07drS33367QEIzAAAAAAAyMnlZ9+7dXTr2ogwdOtQ9AAAAAADwG1+PsQYAAAAAwO8IrAEAAAAAiAGBNQAAAAAAMSCwBgAAAACgtALrNWvW2DPPPGNvvvmm7d69O99zmgLrlltuiaUsAAAAAACkb2D98ccfW5s2beyyyy6z008/3dq2bWtffPFFvvmob7755kSVEwAAAEiYmjVr2nfffRfx3992221uGljvUbVq1bxpY+fOnZu3XtfMF198se3atavQbY0YMcImT57sfr/pppvsyiuvjLgcv/zyS75yHHTQQbbPPvvYpk2b3PNnnHGGffTRRxFvD0CCA+u///3v1rdvX9u8ebOtW7fOevXqZd26dbNFixaV8KUBAACA1HT99dfb4sWL3WP+/PlWrlw5O/fcc91zHTp0cI1Sem7p0qW2fv16e/DBB8Nu56effnK9Qfv371+ictSoUSOvHHpcdNFF1rt3b8vOzs4r56hRo2J4pwDiOo/1J598Yg888ICVKVPGqlSp4g4OjRo1suOPP97eeecd9zsAAACQCl5//XW79tprXUB80kknxbStqVOnWsOGDa1z585uuVKlSnnPafjk77//bllZWWH/7aRJk+wvf/lLoc9H6/HHH7dx48blLasVe8OGDfbVV19Z69at4/IaAGIIrGXnzp35lnX3S11NTjjhBHdQAAAAAPxOLciDBw+2999/3w11fOSRR1yXas9VV11lM2fODPtvH374YTv88MMLBLMXXHBBvnXqVv7nP//ZvvnmGzv55JPt0ksvDbu9WbNmudcLZ/ny5YW2ZCtgvuOOO/KtU5dv9S495ZRT8q3v2rWrzZgxg8Aa8ENg3a5dO/dlbd++fYExIbm5uXb22WcnonwAAABAXM2bN89d0yqoFgXFl19+ed7z99xzT8TbWr16tX3wwQd5Y6Q9TZo0sSVLlrg8RAMGDLApU6bYWWedVeDf//jjj1anTp2w227ZsqXr3h2Orr91gyA0wB84cKBr+ApWt25d9zoAfBBY60s6e/Zsu+SSSwo8N3LkSAsEAjZx4sR4lw8AAABIqNBu2NG0WD/xxBOuZdob0xyqcuXKLqB+9tlnwwbW6jYe2iu0JC3WCuBffPFFN7Y7lLZfrVq1sNsBUMqB9V//+lf3KIzGqOgBAAAA+Jm6Rqsr+LJly6xVq1ZuSGPwVLKRtlir1ViBtVqKg61cudIaN27sxm9ru6+++mqBXp8erVcAfcwxx8TUYv3CCy+4pGl6P6E0vlqZyQH4ZB5rAAAAINXVqlXLBdOa8UbB6IoVK1x27Wi9++67LrGvkvkGe++996xTp05u2/qprt6jR48Ouw1NY6tEwLEKN85bfvvtN5eZvGfPnjG/BoDCZQXUhzsKGmd95JFHWrrYunWr6xqzZcsWN/9gPHl3EmvXru0OuoBfUDfhR9RL+BH1EqVRx7p06eIyizdo0CDudVNDNTW+euzYsXEqMeDfY+bWBMZ2xYnq3WqOPd3ZAwAAAPxkT06uTf9ynT3+wSr3U8upQMGHxm0ri3iitn/dddclZNsASjDG+plnnnHTBCijIQAAAOAXK9Zts4GTFtiaLTutTJZZbsCsXrWK9vSQLtaiTpVkF69Y3vzXiXDRRRclbNsAomyxvvfee13iMgXXjM8AAACAX6hlWkH1+q273LKCatGy1qdKyzUyWM4es2Vvms19cO9PLSM9W6yHDx9u9913n5166qmJLxEAAAAQoZnLN7iW6lA5gYBbP2v5BuvZJvw80UDSrV9m9kw/s60/mWWVMQvkmlU9wGzAFLPaBTO8I8VbrI866ih78MEH7Zdffkl8iQAAAIAIfb9ph+v+HY7Wr960o7SLBERGLdMKqret3busoFq0rPW0XKdfYD19+nRr2rSp9erVy2VaAwAAAPygUXalvO7fobS+cXal0i4SEJkV0/a2VAdy8q/XstavnJ6skiFRgXXFihXt9ddftzZt2thJJ51UktcBAAAA4q5Hy1ouUVnZrPzN1lrW+u4tayWtbECRNn+3t/t3OFq/aVVplwilMd1W2bJlXfIyzbMHAAAA+ME+Zcu47N+1q1Zwy163cC1rvZ4HfKl6k//v/h1K67OblnaJUBrTbQVnCAcAAAD8QlNqvT+yh0tUpjHV6v6tlmqCavhaixP2JirTmOrg7uBZZc2q1DVr3iuZpUOiA2sAAADAbxREk/0bKaXsPnuzf4dmBVdQrfV6Hikj6k+rSZMmNmTIEDv//POtUaNGiSkVAAAAAKQ7Tak17LO9ico0plrdv9VSTVCdcqLuH3PllVfalClTrFmzZi5L+OTJk23Xrl2JKR0AAAAApDMF0S17m3W9dO9PgurMCawXL15sCxYssNatW9vll19u9erVs6FDh9qnn36amFICAAAAAOBTJc7ocMghh9h9991nP//8s91444322GOP2WGHHWYdO3a0SZMmWSBQyISCAAAAAACkkRL3M/jjjz/s1VdftSeeeMKmT59uRxxxhF1wwQX2448/2t///nd799137bnnnotvaQEAAAAASPXAWt29FUw///zzVqZMGRs4cKDdc8891qpVq7y/6du3r2u9BgAAAAAg3UUdWCtgVtKyhx56yE477TQrV65cgb9p2rSpnXXWWfEqIwAAAAAA6RNYf/vtt9a4ceMi/2a//fZzrdoAAAAAAKS7qJOXFRdUAwAAAACQSUqcFRwAAAAAABBYAwAAAAAQEwJrAAAAAABiQGANAAAAAECis4IPHz484g3efffdsZQHAAAAAID0C6wXLVqU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6dPHRo0aFe/yAQAAAACQfi3Wr776qh122GH25Zdf2n//+19r166dbd261WUGBwAAAAAgk0QdWB955JEugFYwfcghh1jfvn3dNFyzZs2yxo0bJ6aUAAAAAACkS2AtX3/9tS1cuNAaNGhg++yzjy1fvtx27NgR/9IBAAAAAJBugfUdd9xhXbt2tV69etnnn39uCxYssEWLFln79u1t7ty5iSklAAAAAADpElhPmDDBpk6davfff79VrFjRdQlXcN2vXz/r3r17YkoJAAAAAECqz2PtWbp0qdWsWTPfunLlytn48ePtlFNOsVQTCATcTyVfi7fc3Fzbtm2buwFRpkyJet0DCUHdhB9RL+FH1Ev4FXUTfpSb5HrpxXRejFeasgLJeFUf+fHHH61hw4bJLgYAAAAAIA5++OEHlw+sNGV8YK27Kj///LNVqVLFsrKy4n7HREG7PtiqVavGddtALKib8CPqJfyIegm/om7Cj7YmuV4qtFWLef369Uu9xTzqruDpRjs80XczVKk44MGPqJvwI+ol/Ih6Cb+ibsKPqiaxXlarVi0pr8uADAAAAAAAYkBgDQAAAABADAisE6hChQp24403up+An1A34UfUS/gR9RJ+Rd2EH1XI4HqZ8cnLAAAAAACIBS3WAAAAAADEgMAaAAAAAIAYEFgDAAAAABADAusEeuCBB6xJkyZWsWJFO/zww23BggXJLhIyyLhx4+ywww6zKlWqWO3ate20006z5cuX5/ubnTt32mWXXWY1atSwypUr21/+8hdbt25d0sqMzHPHHXdYVlaWXXnllXnrqJdIhp9++skGDBjg6t2+++5rBx98sC1cuDDveaWkGTNmjNWrV88937NnT1uxYkVSy4z0l5OTY6NHj7amTZu6enfggQfarbfe6uqjh7qJRJszZ4716dPH6tev787ZU6dOzfd8JHVw06ZNdu6557q5rffff3+74IILbPv27ZZOCKwT5IUXXrDhw4e7rHiffvqpdejQwU488URbv359souGDDF79mwXnMybN8+mT59uf/zxh51wwgn222+/5f3NVVddZW+88Ya99NJL7u9//vln69evX1LLjczx8ccf28MPP2zt27fPt556idK2efNmO+qoo6xcuXL21ltv2Zdffml33XWXVa9ePe9v7rzzTrvvvvts4sSJNn/+fNtvv/3ceV03goBE+cc//mEPPfSQ/etf/7KvvvrKLasu3n///Xl/Q91EounaUbGMGg3DiaQOnnvuufbFF1+4a9L//Oc/Lli/6KKLLK0oKzjir0uXLoHLLrssbzknJydQv379wLhx45JaLmSu9evX6/Z2YPbs2W75119/DZQrVy7w0ksv5f3NV1995f5m7ty5SSwpMsG2bdsCLVq0CEyfPj3QrVu3wLBhw9x66iWS4dprrw0cffTRhT6fm5sbqFu3bmD8+PF561RXK1SoEHj++edLqZTIRCeffHJgyJAh+db169cvcO6557rfqZsobTofv/rqq3nLkdTBL7/80v27jz/+OO9v3nrrrUBWVlbgp59+CqQLWqwTYPfu3fbJJ5+4bhCeMmXKuOW5c+cmtWzIXFu2bHE/s7Oz3U/VUbViB9fTVq1aWaNGjainSDj1pjj55JPz1T+hXiIZXn/9dTv00EPtjDPOcENnOnXqZI8++mje86tWrbK1a9fmq5fVqlVzw7yol0ikI4880mbMmGFff/21W16yZIl98MEH1rt3b7dM3USyRVIH586d67p/6zjr0d8rPlILd7rYJ9kFSEcbN250Y2Lq1KmTb72Wly1blrRyIXPl5ua6Mazq6tiuXTu3TgfB8uXLuwNdaD3Vc0CiTJ482Q2RUVfwUNRLJMO3337ruttqCNff//53VzevuOIKVxcHDRqUV/fCndepl0ikUaNG2datW90NxrJly7rry9tuu811qxXqJpItkjq4du1ad9My2D777OMae9KpnhJYAxnSOvj555+7u9xAMv3www82bNgwN8ZKiR0Bv9x8VEvK7bff7pbVYq1jpsYLKrAGkuXFF1+0Z5991p577jlr27atLV682N0oVxIp6ibgL3QFT4CaNWu6u4qhWWy1XLdu3aSVC5lp6NChLknEzJkzrUGDBnnrVRc1bOHXX3/N9/fUUySSunorieMhhxzi7lbroQRlSnqi33WHm3qJ0qZMtm3atMm3rnXr1vb999+73726x3kdpe2aa65xrdZnnXWWy1R/3nnnuQSPmvlDqJtItkjqYN26dQskcN6zZ4/LFJ5O9ZTAOgHUdaxz585uTEzw3XAtd+3aNallQ+ZQfgkF1a+++qq99957bqqOYKqjyoAbXE81HZcuJKmnSJTjjz/eli5d6lpdvIdaCtWt0fudeonSpmEyodMRakxr48aN3e86furiL7heqnuuxgZSL5FIO3bscONQg6nxRteVQt1EskVSB7t27epumOvmukfXpqrHGoudLugKniAap6UuOrpI7NKli917770uVf3gwYOTXTRkUPdvdR177bXX3FzW3hgWJZTQHIP6qTkEVVc1xkXzCl5++eXu4HfEEUcku/hIU6qL3jh/j6bl0NzB3nrqJUqbWgCVJEpdwc8880xbsGCBPfLII+4h3lzrY8eOtRYtWrgLSc0trO64p512WrKLjzSmuYM1ploJHNUVfNGiRXb33XfbkCFD3PPUTZQGzTe9cuXKfAnLdDNc52nVzeLqYOvWre2kk06yCy+80A2xUZJSNf6oJ4b+Lm0kOy15Orv//vsDjRo1CpQvX95NvzVv3rxkFwkZRF/vcI8nnngi729+//33wKWXXhqoXr16oFKlSoG+ffsG1qxZk9RyI/MET7cl1EskwxtvvBFo166dmyKmVatWgUceeSTf85pSZvTo0YE6deq4vzn++OMDy5cvT1p5kRm2bt3qjo+6nqxYsWKgWbNmgeuvvz6wa9euvL+hbiLRZs6cGfaactCgQRHXwV9++SVw9tlnBypXrhyoWrVqYPDgwW7qzXSSpf8lO7gHAAAAACBVMcYaAAAAAIAYEFgDAAAAABADAmsAAAAAAGJAYA0AAAAAQAwIrAEAAAAAiAGBNQAAAAAAMSCwBgAAAAAgBgTWAAAAAADEgMAaAIAM0717d7vyyiuTXQwAANIGgTUAAAAAADEgsAYAAAAAIAYE1gAApLHffvvNBg4caJUrV7Z69erZXXfdlewiAQCQdgisAQBIY9dcc43Nnj3bXnvtNZs2bZrNmjXLPv3002QXCwCAtLJPsgsAAAASY/v27fb444/bM888Y8cff7xb99RTT1mDBg2SXTQAANIKLdYAAKSpb775xnbv3m2HH3543rrs7Gxr2bJlUssFAEC6IbAGAAAAACAGBNYAAKSpAw880MqVK2fz58/PW7d582b7+uuvk1ouAADSDWOsAQBIU8oEfsEFF7gEZjVq1LDatWvb9ddfb2XKcF8dAIB4IrAGACCNjR8/3iUx69Onj1WpUsWuvvpq27JlS7KLBQBAWskKBAKBZBcCAAAAAIBURV8wAAAAAABiQGANAAAAAEAMCKwBAAAAAIgBgTUAAAAAADEgsAYAAAAAIAYE1gAAAAAAxIDAGgAAAACAGBBYAwAAAAAQAwJrAAAAAABiQGANAAAAAEAMCKwBAAAAAIgBgTUAAAAAAFZy/wdbl1C/C4ywoQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rang d l x1\n", + " 1 61 11 1766319049\n", + " 2 97 11 62809633\n", + " 3 73 7 2281249\n", + " 4 94 16 2143295\n", + " 5 89 5 500001\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "donnees = []\n", + "for d in range(2, 101):\n", + " if est_carre(d):\n", + " continue\n", + " l = len(periode_sqrt(d))\n", + " x1, _ = pell_minimale(d, 1)\n", + " donnees.append((d, l, x1, l % 2 == 1))\n", + "\n", + "fig, ax = plt.subplots(figsize=(10, 5))\n", + "for soluble in (True, False):\n", + " sous = [t for t in donnees if t[3] == soluble]\n", + " ax.scatter([t[0] for t in sous], [t[2] for t in sous],\n", + " s=22, label=\"periode impaire (Pell -1 soluble)\" if soluble\n", + " else \"periode paire (Pell -1 insoluble)\")\n", + "ax.set_yscale(\"log\")\n", + "ax.set_xlabel(\"d\")\n", + "ax.set_ylabel(\"x1 — plus petite solution de x^2 - d y^2 = 1 (echelle log)\")\n", + "ax.set_title(\"L'unite fondamentale de Z[sqrt(d)] : taille erratique, echelle logarithmique\")\n", + "ax.grid(True, alpha=0.3)\n", + "ax.legend(loc=\"upper left\", fontsize=9)\n", + "for d, l, x1, _ in sorted(donnees, key=lambda t: -t[2])[:3]:\n", + " ax.annotate(f\"d={d} (l={l})\", xy=(d, x1), xytext=(6, 4),\n", + " textcoords=\"offset points\", fontsize=8)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "top = sorted(donnees, key=lambda t: -t[2])[:5]\n", + "print(f\"{'rang':>4} {'d':>4} {'l':>3} {'x1':>14}\")\n", + "for rang, (d, l, x1, _) in enumerate(top, 1):\n", + " print(f\"{rang:>4} {d:>4} {l:>3} {x1:>14}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-20", + "metadata": { + "papermill": { + "duration": 0.003314, + "end_time": "2026-10-25T08:00:16.376631+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.373317+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Lecture du résultat\n", + "\n", + "La figure est un nuage, non une courbe : à $d$ voisin, $x_1$ varie de plusieurs ordres de grandeur. Mais l'ordonnée est logarithmique, et c'est là que la structure apparaît — les trois records de la plage sont $d = 61$ ($x_1 = 1\\,766\\,319\\,049$, période $11$), $d = 97$ ($62\\,809\\,633$, période $11$) et $d = 73$ ($2\\,281\\,249$, période $7$). Ce ne sont pas les plus grands $d$ : ce sont ceux dont la période est la plus longue.\n", + "\n", + "C'est la raison d'être de tout l'appareil des sections 2 et 3. La taille de la solution minimale croît **exponentiellement en la longueur de la période**, elle-même de taille typiquement $\\sqrt{d}$ mais sujette à des fluctuations considérables. Un algorithme qui cherche la solution directement est condamné ; un algorithme qui calcule la période la trouve en temps polynomial en $\\log d$.\n", + "\n", + "Le fait que les deux couleurs se répartissent indistinctement sur l'axe vertical est la marque que solubilité de $-1$ et taille de l'unité sont deux questions **indépendantes** : la parité décide de l'existence, la longueur décide de la taille." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-21", + "metadata": { + "papermill": { + "duration": 0.005111, + "end_time": "2026-10-25T08:00:16.385138+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.380027+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## 7. Exemples guidés résolus et exercices\n", + "\n", + "Les trois exemples guidés sont **résolus** ; chacun est suivi d'un exercice construit sur le **même instrument**, mais sur des paramètres différents — la convention de la série." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-22", + "metadata": { + "papermill": { + "duration": 0.003886, + "end_time": "2026-10-25T08:00:16.394004+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.390118+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exemple guidé 1 — $d = 61$, la reine des petits $d$\n", + "\n", + "Fermat posa en 1657 à Wallis et Brouncker le défi de résoudre $x^2 - 61\\,y^2 = 1$ ; il fallut attendre Brouncker pour en voir la solution. Le parcours complet, tel que les sections précédentes l'ont construit :\n", + "\n", + "1. calculer la période de $\\sqrt{61}$, de longueur $\\ell = 11$ ;\n", + "2. lire la solution de $-1$ au convergent $\\ell - 1 = 10$ ;\n", + "3. en déduire la solution de $+1$ par élévation au carré ;\n", + "4. vérifier les deux normes, et la cohérence avec le convergent $2\\ell - 1 = 21$." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-27-23", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:16.403697Z", + "iopub.status.busy": "2026-10-25T08:00:16.403232Z", + "iopub.status.idle": "2026-10-25T08:00:16.409233Z", + "shell.execute_reply": "2026-10-25T08:00:16.408563Z" + }, + "papermill": { + "duration": 0.011996, + "end_time": "2026-10-25T08:00:16.410034+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.398038+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1. periode : [1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14] (l = 11, impaire)\n", + "2. solution de -1 : x = 29718, y = 3805 (verif : -1)\n", + "3. carre de la solution -1 : x = 1766319049, y = 226153980\n", + "4. convergent 2l-1 = 21 : (1766319049, 226153980)\n", + " egal a la solution minimale : True\n", + " norme de la solution : 1\n" + ] + } + ], + "source": [ + "d = 61\n", + "per = periode_sqrt(d)\n", + "l = len(per)\n", + "print(f\"1. periode : {per} (l = {l}, {'impaire' if l % 2 else 'paire'})\")\n", + "\n", + "neg = pell_minimale(d, -1)\n", + "print(f\"2. solution de -1 : x = {neg[0]}, y = {neg[1]}\"\n", + " f\" (verif : {neg[0]**2 - d * neg[1]**2})\")\n", + "\n", + "carre = composer(neg, neg, d)\n", + "pos = pell_minimale(d, 1)\n", + "print(f\"3. carre de la solution -1 : x = {carre[0]}, y = {carre[1]}\")\n", + "\n", + "convergent = convergents_sqrt(d, 2 * l - 1)[2 * l - 1]\n", + "print(f\"4. convergent 2l-1 = 21 : ({convergent[0]}, {convergent[1]})\")\n", + "print(f\" egal a la solution minimale : {carre == pos == convergent}\")\n", + "print(f\" norme de la solution : {pos[0]**2 - d * pos[1]**2}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-24", + "metadata": { + "papermill": { + "duration": 0.003138, + "end_time": "2026-10-25T08:00:16.416559+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.413421+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 1 — $d = 109$, l'autre défi de Fermat\n", + "\n", + "Fermat posa le même défi avec $d = 109$ et $d = 181$ ; ces deux cas sont **considérablement plus durs** que $d = 61$, ce qui explique qu'il les ait posés. La solution de $d = 109$ a quinze chiffres.\n", + "\n", + "Complétez la fonction pour qu'elle rende le parcours complet : période, solution de $-1$ ou son absence, solution de $+1$, vérification." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-27-25", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:16.423673Z", + "iopub.status.busy": "2026-10-25T08:00:16.423405Z", + "iopub.status.idle": "2026-10-25T08:00:16.427851Z", + "shell.execute_reply": "2026-10-25T08:00:16.427131Z" + }, + "papermill": { + "duration": 0.009252, + "end_time": "2026-10-25T08:00:16.428861+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.419609+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice 1 a completer.\n" + ] + } + ], + "source": [ + "def exo1_parcours(d):\n", + " \"\"\"Parcours complet de Pell pour un d donne.\n", + "\n", + " Doit renvoyer un dictionnaire {periode, l, neg, pos, verif}.\n", + " \"\"\"\n", + " # Etape 1 : calculer la periode et sa longueur.\n", + " # Etape 2 : chercher la solution de cible -1 (elle peut ne pas exister).\n", + " # Etape 3 : chercher la solution de cible +1.\n", + " # Etape 4 : verifier x^2 - d y^2 = 1.\n", + " # Indice : les fonctions periode_sqrt, pell_minimale et composer sont deja definies.\n", + " resultat = None # TODO etudiant\n", + " return resultat\n", + "\n", + "\n", + "print(\"Exercice 1 a completer.\")\n", + "res = exo1_parcours(109)\n", + "if res is not None:\n", + " print(res)\n", + " assert res[\"verif\"] is True\n", + " assert res[\"l\"] == 15\n", + " assert res[\"pos\"][0] == 158070671986249\n", + " print(\"Attendu : l = 15, x1 = 158070671986249 (15 chiffres), Pell -1 insoluble.\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-26", + "metadata": { + "papermill": { + "duration": 0.003304, + "end_time": "2026-10-25T08:00:16.435662+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.432358+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exemple guidé 2 — $\\sqrt{23}$ : palindrome, période paire, prédiction d'insolubilité\n", + "\n", + "Le théorème de la section 4 permet de **prédire** sans calculer : si la période de $\\sqrt{23}$ est paire, l'équation $x^2 - 23\\,y^2 = -1$ est insoluble. Vérifions les deux volets — le palindrome, puis la prédiction." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-27-27", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:16.443266Z", + "iopub.status.busy": "2026-10-25T08:00:16.442749Z", + "iopub.status.idle": "2026-10-25T08:00:16.447851Z", + "shell.execute_reply": "2026-10-25T08:00:16.447225Z" + }, + "papermill": { + "duration": 0.010163, + "end_time": "2026-10-25T08:00:16.449039+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.438876+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "periode de sqrt(23) : [1, 3, 1, 8]\n", + " sans le 2a0 final : [1, 3, 1]\n", + " palindrome : True\n", + " longueur 4 -> Pell -1 INSOLUBLE (prediction)\n", + " mesure : aucune solution\n", + " solution minimale de +1 : (24, 5) = convergent 3 : True\n" + ] + } + ], + "source": [ + "d = 23\n", + "per = periode_sqrt(d)\n", + "coeur = per[:-1]\n", + "print(f\"periode de sqrt(23) : {per}\")\n", + "print(f\" sans le 2a0 final : {coeur}\")\n", + "print(f\" palindrome : {coeur == coeur[::-1]}\")\n", + "print(f\" longueur {len(per)} -> Pell -1 {'soluble' if len(per) % 2 else 'INSOLUBLE (prediction)'}\")\n", + "mesure = pell_minimale(d, -1)\n", + "print(f\" mesure : {mesure if mesure else 'aucune solution'}\")\n", + "\n", + "l = len(per)\n", + "pos = pell_minimale(d, 1)\n", + "# l pair : la solution minimale est p_{l-1} ; l impair : p_{2l-1}\n", + "indice = l - 1 if l % 2 == 0 else 2 * l - 1\n", + "convergent = convergents_sqrt(d, indice)[indice]\n", + "print(f\" solution minimale de +1 : ({pos[0]}, {pos[1]})\"\n", + " f\" = convergent {indice} : {pos == convergent}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-28", + "metadata": { + "papermill": { + "duration": 0.003384, + "end_time": "2026-10-25T08:00:16.456291+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.452907+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 2 — composer les solutions de $d = 2$ par Brahmagupta\n", + "\n", + "Toutes les solutions de $x^2 - 2y^2 = 1$ sont les puissances de $3 + 2\\sqrt{2}$. Écrivez la fonction qui les énumère par composition successive, et vérifiez la norme à chaque étape." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-27-29", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:16.464150Z", + "iopub.status.busy": "2026-10-25T08:00:16.463828Z", + "iopub.status.idle": "2026-10-25T08:00:16.467932Z", + "shell.execute_reply": "2026-10-25T08:00:16.467459Z" + }, + "papermill": { + "duration": 0.009517, + "end_time": "2026-10-25T08:00:16.469152+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.459635+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice 2 a completer.\n" + ] + } + ], + "source": [ + "def exo2_puissances(nmax):\n", + " \"\"\"Liste des n premieres puissances de (3 + 2 sqrt2), verifiees.\n", + "\n", + " Doit renvoyer une liste de triplets (n, x, y), norme verifiee = 1.\n", + " \"\"\"\n", + " # Etape 1 : partir de l'unite fondamentale (3, 2).\n", + " # Etape 2 : a chaque tour, composer avec (3, 2) via composer(u, (3, 2), 2).\n", + " # Etape 3 : verifier x^2 - 2 y^2 == 1, sinon lever une exception.\n", + " # Indice : la fonction composer(u, v, d) est deja definie.\n", + " liste = None # TODO etudiant\n", + " return liste\n", + "\n", + "\n", + "print(\"Exercice 2 a completer.\")\n", + "res = exo2_puissances(4)\n", + "if res is not None:\n", + " print(res)\n", + " assert res[1][1:] == (17, 12)\n", + " assert res[3][1:] == (577, 408)\n", + " print(\"Attendu : n=2 -> (17, 12), n=4 -> (577, 408).\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-30", + "metadata": { + "papermill": { + "duration": 0.005002, + "end_time": "2026-10-25T08:00:16.480529+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.475527+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exemple guidé 3 — la table des records pour $d \\leq 100$\n", + "\n", + "Quels $d$ donnent les plus grandes unités fondamentales ? Le tri par $x_1$ décroissant répond, et la colonne $\\ell$ explique." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-27-31", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:16.488801Z", + "iopub.status.busy": "2026-10-25T08:00:16.488399Z", + "iopub.status.idle": "2026-10-25T08:00:16.494667Z", + "shell.execute_reply": "2026-10-25T08:00:16.494163Z" + }, + "papermill": { + "duration": 0.011676, + "end_time": "2026-10-25T08:00:16.495604+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.483928+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rang d x1 l parite\n", + " 1 61 1766319049 11 impaire\n", + " 2 97 62809633 11 impaire\n", + " 3 73 2281249 7 impaire\n", + " 4 94 2143295 16 paire\n", + " 5 89 500001 5 impaire\n", + " 6 85 285769 5 impaire\n", + "\n", + "longueur de periode maximale sur d <= 100 : 16 (atteinte pour [94])\n" + ] + } + ], + "source": [ + "donnees = []\n", + "for d in range(2, 101):\n", + " if est_carre(d):\n", + " continue\n", + " l = len(periode_sqrt(d))\n", + " x1, y1 = pell_minimale(d, 1)\n", + " donnees.append((x1, d, l, \"impaire\" if l % 2 else \"paire\"))\n", + "\n", + "donnees.sort(reverse=True)\n", + "print(f\"{'rang':>4} {'d':>4} {'x1':>14} {'l':>3} {'parite':>8}\")\n", + "for rang, (x1, d, l, parite) in enumerate(donnees[:6], 1):\n", + " print(f\"{rang:>4} {d:>4} {x1:>14} {l:>3} {parite:>8}\")\n", + "print()\n", + "print(f\"longueur de periode maximale sur d <= 100 : {max(t[2] for t in donnees)}\"\n", + " f\" (atteinte pour {[t[1] for t in donnees if t[2] == max(u[2] for u in donnees)]})\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-32", + "metadata": { + "papermill": { + "duration": 0.006972, + "end_time": "2026-10-25T08:00:16.506012+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.499040+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Exercice 3 — le critère de Legendre au-delà de 500, et le plus petit contre-exemple composé\n", + "\n", + "Deux volets, sur l'instrument de la section 5 :\n", + "\n", + "1. étendre la mesure du critère de Legendre aux premiers jusqu'à $2000$ et vérifier qu'il reste exact ;\n", + "2. trouver le **plus petit** entier composé $d$ dont tous les facteurs premiers valent $1 \\pmod 4$ (ou valent $2$) et pour lequel la Pell négative est **insoluble**." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-27-33", + "metadata": { + "execution": { + "iopub.execute_input": "2026-10-25T08:00:16.514784Z", + "iopub.status.busy": "2026-10-25T08:00:16.514343Z", + "iopub.status.idle": "2026-10-25T08:00:16.519076Z", + "shell.execute_reply": "2026-10-25T08:00:16.518530Z" + }, + "papermill": { + "duration": 0.010863, + "end_time": "2026-10-25T08:00:16.520458+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.509595+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exercice 3 a completer.\n" + ] + } + ], + "source": [ + "def exo3_critere_legendre(limite):\n", + " \"\"\"Verifie le critere de Legendre sur les premiers < limite.\n", + "\n", + " Doit renvoyer (nb_premiers_testes, liste_des_ecarts).\n", + " \"\"\"\n", + " # Etape 1 : enumerer les premiers < limite.\n", + " # Etape 2 : pour chacun, comparer (p % 4 == 1) a (pell_minimale(p, -1) is not None).\n", + " # Etape 3 : collecter les desaccords.\n", + " # Indice : est_premier et pell_minimale sont deja definies.\n", + " resultat = None # TODO etudiant\n", + " return resultat\n", + "\n", + "\n", + "def exo3_plus_petit_compose(limite):\n", + " \"\"\"Plus petit compose dont tous les facteurs premiers valent 1 mod 4 (ou 2)\n", + " et dont la Pell negative est insoluble.\"\"\"\n", + " # Etape 1 : enumerer les composes d croissants (d non carre).\n", + " # Etape 2 : retenir ceux dont chaque facteur premier p verifie p == 1 mod 4 ou p == 2.\n", + " # Etape 3 : tester pell_minimale(d, -1) ; rendre le premier insoluble.\n", + " # Indice : facteurs_premiers(d) est deja definie.\n", + " trouve = None # TODO etudiant\n", + " return trouve\n", + "\n", + "\n", + "print(\"Exercice 3 a completer.\")\n", + "crit = exo3_critere_legendre(2000)\n", + "if crit is not None:\n", + " print(f\"Legendre < 2000 : {crit[0]} premiers, ecarts = {crit[1]}\")\n", + " assert crit[1] == []\n", + "compose = exo3_plus_petit_compose(200)\n", + "if compose is not None:\n", + " print(f\"plus petit compose contre-exemple : d = {compose}\")\n", + " assert compose == 34" + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-34", + "metadata": { + "papermill": { + "duration": 0.006474, + "end_time": "2026-10-25T08:00:16.533655+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.527181+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## Conclusion\n", + "\n", + "L'équation $x^2 - d\\,y^2 = 1$ est le plus ancien problème d'arithmétique encore productif, et ce carnet en a mesuré toute la chaîne causale :\n", + "\n", + "- **l'obstruction** est triviale — $d$ carré — et la solubilité, une fois l'obstruction levée, est **universelle** (Lagrange) ;\n", + "- **la taille** de la solution minimale, elle, est erratique : elle suit la longueur de la période de $\\sqrt{d}$, et croît exponentiellement en elle ($d = 61$ : dix chiffres ; $d = 181$ : dix-neuf) ;\n", + "- **la fraction continue** fournit l'algorithme : le calcul se fait en temps polynomial en $\\log d$, alors que la solution a une taille exponentielle ;\n", + "- **la parité de la période** décide de la solubilité de la Pell négative, avec une exactitude mesurée de $186/186$ sur $d \\leq 200$ ;\n", + "- **le critère local** de Legendre est exact pour les premiers ($44/44$ et $0/50$ sous $500$ ; l'exercice 3 étend la mesure à $2000$) et cesse de suffire pour les composés ($d = 34$ en est le plus petit témoin) ;\n", + "- **la structure** est celle d'un groupe cyclique infini — Brahmagupta compose, les puissances épuisent, et le théorème de Dirichlet en donne le rang $1$.\n", + "\n", + "Le pont avec les carnets [11](11-corps-quadratiques-reciprocite-quadratique.ipynb) et [15](15-quatre-carres-lagrange.ipynb) s'éclaire : les corps imaginaires ont des unités finies et un nombre de classes qui varie ; les corps réels ont des unités infinies et un nombre de classes qui, lui aussi, varie — mais l'unité fondamentale donne à leur arithmétique un invariant supplémentaire, le **régulateur** $\\log$ de cette unité, dont la figure de la section 6 dessine l'ordre de grandeur." + ] + }, + { + "cell_type": "markdown", + "id": "cell-27-35", + "metadata": { + "papermill": { + "duration": 0.006471, + "end_time": "2026-10-25T08:00:16.544710+00:00", + "exception": false, + "start_time": "2026-10-25T08:00:16.538239+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "## Ressources\n", + "\n", + "**Sources primaires**\n", + "\n", + "- Fermat, lettre à Wallis, février 1657 — l'énoncé du défi, avec les cas $d = 61, 109, 181$.\n", + "- Lagrange, *Solution d'un problème d'arithmétique* (1766-1770) — la preuve que l'équation a toujours une solution pour $d$ non carré.\n", + "- Bhāskara II, *Bījagaṇita*, XIIe siècle — la méthode **chakravala**, algorithme cyclique de résolution, six siècles avant Lagrange.\n", + "- H. W. Lenstra Jr., « Solving the Pell Equation », *Notices of the AMS* **49** (2002) — mise au point moderne, complexité, et histoire du problème des bœufs d'Archimède.\n", + "\n", + "**Dans la série**\n", + "\n", + "- Carnet [11](11-corps-quadratiques-reciprocite-quadratique.ipynb) — corps quadratiques imaginaires, réciprocité quadratique, le contraste fini/infini des groupes d'unités.\n", + "- Carnet [13](13-jacobi-kronecker-reciprocite-II.ipynb) — symbole de Kronecker, dont dépend le critère local de la section 5.\n", + "- Carnet [15](15-quatre-carres-lagrange.ipynb) — identité de Brahmagupta-Fibonacci, dont la loi de composition de la section 6 est l'application.\n", + "- Carnet [12](12-formes-quadratiques-binaires-nombre-classes.ipynb) et [14](14-formes-quadratiques-composition-gauss.ipynb) — la composition des formes, pendant du groupe de classes que le régulateur accompagne.\n", + "\n", + "**Références en ligne**\n", + "\n", + "- OEIS [A033313](https://oeis.org/A033313) — plus petites valeurs de $x$ pour $x^2 - ny^2 = 1$ ; OEIS [A033317](https://oeis.org/A033317) pour les $y$ correspondants.\n", + "- OEIS [A003285](https://oeis.org/A003285) — longueurs des périodes des fractions continues de $\\sqrt{n}$, la suite même dont la section 6 montre le rôle." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.3" + }, + "papermill": { + "default_parameters": {}, + "duration": 3.516054, + "end_time": "2026-10-25T08:00:16.898071+00:00", + "environment_variables": {}, + "exception": null, + "input_path": "27-pell-fermat.ipynb", + "output_path": "27-pell-fermat.ipynb", + "parameters": {}, + "start_time": "2026-10-25T08:00:13.382017+00:00", + "version": "2.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/README.md b/MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/README.md index c2036ebc80d..fd69e150ba3 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/README.md +++ b/MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/README.md @@ -32,6 +32,7 @@ Le geste « distillation » : prendre un énoncé ou une construction centrale d | 21 | [21-operateurs-hecke-formes-modulaires.ipynb](21-operateurs-hecke-formes-modulaires.ipynb) | Opérateurs de Hecke calculés en arithmétique exacte — E₄/E₆ par séries de diviseurs, Δ par deux routes indépendantes `(E₄³−E₆²)/1728` et `q∏(1−qⁿ)²⁴`, `T_p(E_k) = (1+p^{k−1})E_k` et `T_p(Δ) = τ(p)Δ`, algèbre de Hecke sur S₂₄ en matrices entières (`[T_p,T_q]=0`, `T_pq = T_pT_q`, `T_{p²} = T_p² − p²³`), borne de Deligne mesurée sur 139 premiers, angles de Sato–Tate confrontés à l'uniforme | Python stdlib + matplotlib | | 22 | [22-vecteurs-witt-frobenius.ipynb](22-vecteurs-witt-frobenius.ipynb) | Vecteurs de Witt (Serre, *Corps locaux* ch. II ; ouverture d'Illusie vers le complexe de de Rham–Witt) — échec du relèvement naïf mesuré sur deux contre-exemples et un contrôle positif, composantes fantômes, inversion triangulaire à division **exacte et vérifiée**, axiomes testés exhaustivement sur $W_2(\\mathbb{F}_3)$, $W_3(\\mathbb{F}_2)$, $W_4(\\mathbb{F}_2)$, Frobenius / Verschiebung / élévation de Teichmüller, $W_n(\\mathbb{F}_p) \\cong \\mathbb{Z}/p^n$ établi par contrôle croisé de deux constructions indépendantes | Python stdlib | | 25 | [25-groupe-galois-calcule.ipynb](25-groupe-galois-calcule.ipynb) | Le groupe de Galois calculé (*Topics in Galois Theory*, leçon 1) — types de décomposition (Dedekind, prolonge 17), discriminant exact (Sylvester/Bareiss) et $G \subseteq A_n$, étau de sous-groupes transitifs : neuf groupes identifiés ($C_3$ à $S_5$), leçon mesurée de la transitivité ($V_4$ contre un pseudo-$C_2$), résolvante cubique concordante, série dérivée calculée (Abel-Ruffini exécuté, $A_5$ parfait), Cardano vérifié contre Durand-Kerner, pont Lean-22/$M_{23}$ | Python stdlib + matplotlib | +| 27 | [27-pell-fermat.ipynb](27-pell-fermat.ipynb) | Équation de Pell-Fermat $x^2 - dy^2 = 1$ — fraction continue de √d (algorithme de Lagrange, palindrome de Galois), théorème d'indice sur les convergents, période impaire ⇔ Pell négative soluble (186/186 mesuré sur d ≤ 200), critère de Legendre exact pour les premiers (44/44 et 0/50 sous 500) et mis en défaut par les composés (d = 34), unité fondamentale de Z[√d] par composition de Brahmagupta — le groupe cyclique infini de Dirichlet rang 1, contraste avec les corps imaginaires du carnet 11 | Python stdlib + matplotlib | ## Conventions