Calcul de la loi de groupe sur une courbe elliptique

La fonction $\wp$ de Weierstrass vérifie l'équation différentielle

$$ [\wp '(z)]^{2}=4[\wp (z)]^{3}-g_{2}\wp (z)-g_{3}$$

de sorte que $(x,y)=(\wp(t),\wp'(t))$ fournit un paramétrage de la courbe elliptique d'équation $$y^2=4x^3-g_2x-g_3$$.

Par ailleurs, elle vérifie la formule d'addition

$$ \wp (z+y)={\frac {1}{4}}\left\{{\frac {\wp '(z)-\wp '(y)}{\wp (z)-\wp (y)}}\right\}^{2}-\wp (z)-\wp (y) $$

et la formula de duplication

$${\displaystyle \wp (2z)={\frac {1}{4}}\left\{{\frac {\wp ''(z)}{\wp '(z)}}\right\}^{2}-2\wp (z),}$$

valable si $2z$ n'est pas une période.

Ces formules proviennent des faits suivants : (1) toute droite coupe la courbe en 3 points (si on compte les points de tangence avec multiplicité 2), et (2) la somme des zéros d'une fonction elliptique quelconque dans un parallélograme fondamental est congrue à la somme des poôles modulo le réseau des périodses.

Ainsi, si $y=px+q$ est l'équation de la droite passant par $P_1$ et $P_2$ de paramètres $t_1$ et $t_2$, et si $t_3$ est le paramètre du troisième point d'intersection $P_3$, alors $t_1+t_2+t_3\equiv 0 \mod (\omega_1,\omega_2)$. En effet, la seule singularité de la fonction $\wp'(z)-p\wp(z)-q$ est un pôle triple en 0, la somme des trois zéors est donc un élément du réseau.

Donc, dans le groupe ${\mathbb C}/({\mathbb Z}\omega_1\oplus{\mathbb Z}\omega_2)$, on a $t_3 = -(t_1+t_2)$. Comme $\wp$ est paire, et sa dérivée $\wp'$ impaire, le point de paramètre $-t_3$ est $(x_3,-y_3)$, donc, le symétrique de $P_3$ par rapport à l'axe des abscisses.

C'est ce point que nous allons maintenant calculer pour la courbe $$y^2 = x^3+ax+b.$$

In [1]:
from sympy import *                    # sympy permet de faire du calcul symbolique
from sympy.interactive import printing # On peut afficher les résultats en LaTex 
printing.init_printing(use_latex=True) #
In [2]:
# On prépare quelques variables, pour l'équation de la courbe, les points P1 P2, et deux paramètres t,u
var('x y x1 x2 y1 y2 t u a b')
Out[2]:
$$\left ( x, \quad y, \quad x_{1}, \quad x_{2}, \quad y_{1}, \quad y_{2}, \quad t, \quad u, \quad a, \quad b\right )$$
In [3]:
# Equation de la courbe E
E = y**2 - x**3 - a*x -b; E
Out[3]:
$$- a x - b - x^{3} + y^{2}$$
In [4]:
# Equations paramétriques de la droite (P1 P2)
X = x1+t*(x2-x1); Y = y1+t*(y2-y1); X,Y
Out[4]:
$$\left ( t \left(- x_{1} + x_{2}\right) + x_{1}, \quad t \left(- y_{1} + y_{2}\right) + y_{1}\right )$$
In [5]:
# On les injecte dand l'équation de la courbe
E.subs({x:X, y:Y})
Out[5]:
$$- a \left(t \left(- x_{1} + x_{2}\right) + x_{1}\right) - b - \left(t \left(- x_{1} + x_{2}\right) + x_{1}\right)^{3} + \left(t \left(- y_{1} + y_{2}\right) + y_{1}\right)^{2}$$
In [6]:
# On développe ...
expand(_)
Out[6]:
$$a t x_{1} - a t x_{2} - a x_{1} - b + t^{3} x_{1}^{3} - 3 t^{3} x_{1}^{2} x_{2} + 3 t^{3} x_{1} x_{2}^{2} - t^{3} x_{2}^{3} - 3 t^{2} x_{1}^{3} + 6 t^{2} x_{1}^{2} x_{2} - 3 t^{2} x_{1} x_{2}^{2} + t^{2} y_{1}^{2} - 2 t^{2} y_{1} y_{2} + t^{2} y_{2}^{2} + 3 t x_{1}^{3} - 3 t x_{1}^{2} x_{2} - 2 t y_{1}^{2} + 2 t y_{1} y_{2} - x_{1}^{3} + y_{1}^{2}$$
In [7]:
# Puisqu'on suppose que P1 est sur la courbe,ses coordonnées doivent annuler E
# On peut donc soustraire la quantité suivante, supposée nulle
_ - E.subs({x:x1,y:y1})
Out[7]:
$$a t x_{1} - a t x_{2} + t^{3} x_{1}^{3} - 3 t^{3} x_{1}^{2} x_{2} + 3 t^{3} x_{1} x_{2}^{2} - t^{3} x_{2}^{3} - 3 t^{2} x_{1}^{3} + 6 t^{2} x_{1}^{2} x_{2} - 3 t^{2} x_{1} x_{2}^{2} + t^{2} y_{1}^{2} - 2 t^{2} y_{1} y_{2} + t^{2} y_{2}^{2} + 3 t x_{1}^{3} - 3 t x_{1}^{2} x_{2} - 2 t y_{1}^{2} + 2 t y_{1} y_{2}$$
In [8]:
# Ce qui reste est divisible par t, puisque t=0 correspond à P1 
simplify(_/t)
Out[8]:
$$a x_{1} - a x_{2} + t^{2} x_{1}^{3} - 3 t^{2} x_{1}^{2} x_{2} + 3 t^{2} x_{1} x_{2}^{2} - t^{2} x_{2}^{3} - 3 t x_{1}^{3} + 6 t x_{1}^{2} x_{2} - 3 t x_{1} x_{2}^{2} + t y_{1}^{2} - 2 t y_{1} y_{2} + t y_{2}^{2} + 3 x_{1}^{3} - 3 x_{1}^{2} x_{2} - 2 y_{1}^{2} + 2 y_{1} y_{2}$$
In [9]:
# Le point t=1 est P2, également sur la courbe. Pour se débarasser de E-x1,y1), on pose t=1+u et on retranche l'valuation en u=0
_.subs({t:1+u})
Out[9]:
$$a x_{1} - a x_{2} + x_{1}^{3} \left(u + 1\right)^{2} - 3 x_{1}^{3} \left(u + 1\right) + 3 x_{1}^{3} - 3 x_{1}^{2} x_{2} \left(u + 1\right)^{2} + 6 x_{1}^{2} x_{2} \left(u + 1\right) - 3 x_{1}^{2} x_{2} + 3 x_{1} x_{2}^{2} \left(u + 1\right)^{2} - 3 x_{1} x_{2}^{2} \left(u + 1\right) - x_{2}^{3} \left(u + 1\right)^{2} + y_{1}^{2} \left(u + 1\right) - 2 y_{1}^{2} - 2 y_{1} y_{2} \left(u + 1\right) + 2 y_{1} y_{2} + y_{2}^{2} \left(u + 1\right)$$
In [10]:
_ - _.subs({u:0})
Out[10]:
$$x_{1}^{3} \left(u + 1\right)^{2} - 3 x_{1}^{3} \left(u + 1\right) + 2 x_{1}^{3} - 3 x_{1}^{2} x_{2} \left(u + 1\right)^{2} + 6 x_{1}^{2} x_{2} \left(u + 1\right) - 3 x_{1}^{2} x_{2} + 3 x_{1} x_{2}^{2} \left(u + 1\right)^{2} - 3 x_{1} x_{2}^{2} \left(u + 1\right) - x_{2}^{3} \left(u + 1\right)^{2} + x_{2}^{3} + y_{1}^{2} \left(u + 1\right) - y_{1}^{2} - 2 y_{1} y_{2} \left(u + 1\right) + 2 y_{1} y_{2} + y_{2}^{2} \left(u + 1\right) - y_{2}^{2}$$
In [11]:
# Le résultat est divisible par u, puisque le point u=0 est P2
simplify(_/u)
Out[11]:
$$u x_{1}^{3} - 3 u x_{1}^{2} x_{2} + 3 u x_{1} x_{2}^{2} - u x_{2}^{3} - x_{1}^{3} + 3 x_{1} x_{2}^{2} - 2 x_{2}^{3} + y_{1}^{2} - 2 y_{1} y_{2} + y_{2}^{2}$$
In [12]:
# Maintenant, la seule valeur de u annulant cette expression est celle correpondant à P3
solve(_,u)
Out[12]:
$$\left [ \frac{x_{1}^{3} - 3 x_{1} x_{2}^{2} + 2 x_{2}^{3} - y_{1}^{2} + 2 y_{1} y_{2} - y_{2}^{2}}{x_{1}^{3} - 3 x_{1}^{2} x_{2} + 3 x_{1} x_{2}^{2} - x_{2}^{3}}\right ]$$
In [13]:
# Il ne reste plus qu'à rajouter le 1 qu'on avait enlevé pour avoir t3
t = simplify(1+_[0]);t
Out[13]:
$$\frac{2 x_{1}^{3} - 3 x_{1}^{2} x_{2} + x_{2}^{3} - y_{1}^{2} + 2 y_{1} y_{2} - y_{2}^{2}}{x_{1}^{3} - 3 x_{1}^{2} x_{2} + 3 x_{1} x_{2}^{2} - x_{2}^{3}}$$
In [14]:
# C'est plus joli comme ça
t.factor()
Out[14]:
$$\frac{1}{\left(x_{1} - x_{2}\right)^{3}} \left(2 x_{1}^{3} - 3 x_{1}^{2} x_{2} + x_{2}^{3} - y_{1}^{2} + 2 y_{1} y_{2} - y_{2}^{2}\right)$$
In [15]:
# Et enfin, on calcule la coordonnée x3 de P3 (on simplifie au passage)

x3 = simplify(x1+t*(x2-x1)); y3 = -simplify(y1+t*(y2-y1)); print x3;print y3
(-x1**3 + x1**2*x2 + x1*x2**2 - x2**3 + y1**2 - 2*y1*y2 + y2**2)/(x1**2 - 2*x1*x2 + x2**2)
-(y1*(x1**3 - 3*x1**2*x2 + 3*x1*x2**2 - x2**3) - (y1 - y2)*(2*x1**3 - 3*x1**2*x2 + x2**3 - y1**2 + 2*y1*y2 - y2**2))/(x1**3 - 3*x1**2*x2 + 3*x1*x2**2 - x2**3)

In [16]:
x3 = x3.factor();x3
Out[16]:
$$- \frac{1}{\left(x_{1} - x_{2}\right)^{2}} \left(x_{1}^{3} - x_{1}^{2} x_{2} - x_{1} x_{2}^{2} + x_{2}^{3} - y_{1}^{2} + 2 y_{1} y_{2} - y_{2}^{2}\right)$$
In [17]:
y3 = y3.factor();y3
Out[17]:
$$\frac{1}{\left(x_{1} - x_{2}\right)^{3}} \left(x_{1}^{3} y_{1} - 2 x_{1}^{3} y_{2} + 3 x_{1}^{2} x_{2} y_{2} - 3 x_{1} x_{2}^{2} y_{1} + 2 x_{2}^{3} y_{1} - x_{2}^{3} y_{2} - y_{1}^{3} + 3 y_{1}^{2} y_{2} - 3 y_{1} y_{2}^{2} + y_{2}^{3}\right)$$
In [18]:
# Sympy n'est pas toujours très efficace, il n'a pas vu toutes les simplifications
# Pour lui mâcher le travail , on extrait numérateur et dénominateur
x3.as_numer_denom()
Out[18]:
$$\left ( - x_{1}^{3} + x_{1}^{2} x_{2} + x_{1} x_{2}^{2} - x_{2}^{3} + y_{1}^{2} - 2 y_{1} y_{2} + y_{2}^{2}, \quad \left(x_{1} - x_{2}\right)^{2}\right )$$
In [19]:
expand(_[0]-(y2-y1)**2)
Out[19]:
$$- x_{1}^{3} + x_{1}^{2} x_{2} + x_{1} x_{2}^{2} - x_{2}^{3}$$
In [20]:
_.factor()
Out[20]:
$$- \left(x_{1} - x_{2}\right)^{2} \left(x_{1} + x_{2}\right)$$

On a donc trouvé $x_3$ : $$x_3 = -x_1-x_2 +s^2,\quad s=\frac{y_2-y_1}{x_2-x_1}$$

In [21]:
y3.as_numer_denom()
Out[21]:
$$\left ( x_{1}^{3} y_{1} - 2 x_{1}^{3} y_{2} + 3 x_{1}^{2} x_{2} y_{2} - 3 x_{1} x_{2}^{2} y_{1} + 2 x_{2}^{3} y_{1} - x_{2}^{3} y_{2} - y_{1}^{3} + 3 y_{1}^{2} y_{2} - 3 y_{1} y_{2}^{2} + y_{2}^{3}, \quad \left(x_{1} - x_{2}\right)^{3}\right )$$
In [22]:
expand(_[0]-(y2-y1)**3)
Out[22]:
$$x_{1}^{3} y_{1} - 2 x_{1}^{3} y_{2} + 3 x_{1}^{2} x_{2} y_{2} - 3 x_{1} x_{2}^{2} y_{1} + 2 x_{2}^{3} y_{1} - x_{2}^{3} y_{2}$$
In [23]:
_.factor()
Out[23]:
$$\left(x_{1} - x_{2}\right)^{2} \left(x_{1} y_{1} - 2 x_{1} y_{2} + 2 x_{2} y_{1} - x_{2} y_{2}\right)$$

Et voilà $y_3$ : $$y_3= -s(s^2-x_1-x_2) -t,\quad t=\frac{x_1y_2-x_2y_1}{x_1-x_2}$$

Dans le cas ou $P_1=P_2=P$, le paramètre $s$ est remplacé par la pente de la tangente au point $P$.

In []: