courbes elliptiques avec Pari

Utilisation à l'épreuve de modélisation de l'agrégation de mathématiques

Modérateur : xcasadmin

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

courbes elliptiques avec Pari

Message par alain974 » sam. oct. 16, 2010 1:51 pm

Bonjour.

Alors là on s'accroche aux branches! :mrgreen:

Si on entre

Code : Tout sélectionner

g:=pari("ellinit",[0,0,0,1,2])
on constate que g contient une courbe elliptique entre crochets, comme la syntaxe de Pari le demande. Mais si après ça on entre

Code : Tout sélectionner

h:=pari("elltors",g)
pour avoir les éléments de torsion du groupe de Mordell-Weil de g, on a un message d'erreur
Error in PARI subsystem
avec un retour "undef".

Idem avec d'autres fonctions de courbes elliptiques comme par exemple

Code : Tout sélectionner

h:=pari("ellgenerators",g)
qui devait donner les générateurs du groupe de Mordell-Weil.

Il semble que la syntaxe de g ne soit pas reconnue par Pari... :?

parisse
Messages : 4842
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: courbes elliptiques avec Pari

Message par parisse » sam. oct. 16, 2010 2:46 pm

C'est peut-etre du au fait qu'en sortie de pari, pour convertir vers xcas, je ne fais pas la différence entre les types t_VEC et t_COL de pari. Mais ca va être difficile à corriger, parce que je n'ai jamais regardé comment fonctionnent ces fonctions elliptiques...

frederic han
Messages : 1099
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: courbes elliptiques avec Pari

Message par frederic han » sam. oct. 16, 2010 3:36 pm

NB: en revanche
pari()
pari(E = ellinit([0,0,0,-1,0]))
elltors(E)

fonctionne

parisse
Messages : 4842
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: courbes elliptiques avec Pari

Message par parisse » sam. oct. 16, 2010 4:31 pm

excellent!
bon sinon, semble-t-il un simple ajustement sur le type t_VEC/t_COL marche, après correction du pb, si je fais g:=pari("ellinit",[0,0,0,1,2]); h:=pari("elltors",g); et ça renvoie
[0,0,0,1,2,0,2,8,-1,-48,-1728,-1792,432/7,[-1.0,0.5-1.32287565553*i,0.5+1.32287565553*i],3.49819325675,-1.74909662838+1.14810572874*i,-1.43180151895,0.715900759476-1.36797821866*i,4.01629571831];[4,[4],[[1,2]]]

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: courbes elliptiques avec Pari

Message par alain974 » sam. oct. 16, 2010 5:29 pm

parisse a écrit :après correction du pb
dans le code source j'imagine? :twisted:

parisse
Messages : 4842
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: courbes elliptiques avec Pari

Message par parisse » sam. oct. 16, 2010 6:56 pm

dans mon source perso, je pense faire une mise a jour source/binaires win+linux en début de semaine prochaine.

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: courbes elliptiques avec Pari

Message par alain974 » ven. nov. 05, 2010 7:01 pm

Ça commence à devenir intéressant:

Code : Tout sélectionner

a:=element(-8 .. 8,-2,1)
b:=element(-8 .. 8,-1,1)
implicitplot(x^3+a*x+b-y^2)
ec:=pari("ellinit",[0,0,0,round(a),round(b)])
torsion:=pari("elltors",ec)
ordre:=torsion[1]
generateurs:=torsion[3]
couleur(point(generateurs),4)
Avantages:

*On peut piloter a et b avec des curseurs entiers, et voir la courbe elliptique évoluer
*L'affichage de l'ordre du groupe de torsion suit le mouvement, c'est magique!
*On a s'il existe, un générateur du groupe de torsion, dessiné sur la figure!

Étapes suivantes:

*Dessiner tout le groupe de torsion, pour cela il faudra un peu de programmation (boucle)
*Essayer d'avoir aussi un (ou des) générateur(s) du groupe infini
*Calculer le discriminant et rendre la figure invisible si la courbe n'est pas elliptique (bon exercice pour les agrégatifs :wink: )
*Passer au cas modulo p, où la courbe elliptique et son groupe de Mordell-Weil deviennent des nuages de points.

Donc suite au prochain épisode...

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: courbes elliptiques avec Pari

Message par alain974 » sam. févr. 05, 2011 3:05 pm

Voilà où j'en suis arrivé:

Donc comme programme, la fonction mordell qui accepte les coefficients a et b de la courbe elliptique en entrée, ainsi qu'un paramètre t, qui est la description donnée par Pari du groupe de torsion, et renvoie le nuage de points représentant ce groupe (fini):

Code : Tout sélectionner

mordell(a,b,t):={
local n,p,q,s,c,x,y,xp,yp,xq,yq,res;
res:=NULL;
n:=t[0];
xp:=t[2][0][0];
yp:=t[2][0][1];
p:=point(xp,yp);
res:=res,affichage(p,3,square_point);

if (n>1) {
s:=(3*xp^2+a)/(2*yp);
x:=s*s-2*xp;
y:=-yp+s*(xp-x);
q:=point(x,y);
res:=res,affichage(q,3,square_point);
}

for(k:=0;k<=n;k++){
s:=(y-yp)/(x-xp);
c:=(yp*x-y*xp)/(xp-x);
xq:=x;
yq:=y;
x:=s*s-xp-xq;
y:=c-s*(s*s-xp-xq);
q:=point(x,y);
res:=res,affichage(q,3,square_point);
}

return res;
};
Après, on crée les curseurs a et b:

Code : Tout sélectionner

a:=element((-20) .. 20,0.0,1.0)
b:=element((-20) .. 20,1.0,1.0)
Au passage, on dessine la courbe elliptique:

Code : Tout sélectionner

couleur(implicitplot(x^3+a*x+b-y^2),3)
On fournit la courbe elliptique à Pari:

Code : Tout sélectionner

ec:=pari("ellinit",[0,0,0,round(a),round(b)])
on récupère le groupe de torsion:

Code : Tout sélectionner

torsion:=pari("elltors",ec)
Enfin, on dessine le groupe de torsion avec la fonction compilée:

Code : Tout sélectionner

mordell(a,b,torsion)
Après, il n'y a plus qu'à manipuler les curseurs, et, osons le dire, c'est beau!

Répondre