
// Make newform 1008.4.a.m in Magma, downloaded from the LMFDB on 13 June 2026.
// To make the character of type GrpDrchElt, type "MakeCharacter_1008_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_1008_4_a_m();".
// 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_1008_4_a_m();".
// 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_1008_a();"
function MakeCharacter_1008_a()
    N := 1008;
    order := 1;
    char_gens := [127, 757, 785, 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_1008_a_Hecke( : Kf := Kf)
    return MakeCharacter_1008_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<X, Y> := 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<T> := PowerSeriesRing(FXY : Precision := log_prec + 1);
    recursion := Coefficients(1/(1 - X*T + Y*T^2));
    coeffs := [F!0: i in [1..prec]];
    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], [4], [7], [62], [-62], [-84], [-100], [-42], [10], [48], [-246], [248], [-68], [324], [-258], [120], [622], [-904], [-678], [-642], [-740], [468], [-200], [-1266], [-232], [1792], [-1906], [-90], [-458], [-804], [812], [-414], [1620], [-2370], [568], [-266], [272], [-1876], [152], [610], [1042], [-2038], [-2602], [-2354], [-1680], [668], [1832], [4944], [-5470], [2802], [-1170], [-2338], [2792], [-7024], [2438], [6780], [1928], [5554], [-1942], [-4828], [6152], [-5884], [9132], [-9382], [-3114], [-1532], [-4166], [-11366], [9310], [8572], [-4790], [-5424], [1838], [4260], [9048], [11490], [-1866], [-13662], [-13210], [6960], [8162], [16602], [7738], [840], [6618], [-3090], [5914], [15968], [1172], [5304], [5740], [-8944], [-5558], [19820], [1848], [-340], [-10212], [9332], [-8998], [3416], [526], [-6712], [-4190], [-3032], [5434], [464], [-11748], [7650], [-22878], [-704], [24958], [8826], [-21220], [3268], [-13062], [28012], [3844], [28482], [-9330], [8782], [-10562], [26016], [8898], [-30572], [30618], [-8130], [-27840], [-14624], [-20862], [13920], [25578], [-33472], [25934], [-26952], [23450], [-39568], [12356], [21736], [38310], [-2132], [-5002], [3612], [-27666], [12890], [-9340], [-33082], [-7544], [-8180], [10518], [14134], [-6492], [-38228], [-43076], [32236], [-46518], [-17840], [-7000], [36114], [4748], [42694], [16742], [9956], [-26388], [786], [51888], [51928], [-386], [-48050], [-30808], [35430], [-46218], [-31758], [51638], [-44360], [28100], [3728], [5938], [1992], [-34490], [21556], [17052], [19298], [-56644], [-41082], [15440], [37774], [-9508], [2950], [-9448], [-4802], [-6642], [-24812], [24768], [55214], [2532], [11102], [-50982], [53496], [-5772], [51590], [43048], [69114], [-24290], [43060], [-17944], [21960], [52038], [51990], [-59092], [-2526], [-31812], [-79888], [-74836], [-47060], [30562], [24856], [96148], [10934], [-70278], [-64978], [-9280], [-36010], [32272], [14764], [-99430], [-17288], [5710], [74176], [-29118], [-32762], [96500], [90328], [76438], [-29988], [54144], [31150], [-84778], [50130], [47032], [-62022], [26748], [105072], [60730], [51672], [32300], [9056], [98032], [87560], [83478], [73934], [-94452], [-41806], [29710], [-127208], [-108290], [125762], [-55044], [-117984], [22274], [46972], [-20006], [104450], [-11842], [-52444], [-40700], [-103650], [-6932], [4832], [110242], [-77858], [-55004], [-22322], [-101720], [-125066], [-87488], [-115786], [-51270], [52222], [-23168], [85288], [-62412], [-81296], [71182], [-26444], [53562], [-101582], [-113994], [-101600], [-121440], [9238], [-26596], [20682], [-24048], [65638], [-40280], [-149752], [131852], [-44840], [-65204], [-30822], [-76134], [42980], [-72562], [-10872], [64794], [-105486], [-42630], [106250], [104338], [35688], [-139510], [-80862], [-47268], [-90026], [-80290], [143340], [5022], [-1082], [59610], [72988], [151174], [71568], [-26648], [-184338], [-104618], [-32200], [-62588], [-9806], [-43038], [-79538], [-167694], [17560], [-178992], [-32992], [-126376], [4550], [175632], [42422], [103256], [59278], [-4534], [540], [105488], [-221158], [-6130], [-30518], [-183604], [-184488], [164696], [223988], [-118026], [-36842], [-20328], [-184370], [-48988], [-105360], [203292], [-105274], [-137502], [119694], [-114272], [-99126], [13990], [74596], [-57722], [-223084], [-234028], [243342], [248682], [-49140], [-1902], [52950], [25408], [-26726], [-151060], [-30178], [-127942], [-96420], [-182706], [-89872], [104982], [-79744], [136166], [104940], [222208], [47248], [-63446], [41152], [-44436], [-144770], [88932], [1950], [-104924], [-128438], [-72302], [113240], [-148140], [-211632], [-45222], [159950], [58022], [28556], [236136], [-221100], [62888], [65994], [163598], [-6788], [85440], [-111742], [104786], [65938], [148628], [229494], [265428], [248310], [1576], [54756], [122028], [212490], [-220946], [231514], [77380], [-129622], [194136], [171098], [-307830], [-95292], [-152580]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_1008_a_Hecke( : Kf := Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_1008_4_a_m();".
// 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_1008_4_a_m(:prec:=1)
    chi := MakeCharacter_1008_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_1008_4_a_m();".
// 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_1008_4_a_m( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_1008_a();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,4,sign)));
    Vf := Kernel([<5,R![-4, 1]>,<11,R![-62, 1]>],Snew);
    return Vf;
end function;