// Make newform 648.4.i.n in Magma, downloaded from the LMFDB on 29 March 2024. // To make the character of type GrpDrchElt, type "MakeCharacter_648_i();" // To make the character of type GrpDrchElt with Codomain the HeckeField, type "MakeCharacter_648_i_Hecke();" // To make the coeffs of the qexp of the newform in the Hecke field type "qexpCoeffs();" // To make the newform (type ModFrm), type "MakeNewformModFrm_648_4_i_n();". // 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_648_4_i_n();". // 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 poly := [289, -17, -16, -1, 1]; Kf := NumberField(Polynomial([elt : elt in poly])); AssignNames(~Kf, ["nu"]); end if; Rf_num := [[1, 0, 0, 0], [-289, -16, 16, 1], [17, 66, 2, -2], [-1139, 528, 16, 35]]; Rf_basisdens := [1, 272, 17, 272]; Rf_basisnums := ChangeUniverse([[z : z in elt] : elt in Rf_num], Kf); Rfbasis := [Rf_basisnums[i]/Rf_basisdens[i] : i in [1..Degree(Kf)]]; inp_vec := Vector(Rfbasis)*ChangeRing(Transpose(Matrix([[elt : elt in row] : row in input])),Kf); return Eltseq(inp_vec); end function; // To make the character of type GrpDrchElt, type "MakeCharacter_648_i();" function MakeCharacter_648_i() N := 648; order := 3; char_gens := [487, 325, 569]; v := [3, 3, 2]; // 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; // To make the character of type GrpDrchElt with Codomain the HeckeField, type "MakeCharacter_648_i_Hecke();" function MakeCharacter_648_i_Hecke(Kf) N := 648; order := 3; char_gens := [487, 325, 569]; char_values := [[1, 0, 0, 0], [1, 0, 0, 0], [-1, -1, 0, 0]]; assert UnitGenerators(DirichletGroup(N)) eq char_gens; values := ConvertToHeckeField(char_values : pass_field := true, Kf := Kf); // the value of chi on the gens as elements in the Hecke field F := Universe(values);// the Hecke field chi := DirichletCharacterFromValuesOnUnitGenerators(DirichletGroup(N,F),values); return chi; 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, 0, 0, 0], [0, 0, 0, 0], [-4, -4, 0, 1], [0, -15, 1, -1], [0, -23, -3, 3], [-46, -46, 0, -1], [11, 0, -8, 0], [-43, 0, -5, 0], [29, 29, 0, -1], [0, 54, -1, 1], [-68, -68, 0, 16], [-90, 0, 1, 0], [-336, -336, 0, -2], [0, -35, -23, 23], [0, 426, -2, 2], [334, 0, 16, 0], [-274, -274, 0, -6], [0, 142, -17, 17], [-581, -581, 0, -11], [-403, 0, 3, 0], [-755, 0, -18, 0], [0, -11, 41, -41], [0, 770, 38, -38], [1323, 0, 0, 0], [0, 236, 50, -50], [0, 48, -102, 102], [-202, -202, 0, -82], [348, 0, -112, 0], [-554, 0, 53, 0], [-1491, -1491, 0, -28], [-1457, 0, -11, 0], [13, 13, 0, 139], [0, -2157, -28, 28], [1014, 1014, 0, 86], [-944, -944, 0, -55], [0, 734, 190, -190], [-1096, -1096, 0, -147], [-2250, 0, 42, 0], [1377, 1377, 0, -129], [0, -582, 167, -167], [-1092, 0, 16, 0], [3066, 0, -28, 0], [0, -351, 137, -137], [-1589, -1589, 0, -166], [582, 0, -43, 0], [184, 0, 204, 0], [3143, 3143, 0, -11], [0, -551, -139, 139], [0, -465, -201, 201], [3038, 3038, 0, -77], [1525, 0, 38, 0], [-1238, -1238, 0, -62], [0, 2439, -28, 28], [-3673, 0, -75, 0], [1531, 1531, 0, 46], [0, 2482, -402, 402], [5072, 0, -205, 0], [6389, 0, 151, 0], [0, -530, 96, -96], [0, -2083, -62, 62], [4204, 4204, 0, -16], [-1440, -1440, 0, -343], [3996, 0, 272, 0], [-2496, -2496, 0, 360], [0, -2337, -48, 48], [0, -4062, 151, -151], [0, -3355, 301, -301], [372, 372, 0, -398], [3399, 3399, 0, 433], [0, -2760, -342, 342], [0, -1126, -536, 536], [-11193, 0, -51, 0], [0, -692, -508, 508], [-2282, -2282, 0, -180], [-5008, 0, 252, 0], [-225, -225, 0, 225], [0, 1546, 124, -124], [-124, 0, 891, 0], [1311, 1311, 0, -234], [1803, 1803, 0, -82], [-228, -228, 0, -148], [0, -4612, -567, 567], [8342, 0, 358, 0], [-1037, 0, -552, 0], [0, 5514, -42, 42], [0, 626, -1034, 1034], [-1376, 0, 282, 0], [0, 3521, 610, -610], [0, 1810, -564, 564], [-16814, -16814, 0, -114], [9666, 0, 542, 0], [0, -1429, -589, 589], [6136, 0, -884, 0], [12873, 12873, 0, -221], [-6699, -6699, 0, 223], [-3552, 0, -992, 0], [-1866, -1866, 0, 1044], [-6004, 0, -1194, 0], [-12455, 0, 355, 0], [-9192, 0, -33, 0], [0, -3370, 170, -170], [-3026, 0, 789, 0], [674, 674, 0, -454], [0, -4583, 666, -666], [-11274, -11274, 0, -190], [-7183, 0, -434, 0], [0, 16945, -99, 99], [3859, 0, 1164, 0], [-12456, -12456, 0, 332], [0, -7271, 230, -230], [-12515, -12515, 0, 339], [-5578, 0, -568, 0], [-15729, -15729, 0, -274], [0, -12272, 312, -312], [478, 0, 834, 0], [0, 22519, -348, 348], [8178, 8178, 0, -174], [6923, 0, -67, 0], [9186, 9186, 0, 456], [0, -2979, 69, -69], [7762, 7762, 0, -1409], [0, -563, -1702, 1702], [0, -9434, -376, 376], [17386, 0, 1186, 0], [0, 5807, -657, 657], [-1638, 0, -1607, 0], [0, -9166, -469, 469], [-18863, 0, 1019, 0], [0, -3213, 723, -723], [3898, 3898, 0, 1168], [12464, 0, -1428, 0], [-19060, -19060, 0, 728], [-10803, -10803, 0, -605], [26390, 0, -440, 0], [8653, 8653, 0, -708], [-12545, -12545, 0, -402], [-9096, 0, -653, 0], [-7393, -7393, 0, 181], [-10540, -10540, 0, -415], [8021, 0, 578, 0], [-19952, 0, 192, 0], [0, -19722, -1489, 1489], [14068, 14068, 0, 648], [-3547, 0, -1817, 0], [26914, 0, -604, 0], [0, -10221, -937, 937], [0, -4438, -564, 564], [0, -3603, 198, -198], [16098, 16098, 0, 530], [-35753, 0, 149, 0], [-7596, -7596, 0, -211], [404, 0, -890, 0], [15122, 0, 1370, 0], [-16571, -16571, 0, -97], [0, -9932, 372, -372], [0, 7225, -1419, 1419], [-2507, 0, 2391, 0], [0, 11255, -492, 492], [20241, 0, -54, 0], [10566, 10566, 0, -209], [0, 10719, -1049, 1049], [-5883, 0, 882, 0], [9601, 9601, 0, -1753], [26247, 0, 2041, 0], [12072, 12072, 0, 862], [0, 16740, 1092, -1092], [3589, 0, 43, 0], [0, -25076, -495, 495]]; aps := ConvertToHeckeField(raw_aps); chi := MakeCharacter_648_i_Hecke(Universe(aps)); return ExtendMultiplicatively(weight, aps, chi); end function; // To make the newform (type ModFrm), type "MakeNewformModFrm_648_4_i_n();". // 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_648_4_i_n(:prec:=4) chi := MakeCharacter_648_i(); f_vec := qexpCoeffs(); Kf := Universe(f_vec); // SetVerbose("ModularForms", true); // SetVerbose("ModularSymbols", true); S := CuspidalSubspace(ModularForms(chi, 4)); 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_648_4_i_n();". // 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_648_4_i_n( : sign := -1) R := PolynomialRing(Rationals()); chi := MakeCharacter_648_i(); // SetVerbose("ModularSymbols", true); Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,4,sign))); Vf := Kernel([<5,R![34225, -1480, 249, 8, 1]>],Snew); return Vf; end function;