
// Make newform 400.6.a.s in Magma, downloaded from the LMFDB on 08 December 2025.
// To make the character of type GrpDrchElt, type "MakeCharacter_400_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_400_6_a_s();".
// 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_400_6_a_s();".
// 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 := [-31, 0, 1];
        Kf := NumberField(Polynomial([elt : elt in poly]));
        AssignNames(~Kf, ["nu"]);
    end if;
    Rf_num := [[1, 0], [0, 2]];
    Rf_basisdens := [1, 1];
    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_400_a();"
function MakeCharacter_400_a()
    N := 400;
    order := 1;
    char_gens := [351, 101, 177];
    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_400_a_Hecke( : Kf := Kf)
    return MakeCharacter_400_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 := 6;
    raw_aps := [[0, 0], [0, 1], [0, 0], [0, -11], [100, 0], [0, 66], [0, -88], [2244, 0], [0, 307], [-7854, 0], [2144, 0], [0, -934], [-7414, 0], [0, -1595], [0, -847], [0, -2178], [-25972, 0], [-3058, 0], [0, 5279], [-37608, 0], [0, 2156], [-79728, 0], [0, -1463], [-826, 0], [0, 3376], [-143594, 0], [0, 10043], [0, 8283], [-106238, 0], [0, 10152], [0, -4631], [89100, 0], [0, 3444], [134684, 0], [-248006, 0], [-313720, 0], [0, 22054], [0, -35695], [0, 17061], [0, 7282], [-142108, 0], [250790, 0], [209472, 0], [0, -32032], [0, -7766], [-749208, 0], [-287364, 0], [0, -106745], [0, -87857], [506474, 0], [0, 139612], [374704, 0], [843634, 0], [1720500, 0], [0, 139392], [0, 36619], [-1827102, 0], [616880, 0], [0, 164978], [-1220934, 0], [0, 61853], [0, -76890], [0, 98439], [2124648, 0], [0, -26476], [0, -227338], [1170212, 0], [0, 167816], [0, -146685], [2006290, 0], [0, -162416], [-4506744, 0], [0, -271919], [0, 104478], [-832052, 0], [0, 257687], [-311926, 0], [0, -265474], [2770, 0], [1979846, 0], [5101204, 0], [-2432234, 0], [-918896, 0], [0, -184504], [676632, 0], [0, -227283], [-5176194, 0], [0, -279532], [-2649570, 0], [0, -232737], [0, 594615], [-6893216, 0], [0, 507717], [-5883900, 0], [6720804, 0], [0, -42141], [-294414, 0], [-7100246, 0], [0, 535733], [-2723666, 0], [0, -828113], [0, -307890], [0, 518969], [-3892570, 0], [5062772, 0], [0, -296416], [0, -464277], [0, 1423224], [-16614600, 0], [7882490, 0], [0, -70279], [0, -216634], [0, 867812], [18003580, 0], [4800808, 0], [14495042, 0], [0, 1638273], [0, 866229], [0, -1731454], [-9705916, 0], [-4283962, 0], [0, -1172688], [0, -756646], [0, -1473659], [11213852, 0], [20470670, 0], [-81654, 0], [8610064, 0], [0, 1056813], [0, -353606], [23060180, 0], [0, 155067], [2580304, 0], [0, 517154], [14049882, 0], [-5598978, 0], [0, 569910], [0, 1559767], [0, 724646], [19455414, 0], [2852036, 0], [-5484314, 0], [0, -590589], [0, 376915], [27888882, 0], [-12775192, 0], [0, 482350], [0, -1451076], [-33464276, 0], [0, 2261127], [0, 2212078], [-11056398, 0], [0, -3364647], [0, -2661219], [0, 174603], [-12806352, 0], [35840376, 0], [-8477922, 0], [0, 1441924], [-42467458, 0], [0, 2504391], [0, -4291628], [0, 4055381], [27090084, 0], [0, -3903096], [0, 589139], [-17294176, 0], [0, 2012538], [-7587250, 0], [0, 4116894], [-1986996, 0], [-13437426, 0], [28596568, 0], [0, -4927604], [38278736, 0], [-34385658, 0], [-66204908, 0], [-9921066, 0], [0, -102245], [-47567806, 0], [0, 1365001], [-14199988, 0], [0, 988054], [0, 1584660], [0, -5740129], [-35465670, 0], [0, -590458], [0, 928433], [67349942, 0], [34018688, 0], [0, -4268736], [0, 2939893], [-20917060, 0], [-76115730, 0], [0, -3444177], [0, -7531908], [23966514, 0], [0, 4038858], [0, -279840], [0, 2459435], [-11399454, 0], [-3531792, 0], [0, -73326], [-38830946, 0], [-61133060, 0], [0, 7804182], [82457088, 0], [0, -8289215], [-31424426, 0], [45873764, 0], [0, -8487512], [-1385658, 0], [0, -3202957], [0, -3469917], [63846728, 0], [21204490, 0], [0, -2152975], [-113997422, 0], [0, -6928339], [0, -3912646], [47900886, 0], [5610968, 0], [-75379842, 0], [0, 4422527], [0, 6772887], [-16034502, 0], [0, 7001060], [10791200, 0], [0, -11845339], [96640324, 0], [0, 1098802], [74787812, 0], [-88772288, 0], [153879594, 0], [0, 5700949], [0, 6183265], [168782382, 0], [0, 5367406], [-115097940, 0], [-66506760, 0], [0, -594087], [7585204, 0], [0, 9916555], [-23708510, 0], [0, 4747160], [-81607944, 0], [0, -2295975], [38780652, 0], [-80996036, 0], [0, 3975631], [0, -3347850], [-85262782, 0], [0, 10661333], [-114602666, 0], [0, 7196002], [-34471932, 0], [151546822, 0], [0, 9013763], [0, 5396986], [0, -8175860], [0, 3725271], [0, -12946241], [125281354, 0], [0, 9679450], [0, 20252496], [147287956, 0], [-76658814, 0], [184375322, 0], [0, -9869651], [0, -812394], [-184561378, 0], [0, -6208201], [0, 20549188], [-32147104, 0], [0, -12989416], [0, -14558941], [0, -12286669], [-158602510, 0], [-191917462, 0], [-12893892, 0], [0, -612249], [-196746056, 0], [0, -21088771], [10808182, 0], [0, 9532523], [-232686224, 0], [0, -15225672], [0, 24678610], [224728120, 0], [96365918, 0], [-213505282, 0], [0, -793881], [0, -27572556], [-268313628, 0], [0, 12607298], [-58233582, 0], [12598752, 0], [0, 11917566], [257218060, 0], [0, 23491743], [0, -11940500], [0, -9325602], [-224617712, 0], [0, -4195191], [83897428, 0], [0, 19754096], [0, -22163173], [171425090, 0], [-178491304, 0], [0, -19297674], [0, -981057], [341310330, 0], [-128980830, 0], [0, -2968239], [0, -5191835], [-73359946, 0], [224494436, 0], [-29964352, 0], [0, -29663392], [30319278, 0], [148745212, 0], [0, 2486716], [-213371730, 0], [0, 34740487], [0, 15952860], [-168339214, 0], [346738932, 0], [0, -15208995], [0, -3198503], [0, 35124518], [-69728450, 0], [0, 10087286], [92847040, 0], [0, 11166881], [-51438684, 0], [0, 32876163], [-115131950, 0], [0, -19026480], [463935946, 0], [0, -39529391], [0, -32257314], [0, 13009996], [-167869174, 0], [200289880, 0], [0, -35344486], [384329748, 0], [266081430, 0], [0, 17556923], [-15380464, 0], [0, -18316926], [-307097780, 0], [0, 5215572], [33966942, 0], [0, -15024801], [475126586, 0], [0, -9668604], [-312471072, 0], [404743812, 0], [0, 10149656], [0, -2942237], [0, -50509558], [172541226, 0], [0, -14295423], [-242004884, 0], [0, 23577135], [0, 27576572], [0, 47845710], [0, 52889067], [-50584710, 0], [363529772, 0], [-52705028, 0], [0, -49653329], [64492890, 0], [-308059224, 0], [0, -14001450], [417280708, 0], [42060128, 0], [0, 31943472], [-405921714, 0], [0, -29664404], [-508329138, 0], [0, 11990956], [0, -2712787], [0, -37356176], [-620828076, 0], [0, 36506427], [239440848, 0], [0, 26673250], [0, 22479501], [0, 46888489], [-445126210, 0], [0, -34299594], [135262236, 0], [0, -28678825], [-227662456, 0], [0, -60728668], [664551712, 0], [214758454, 0], [-316069052, 0], [72033126, 0], [-291947150, 0], [0, 14177120], [0, -13279519], [0, 34379004], [284946090, 0], [26354680, 0], [0, 19866990], [-443963982, 0], [0, 6408281], [-84256140, 0], [0, -26469608], [0, -72203406], [0, -27870051], [-690566932, 0], [0, -57280828], [322460414, 0], [-12537536, 0], [0, -10826091], [0, 17564360], [0, -65846253], [578617170, 0], [0, 54444346], [0, 4626193], [434728140, 0], [0, 34288012], [0, -65109186], [0, 45928169], [-129856826, 0], [-764150892, 0], [240563224, 0]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_400_a_Hecke( : Kf := Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_400_6_a_s();".
// 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_400_6_a_s(:prec:=2)
    chi := MakeCharacter_400_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_400_6_a_s();".
// 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_400_6_a_s( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_400_a();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,6,sign)));
    Vf := Kernel([<3,R![-124, 0, 1]>],Snew);
    return Vf;
end function;