/* Pari
/* Modularity of elliptic curves 
/* Author: Joachim Wehler
*/
default(format, "f0.10" ); 


default(parisizemax, "16G");


print ("====================================================");
print("Elliptic_curve_taniyama_10: Start","\n");
\r Modular_Forms/ellprint;

debug 	= 0;
prec 	= 13;
weight 	= 2;
i		= -1;	

/*
[0,0,1,0,0] 
[0,0,0,-15,22]
[0,0,1, -2174420, 1234136692]
[0,0,1,-7,6]
*/

cases = [ [5,0,1,0,0] ,[1,0,-1,0,0], [6,-3,9,-16,-14], [0,0,1,0,0]]; 

/*
for (case = 1, 1, \
*/

for (case = 1, matsize(cases)[2], \
{
	param 	= 	cases[case];
	if (debug ==1, print("param: ", param));
	E_0 	= 	ellinit (param);
	E 		= 	ellminimalmodel(E_0);
	ellglobalred(E);
	cond 	= 	ellglobalred(E)[1];
	disc	= 	E.disc;
	j		= 	E.j;
	tsw		= 	elltaniyama(E);
	u		= 	tsw[1];
	v		= 	tsw[2];
	l_series=	x * Ser(ellan(E, prec)); 
	l_series= subst(l_series, x, q);
	level	= cond;
	
	/*
	mf_dim	= mfdim([level,weight]);
	*/
	
	
	mf_cusp_new		= mfinit([level,weight],0);
	mf_cusp_new_dim = mfdim(mf_cusp_new);
	eigenbasis		= mfeigenbasis(mf_cusp_new);
	
	mf_cusp			= mfinit([level,weight],1);	
	mf_cusp_dim		= mfdim(mf_cusp);
	
	mf_cusp_old		= mfinit([level,weight],2);	
	mf_cusp_old_dim	= mfdim(mf_cusp_old);
	
	genus 			= mf_cusp_dim; 
	
	print("Case ", case, ": Global minimal model: ", ellprint(E));
	print ( "j(E) = ", j, ", minimal discr.: ", disc, " = ", factor(disc), ", conductor: ", cond, " = ", factor(cond));	
	print("Genus X_0(", cond, ") = dim S_", weight, "(Gamma_0(", level, ")): ", genus);	
	print("L-series: ", l_series);
	print("Old forms: S^old_", weight, "(Gamma_0(", level, ")) has dimension: ", mf_cusp_old_dim);
	print("New forms: S^new_", weight, "(Gamma_0(", level, ")) has dimension: ", mf_cusp_new_dim);		
	for (j=1,matsize(eigenbasis)[2], print("basis_", j, ":  ", Ser(mfcoefs(eigenbasis[j],prec),q, 1+prec)));	
	print("---------------------------------------------");
});
print("Elliptic_curve_taniyama_10: End");
print("====================================================");


