{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Courbes elliptiques\n",
"\n",
"## De quoi sont les courbes elliptiques ?\n",
"\n",
"Pour faire court, ce sont, du troisième degré, les courbes planes non singulières, autrement dit, les courbes définies par une équation $P(x,y)=0$, où $P$ est un polynôme de degré 3 en au moins une des variables, et qui admettent en chaque point une tangente unique (ce qui exclut par exemple le folium de Descartes $x^3+y^3=3axy$ (un point double : cubique nodale) ou la parabole semi-cubique $y^2−x^3=0$ (une tangente double au point anguleux), ainsi que toutes le courbes qui se décomposent en une droite et une conique.\n",
"\n",
"On peut faire quelques dessins avec jupyter, sympy et matplotlib."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from sympy import *\n",
"from sympy.plotting import plot, plot_parametric\n",
"import math\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(x, y)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var('x y')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Par exemple,\n",
"$$y^2=x^3-3x$$\n",
"est une courbe elliptique :"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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xUMMHDggde3q9odk5A44NkbsgBgpXVrq1s2dHbthg3WaxJebK910k9S/f+FK3VtvvaWvv/5aklShQoUYpUOslCghlSrl/g39+KN1GsD7KHZADF17rXTccdIzz1gnSWx790p9+7q/x4Jcgv3Z0qVL1a5dO43871DPww8/HKOEiKW//EX65z+lb76xTgJ4H8UOiKELL3QbrD7xhLRpk3WaxBSJSHfc4fYHbNSo4M9bu3atWrVqpf79+6tDhw6SpJkzZ+rTTz+NUVLEyhlnuLcHDtjmABIBc+yAGNuyRTrzTKlpUzc3DIXTpYt0/PHS3/9e8Od8//33atSokRo3bqxx48YpHA4rGAzqqquu0oEDBzRnzpzYBUZMjB7t9rP7+GPrJIC3lbIOAPhdhQrSk09KgwZJn34q1a1rnSgx7N/v/t4iEWngwMI996STTtJXX331m/unTp2q9PT0KCVEPFWqJOXnSxs3SqedZp0G8C4uxQJx0LmztG+f25MLBZOT40Zohg51L+pIbm3aSHl50ltvWScBvI1iB8TJU0+57ToeecSNQuHI5s6VbrtNWrTI7VkHSFKrVtLrr1unALyNYgfEyQ03SDffLN13n7RihXUabzpwwJ0oMWaM29z5+OOtE8FLrrnGbR/0ixPiAPwKiyeAONqyRbr4YqliRWnmTKl8eetE3vLxx26vugULpGgeDvHz4olQKMQcuwS2c6f7Benss9msGDgSRuyAOKpQQRo+XFqyhBemX3viCbdY4pNPolvq4B/lykk33ij961/S999bpwG8iRE7wEC3btL06W5xQKtWbnf9ZJWfL111lTtd4LXXpJIlo/85GLHzj717pdRUd37s2WdbpwG8J4lfTgA7gwZJVapIrVtLn39uncbODz9IDz8s/e530pQpsSl18JfSpaU//1kaP946CeBNFDvAQNWq7oXpzDOlrCw39y7ZrF4tderkCu7YsVIwaJ0IiaBkSXeiCweIAIdHsQOMXHyxm1f26adutV9+vnWi+DhwQHrzTalePalnT6lrV+tESDTduknbt0uvvGKdBPAeih1g6OqrpWnT3GTwJk2kDRusE8VWKCT16eMupb36qvuagcI64QSpfXvp2WetkwDeQ7EDjLVu7fZu+/BDd0JFKGSdKDZWrnTn5a5e7VYFN21qnQiJrGlTt9chgENR7AAPaNPGnUzx9ttS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\n",
"text/plain": [
"