
// Make newform 448.6.a.b in Magma, downloaded from the LMFDB on 19 April 2024.
// To make the character of type GrpDrchElt, type "MakeCharacter_448_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_448_6_a_b();".
// 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_448_6_a_b();".
// 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_448_a();"
function MakeCharacter_448_a()
    N := 448;
    order := 1;
    char_gens := [127, 197, 129];
    v := [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_448_a_Hecke(Kf)
    return MakeCharacter_448_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 := [[0], [-26], [-16], [-49], [-8], [-684], [-2218], [2698], [3344], [3254], [4788], [11470], [13350], [928], [1212], [-13110], [-34702], [1032], [-10108], [62720], [-18926], [11400], [-88958], [19722], [17062], [-45904], [-136012], [69156], [146414], [-80186], [274800], [-180742], [-209678], [-17242], [-59358], [-336344], [-464588], [-314792], [285724], [709148], [617148], [-237828], [-133512], [270446], [-875102], [-347620], [425380], [481592], [6042], [-1804], [-1611526], [-987096], [893510], [-365946], [1404594], [1099680], [-814948], [-1699056], [1365082], [-715846], [-217726], [-1507080], [-12502], [-647432], [-935978], [-705942], [1143040], [-2364018], [-726240], [-136180], [-1169070], [-4280], [2447960], [904514], [4230344], [4553996], [3985406], [-552420], [38190], [-3924754], [-598386], [-4615974], [-61560], [-3797266], [-2288520], [4759756], [-4367150], [5449942], [-1669660], [70768], [-5660830], [-1449484], [4075040], [-986100], [-5983420], [-3493728], [-2157108], [-6658170], [-5952230], [6396810], [5518512], [-2021590], [-8146778], [-11982426], [-1395816], [1967842], [3188974], [1675002], [-10063464], [1727978], [-16952256], [-10194162], [15745190], [332690], [3597200], [-14638930], [13838614], [-14035812], [-16106274], [-4800752], [17656472], [6592250], [-9771780], [18866316], [-8670182], [-7934818], [-26260034], [22076292], [8492452], [19071288], [14683224], [16426488], [-24435672], [295566], [-473842], [23324062], [-15558280], [-6668430], [12246108], [-29149466], [-7588486], [5988490], [817960], [-2519628], [16100600], [-25816732], [15427012], [3605166], [-4069946], [7251112], [-2374138], [30355818], [-1533380], [-29237868], [-44822748], [-36290640], [32535016], [-44667594], [15668018], [20117480], [8845184], [-31436374], [-9521584], [-10652046], [27293082], [10476372], [1882304], [-27151832], [28313534], [-37557708], [-8247364], [19139156], [33968352], [16795482], [13436724], [-49757966], [6699780], [-54502034], [63130160], [7594696], [5885016], [37868710], [36010790], [-57650198], [31566544], [-62466516], [48629970], [78856186], [41889234], [55214364], [51729346], [-8199684], [-39775588], [-16127948], [-68494020], [-54832366], [28110734], [19483094], [46202490], [-50455272], [-61496046], [-33181332], [-89769224], [35479290], [109217130], [-85195272], [1894556], [-105895512], [-90812322], [-109259810], [-70637218], [-81092608], [-109068504], [-80372926], [41706168], [63627518], [42574288], [-45093346], [51626648], [13244878], [-45886618], [98569192], [-52526766], [8959816], [835818], [-62179850], [-123528358], [-34698104], [-18300864], [-126005784], [131155902], [-76339378], [24024208], [29507994], [-31439510], [-75019008], [56885974], [82711986], [102977388], [71666176], [-39746720], [-64193126], [66709760], [157539474], [-93755254], [-13391940], [-71098224], [-9919862], [-64640432], [-71845488], [-146468758], [131440578], [-173952432], [-52676246], [-203320040], [-124507988], [-82476026], [-15871122], [-110577808], [-9804418], [-166879304], [-108204904], [-131935504], [191221784], [103238694], [89461310], [128191290], [151999498], [-37160140], [-159475050], [28043772], [-126332096], [-69790398], [39449024], [141656818], [-164108016], [-101497184], [245076858], [-111098018], [177746226], [55243608], [-153318168], [-141261852], [241036552], [54307722], [-45373744], [-242298366], [-214832126], [110333252], [133578930], [-198446526], [-18151182], [-244652778], [173768570], [21723442], [133784700], [-295859488], [-226379796], [-233021130], [82398486], [-58568882], [74863998], [219051424], [-169813032], [-277564880], [-140559910], [83872688], [199832080], [-154324336], [72782122], [243901320], [197827886], [160186378], [-165761240], [-43216640], [-108336214], [267080070], [-52225376], [101058650], [-275747550], [221708542], [59958418], [224796312], [365597848], [50754262], [-263866642], [-323011856], [36026666], [-64175248], [-194262266], [-353805446], [-59774018], [-163761684], [221920894], [227222516], [123792458], [-218473362], [262399762], [-331560166], [-125789348], [-275591390], [-116546442], [-107046660], [-219454560], [474783246], [-155433984], [421492732], [359510728], [132925368], [28411176], [-161745098], [-204137254], [-192316110], [203857356], [175672898], [146877410], [487988020], [-383359998], [186957650], [407099648], [-64814830], [439269170], [-45305840], [-518046476], [-182781142], [478424534], [38150076], [486313152], [-17575418], [540015340], [421153814], [601499376], [5258162], [-250163288], [-283729462], [-263215398], [502824056], [-342843110], [-115122586], [134777678], [186346572], [-230774426], [557612104], [411215250], [298995926], [631618216], [-4699384], [-699034576], [601318796], [-141497284], [-361812226], [204929952], [106650004], [373603198], [-595628552], [-609875070], [206202820], [287858774], [315839604], [277913038], [473197432], [582831474], [-77837072], [91559278], [-186404364], [-35778316], [460968050], [15804798], [-74968514], [379741702], [650219482], [130092838], [-400980488], [-174408012], [-281638102], [648099652], [-347516536], [541709380], [52922790], [504380800], [424147678], [-162311048], [-398132176], [15933150], [224656646], [-94198960], [-658619680], [-349168950], [302885790], [290360396]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_448_a_Hecke(Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_448_6_a_b();".
// 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_448_6_a_b(:prec:=1)
    chi := MakeCharacter_448_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_448_6_a_b();".
// 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_448_6_a_b( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_448_a();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,6,sign)));
    Vf := Kernel([<3,R![26, 1]>,<5,R![16, 1]>],Snew);
    return Vf;
end function;