
// Make newform 1078.6.a.a in Magma, downloaded from the LMFDB on 19 April 2024.
// To make the character of type GrpDrchElt, type "MakeCharacter_1078_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_1078_6_a_a();".
// 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_1078_6_a_a();".
// 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_1078_a();"
function MakeCharacter_1078_a()
    N := 1078;
    order := 1;
    char_gens := [199, 981];
    v := [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_1078_a_Hecke(Kf)
    return MakeCharacter_1078_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+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 := 6;
    raw_aps := [[-4], [-1], [51], [0], [-121], [-692], [738], [-1424], [-1779], [-2064], [-6245], [-14785], [-5304], [17798], [17184], [-30726], [34989], [45940], [25343], [13311], [53260], [77234], [-55014], [-125415], [88807], [-1482], [117496], [-79362], [87842], [-47247], [-239416], [98142], [400137], [-205766], [87726], [-432778], [34075], [45020], [-482556], [766254], [303399], [285181], [767067], [411668], [-759258], [46600], [-932428], [-169745], [-198078], [849997], [-401832], [855174], [-1125464], [1197513], [-37758], [-631254], [1080342], [816100], [1688198], [-879042], [-1540268], [-720840], [1039048], [1251348], [1443361], [-2012079], [2017337], [264122], [-1710492], [-218822], [-3681915], [1885284], [3116659], [1394414], [-4260355], [-201765], [1948821], [1468258], [2246178], [3614878], [3812388], [1973462], [-2083590], [72691], [-594392], [4566507], [-5443821], [6703124], [1259940], [-5023081], [2356605], [6722580], [1960013], [-579624], [1369052], [-1833426], [1712661], [789435], [-627392], [3208952], [3426584], [10519830], [-5472876], [-11778672], [-8356276], [13775839], [12709308], [-1008252], [10510032], [199390], [-16190], [-11525344], [16997394], [18487471], [-4542811], [18428631], [-9666035], [4514301], [-5372349], [9879558], [-10805201], [11327486], [12059490], [-5141664], [-13124255], [3659562], [10225211], [-24168285], [-16824641], [5041684], [-6263746], [3639756], [-18736957], [489242], [-14696940], [-24207236], [-13526010], [-14209424], [7933335], [-10468512], [-11914742], [-1861122], [23015285], [-16835148], [23529859], [-29154921], [9490522], [1815528], [10781209], [-28335456], [-26891884], [19213227], [11593100], [-13185678], [2981948], [29657868], [31805678], [23344446], [-20737208], [-26919282], [10189563], [10392354], [-8188768], [17327439], [-438963], [27912387], [-42684640], [22104418], [46840214], [-4000323], [-24429414], [-20516822], [41730240], [-17447872], [6909769], [30162111], [3561854], [14762943], [27333484], [56891380], [-71744368], [-27058938], [11792537], [3886650], [65021223], [41519262], [-3887872], [12266968], [-58252654], [-38482758], [16395127], [52163934], [-42674893], [36398226], [-59098068], [-6177099], [-46748350], [28561019], [1819578], [-95883210], [86519820], [-20445818], [-19571858], [50258488], [-94130505], [50363523], [-57234683], [21525636], [-74632656], [-50284088], [73451360], [-24779055], [-7490947], [103208844], [-73816518], [110776657], [36047420], [60922164], [1905264], [43631067], [28361708], [115668316], [90489225], [74295335], [110184756], [-33801790], [102809514], [39099816], [57888508], [-109220340], [-115614235], [-101330372], [-47134270], [118483824], [147515737], [79509954], [31402855], [-60066468], [-134217447], [-94187007], [-91196463], [-126560432], [-145126700], [67153637], [-61738680], [101243460], [-43954220], [178737972], [-147785266], [37833750], [-56628640], [15439806], [31400931], [-15247094], [-151084482], [41073876], [-150717994], [-105485234], [-88531677], [77171506], [83178716], [60193680], [-2129498], [197062414], [156568938], [-188167928], [-93028617], [28170723], [155817854], [35681538], [56194651], [-181878127], [-56592770], [169997912], [-216231848], [-191561681], [-55829823], [-210858430], [237811412], [-115463652], [278598696], [-58940137], [74955756], [236591770], [-283064084], [113251671], [172704314], [-128554566], [17739481], [127223658], [-163172415], [86875308], [-128385924], [-124309506], [65554574], [251506536], [-222790451], [44406309], [109609470], [-218416982], [-279244574], [-30061368], [-94991164], [-148772436], [101502413], [118137791], [-245996535], [-104649569], [-170653380], [155780372], [-48674616], [204216678], [303450270], [42282863], [-248734512], [-91897526], [73205859], [-141780642], [295695094], [-175915212], [-10270580], [9619793], [-191900430], [373726991], [211694838], [-34548563], [91896077], [-178143737], [-370075872], [205863156], [34975166], [-165672690], [399285202], [461136936], [-66358528], [64202517], [-311897707], [457268028], [123114817], [-245596034], [-268428199], [127213287], [-388431804], [182902577], [48206751], [-28498986], [487573657], [414395573], [-210646464], [243365661], [-317805020], [-66566437], [274941822], [-147489188], [93211766], [61180794], [-528163887], [-13765554], [-41479062], [194490123], [218356070], [50613366], [428661873], [-490554174], [244349323], [-218873011], [-82632768], [-245849974], [-560740696], [196314135], [-207530336], [101087382], [248003484], [6535414], [-69862471], [194268660], [-268713342], [167048818], [-316466514], [-284704898], [-59509878], [-517196481], [17947154], [166800822], [17925112], [580326795], [696606800], [-183687965], [-398912560], [-270847245], [148496189], [26160861], [358507647], [456789127], [-743353851], [647422136], [595897666], [192700002], [-242716060], [-48998418], [309247030], [341444169], [386814464], [353784138], [227824596], [548586466], [-132981034], [-509200860], [-125255492], [185884959], [244673302], [88962090], [457572924], [54144158], [57922190], [505240155], [264008664], [128626051], [184923738], [77067726], [484650771], [729847384], [433189968], [411526446], [116153206], [884767713], [880540809], [-253775610], [375178147], [427294992]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_1078_a_Hecke(Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_1078_6_a_a();".
// 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_1078_6_a_a(:prec:=1)
    chi := MakeCharacter_1078_a();
    f_vec := qexpCoeffs();
    Kf := Universe(f_vec);
    // SetVerbose("ModularForms", true);
    // SetVerbose("ModularSymbols", true);
    S := CuspidalSubspace(ModularForms(chi, 6));
    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_1078_6_a_a();".
// 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_1078_6_a_a( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_1078_a();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,6,sign)));
    Vf := Kernel([<3,R![1, 1]>],Snew);
    return Vf;
end function;