// Make newform 18.12.a.e in Magma, downloaded from the LMFDB on 28 March 2024. // To make the character of type GrpDrchElt, type "MakeCharacter_18_a();" // To make the coeffs of the qexp of the newform in the Hecke field type "qexpCoeffs();" // To make the newform (type ModFrm), type "MakeNewformModFrm_18_12_a_e();". // This may take a long time! To see verbose output, uncomment the SetVerbose lines below. // The precision argument determines an initial guess on how many Fourier coefficients to use. // This guess is increased enough to uniquely determine the newform. // To make the Hecke irreducible modular symbols subspace (type ModSym) // containing the newform, type "MakeNewformModSym_18_12_a_e();". // This may take a long time! To see verbose output, uncomment the SetVerbose line below. // The default sign is -1. You can change this with the optional parameter "sign". function ConvertToHeckeField(input: pass_field := false, Kf := []) if not pass_field then Kf := Rationals(); end if; return [Kf!elt[1] : elt in input]; end function; // To make the character of type GrpDrchElt, type "MakeCharacter_18_a();" function MakeCharacter_18_a() N := 18; order := 1; char_gens := [11]; v := [1]; // chi(gens[i]) = zeta^v[i] assert UnitGenerators(DirichletGroup(N)) eq char_gens; F := CyclotomicField(order); chi := DirichletCharacterFromValuesOnUnitGenerators(DirichletGroup(N,F),[F|F.1^e:e in v]); return MinimalBaseRingCharacter(chi); end function; function MakeCharacter_18_a_Hecke(Kf) return MakeCharacter_18_a(); end function; function ExtendMultiplicatively(weight, aps, character) prec := NextPrime(NthPrime(#aps)) - 1; // we will able to figure out a_0 ... a_prec primes := PrimesUpTo(prec); prime_powers := primes; assert #primes eq #aps; log_prec := Floor(Log(prec)/Log(2)); // prec < 2^(log_prec+1) F := Universe(aps); FXY := PolynomialRing(F, 2); // 1/(1 - a_p T + p^(weight - 1) * char(p) T^2) = 1 + a_p T + a_{p^2} T^2 + ... R := PowerSeriesRing(FXY : Precision := log_prec + 1); recursion := Coefficients(1/(1 - X*T + Y*T^2)); coeffs := [F!0: i in [1..(prec+1)]]; coeffs[1] := 1; //a_1 for i := 1 to #primes do p := primes[i]; coeffs[p] := aps[i]; b := p^(weight - 1) * F!character(p); r := 2; p_power := p * p; //deals with powers of p while p_power le prec do Append(~prime_powers, p_power); coeffs[p_power] := Evaluate(recursion[r + 1], [aps[i], b]); p_power *:= p; r +:= 1; end while; end for; Sort(~prime_powers); for pp in prime_powers do for k := 1 to Floor(prec/pp) do if GCD(k, pp) eq 1 then coeffs[pp*k] := coeffs[pp]*coeffs[k]; end if; end for; end for; return coeffs; end function; function qexpCoeffs() // To make the coeffs of the qexp of the newform in the Hecke field type "qexpCoeffs();" weight := 12; raw_aps := [[32], [0], [11730], [-50008], [531420], [1332566], [5109678], [2901404], [-30597000], [77006634], [-239418352], [-785041666], [-411252954], [351233348], [-95821680], [1465857378], [-5621152020], [-10473587770], [4515307532], [8509579560], [2012496986], [-22238409568], [-6328647516], [50123706678], [94805961314], [-13795202478], [65183649128], [-93339866916], [-151369448650], [-237348947346], [514414073360], [-298571769420], [616116174918], [-522813911356], [1270146260514], [1253711469848], [606707569574], [-1584008507572], [-2952724162200], [2654101539546], [4064495156964], [-1680732212146], [-409135210176], [4719056206274], [3608988480882], [1721399536712], [1703445809660], [-14625286013200], [-3364566476556], [1899203532830], [-1519014596346], [-8314965823056], [-13012622473198], [18713802990924], [5484268053246], [-19594148973240], [-35702898898086], [36038674743104], [-40730388976786], [-4088261050698], [-13355500432204], [-21943343955822], [252176931740], [49575205201080], [32431810241066], [95642176049034], [-121579047495868], [-83809620132238], [77945675395116], [112178870095910], [159720754812702], [2463779994696], [134080304339264], [-125684353520722], [56230100344244], [-107825843218560], [-237628966425006], [285969574353206], [93170655151086], [256949937683594], [296091363538740], [-340485060693730], [-137788674940080], [352376754089618], [-429184982726248], [361081178389644], [6276881514654], [460906541857562], [-797398572217350], [-580897190893312], [822532069976292], [488234955785856], [-29728121429176], [-816135007924644], [609916588495964], [-240472414055592], [156719890564554], [100578608126982], [1224425212010660], [-362345490584890], [1326304085946764], [2244739616558874], [1101778600026756], [-1691074659274122], [-2365746586247980], [-325901835908926], [2766839563505724], [-1959660392281650], [3373926699822456], [3135854548398218], [3675681128418992], [-978885934529794], [1462553585594310], [4301011527851876], [-595346430921928], [751261899449310], [1461443871913388], [3578616021301992], [-731395394414214], [1699870896228228], [-178604343718066], [-926675672044702], [149664405584562], [-6748556779434564], [-1612717768694596], [-416261248516854], [-2829722232869698], [-6811222080684240], [2731911221435864], [-6583680329025466], [4375643459996972], [-4900592000047128], [-704936008362880], [5255155388235854], [-3813359614118538], [-9812412425812222], [-7091357397610446], [-2463997954517668], [-3049360148357430], [3922651912372326], [17501217622441796], [-4481484718794078], [-2388191905157320], [-3422454871430484], [7188806436234662], [-12510074262400536], [5885164723051022], [-2579952118898154], [-3148742293288876], [22853895216247008], [-18369539762727466], [11750671469714094], [-7767911723841412], [-4627495534783560], [19251116224247588], [18009829098648528], [-5428822550168104], [-27631021175735106], [-24605982978712198], [-31189203822657318], [31718935020484068], [-9409924474322058], [-12773086132968568], [-35110502073813924], [50866832186427054], [42567618865546392], [22412352862092944], [-20326767928668418]]; aps := ConvertToHeckeField(raw_aps); chi := MakeCharacter_18_a_Hecke(Universe(aps)); return ExtendMultiplicatively(weight, aps, chi); end function; // To make the newform (type ModFrm), type "MakeNewformModFrm_18_12_a_e();". // This may take a long time! To see verbose output, uncomment the SetVerbose lines below. // The precision argument determines an initial guess on how many Fourier coefficients to use. // This guess is increased enough to uniquely determine the newform. function MakeNewformModFrm_18_12_a_e(:prec:=1) chi := MakeCharacter_18_a(); f_vec := qexpCoeffs(); Kf := Universe(f_vec); // SetVerbose("ModularForms", true); // SetVerbose("ModularSymbols", true); S := CuspidalSubspace(ModularForms(chi, 12)); S := BaseChange(S, Kf); maxprec := NextPrime(997) - 1; while true do trunc_vec := Vector(Kf, [0] cat [f_vec[i]: i in [1..prec]]); B := Basis(S, prec + 1); S_basismat := Matrix([AbsEltseq(g): g in B]); if Rank(S_basismat) eq Min(NumberOfRows(S_basismat), NumberOfColumns(S_basismat)) then S_basismat := ChangeRing(S_basismat,Kf); f_lincom := Solution(S_basismat,trunc_vec); f := &+[f_lincom[i]*Basis(S)[i] : i in [1..#Basis(S)]]; return f; end if; error if prec eq maxprec, "Unable to distinguish newform within newspace"; prec := Min(Ceiling(1.25 * prec), maxprec); end while; end function; // To make the Hecke irreducible modular symbols subspace (type ModSym) // containing the newform, type "MakeNewformModSym_18_12_a_e();". // This may take a long time! To see verbose output, uncomment the SetVerbose line below. // The default sign is -1. You can change this with the optional parameter "sign". function MakeNewformModSym_18_12_a_e( : sign := -1) R := PolynomialRing(Rationals()); chi := MakeCharacter_18_a(); // SetVerbose("ModularSymbols", true); Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,12,sign))); Vf := Kernel([<5,R![-11730, 1]>],Snew); return Vf; end function;