// Make newform 960.4.a.v in Magma, downloaded from the LMFDB on 28 March 2024. // To make the character of type GrpDrchElt, type "MakeCharacter_960_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_960_4_a_v();". // 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_960_4_a_v();". // 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_960_a();" function MakeCharacter_960_a() N := 960; order := 1; char_gens := [511, 901, 641, 577]; v := [1, 1, 1, 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_960_a_Hecke(Kf) return MakeCharacter_960_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 := 4; raw_aps := [[0], [3], [-5], [-8], [20], [-22], [-14], [76], [-56], [154], [-160], [162], [-390], [388], [544], [210], [-380], [794], [-148], [840], [858], [-144], [316], [1098], [994], [834], [-1672], [-732], [970], [1938], [528], [636], [1754], [-2508], [-1486], [-2120], [1850], [-1172], [1656], [2666], [1132], [2866], [-1888], [1282], [-350], [3400], [4652], [-4016], [2316], [-94], [-4230], [-2064], [4562], [2532], [3522], [2232], [-2806], [-4848], [-7790], [-118], [-6508], [8770], [-4292], [9464], [9578], [186], [-492], [2290], [-6092], [-5766], [-9374], [3528], [-7616], [-3406], [-12284], [-5424], [-3486], [3626], [5874], [-12662], [6396], [-8286], [4112], [5330], [-11272], [14196], [-5886], [-7526], [-8502], [-12672], [16540], [-8864], [-3688], [-16140], [1580], [-15000], [-20486], [7706], [-3932], [23930], [11468], [11498], [16988], [-17366], [-24860], [-26302], [7812], [7986], [21048], [1738], [-18576], [13602], [19578], [12308], [8600], [6978], [-7668], [15384], [2186], [-1524], [4242], [24354], [322], [-7932], [20684], [-25222], [-23678], [-8432], [-8312], [26298], [16956], [17880], [-22032], [-11534], [38250], [19330], [40674], [7004], [-12198], [-25734], [15668], [34450], [38792], [-20460], [-5542], [-25240], [37330], [-3894], [20324], [-6288], [24650], [9426], [-9316], [-6968], [-35964], [-47888], [12760], [-25054], [28282], [30634], [48572], [12906], [5880], [55444], [32050], [-29880], [-5216], [-6750], [52178], [-37678], [-15356], [11546], [9224], [-9958], [5872], [39690], [13828], [7874], [13688], [-17206], [39376], [12924], [-48446], [4250], [7712], [-13774], [-5702], [-532], [-61702], [-55136], [62594], [-7260], [428], [38810], [-47668], [-3782], [31506], [13530], [-50174], [-41032], [-22710], [80336], [-32366], [-45150], [-44844], [61754], [65504], [-83188], [-8358], [76820], [-19598], [10802], [-45656], [59892], [-54968], [-58182], [9920], [-78158], [18024], [-67430], [-12062], [-7816], [27842], [-80640], [91356], [83474], [36490], [-66592], [-52904], [61300], [13322], [82092], [1792], [-85606], [54564], [48960], [13554], [1074], [-72988], [-103896], [-93796], [29668], [-55336], [93290], [-19982], [-89800], [28784], [-119396], [-5612], [85952], [41178], [95810], [-63144], [-37606], [39242], [11532], [-90158], [-61836], [29442], [-80982], [47792], [29356], [32322], [-13382], [-2270], [-134084], [8362], [3690], [-14988], [-42590], [-28502], [117340], [-141558], [105088], [7634], [45256], [85844], [78874], [136922], [85548], [-7824], [106632], [-25912], [-57022], [-51260], [-127184], [64946], [106674], [-71400], [156834], [-129494], [77628], [15018], [-17580], [-39958], [89754], [-96224], [-61422], [-137212], [-171924], [15642], [94602], [158320], [59452], [72132], [-8222], [140580], [120074], [-157032], [82690], [108832], [155826], [-123102], [-53204], [135416], [161722], [-9940], [40608], [74818], [-144526], [-121876], [-59446], [22938], [4496], [-42502], [-61614], [-40676], [-46828], [189968], [1602], [94090], [-145094], [-149152], [86732], [-3884], [-201036], [-25670], [-80670], [-133766], [24192], [-89678], [1962], [-54494], [-60632], [-209702], [-155332], [-103390], [-80156], [-66480], [10962], [-209348], [-14694], [214474], [-68288], [-123374], [104522], [-57312], [213812], [189458], [188456], [-213182], [-35878], [155264], [-45084], [-227124], [-14726], [-213654], [20824], [-180790], [-166692], [-123820], [-142336], [36306], [-52584], [89626], [13452], [-120256], [-133534], [-37422], [-93718], [-67462], [58778], [-122232], [190818], [66108], [-38120], [-152656], [177906], [-263052], [208048], [2434], [11874], [-252300], [153436], [186392], [-247414], [-130496], [91770], [64052], [86610], [145050], [-174462], [-63904], [-81846], [-84990], [185928], [-281782], [66834], [66076], [-72420], [-61262], [-243534], [-259244], [173788], [-41990], [-229782], [-53696], [-104584], [-213582], [-159672], [28890], [213794], [223648], [136580], [-169254], [-47862], [205500], [30090], [33092], [148952]]; aps := ConvertToHeckeField(raw_aps); chi := MakeCharacter_960_a_Hecke(Universe(aps)); return ExtendMultiplicatively(weight, aps, chi); end function; // To make the newform (type ModFrm), type "MakeNewformModFrm_960_4_a_v();". // 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_960_4_a_v(:prec:=1) chi := MakeCharacter_960_a(); f_vec := qexpCoeffs(); Kf := Universe(f_vec); // SetVerbose("ModularForms", true); // SetVerbose("ModularSymbols", true); S := CuspidalSubspace(ModularForms(chi, 4)); S := BaseChange(S, Kf); maxprec := NextPrime(2999) - 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_960_4_a_v();". // 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_960_4_a_v( : sign := -1) R := PolynomialRing(Rationals()); chi := MakeCharacter_960_a(); // SetVerbose("ModularSymbols", true); Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,4,sign))); Vf := Kernel([<7,R![8, 1]>,<11,R![-20, 1]>],Snew); return Vf; end function;