
// Make newform 525.4.a.e in Magma, downloaded from the LMFDB on 25 April 2024.
// To make the character of type GrpDrchElt, type "MakeCharacter_525_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_525_4_a_e();".
// 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_525_4_a_e();".
// 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_525_a();"
function MakeCharacter_525_a()
    N := 525;
    order := 1;
    char_gens := [176, 127, 451];
    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_525_a_Hecke(Kf)
    return MakeCharacter_525_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 := 4;
    raw_aps := [[0], [3], [0], [-7], [42], [-20], [-66], [38], [-12], [-258], [146], [-434], [-282], [-20], [72], [-336], [-360], [-682], [-812], [810], [124], [1136], [-156], [-1038], [-1208], [546], [520], [-1212], [-1078], [1452], [1312], [-1356], [984], [-394], [-1014], [-1996], [2392], [-2036], [3936], [-378], [-222], [-2590], [2214], [-4178], [3060], [2666], [-1348], [-3188], [3396], [5294], [-852], [4866], [-2050], [-1152], [6450], [-1968], [-3894], [7094], [3310], [7158], [5164], [8598], [448], [-5832], [-9848], [5616], [452], [2302], [-1584], [8174], [-8610], [-2154], [-6644], [-7958], [3440], [-12936], [-14862], [-10460], [-9150], [-4894], [-1668], [-12418], [15186], [5704], [-17206], [-3456], [16074], [-7526], [-2274], [10024], [2460], [19320], [12544], [-15510], [-14344], [21384], [-7134], [-19122], [15640], [2846], [4444], [-18552], [16452], [7722], [2576], [2464], [-1452], [-10698], [-8730], [1910], [5596], [-28586], [19236], [6734], [7184], [510], [20752], [-21072], [-2892], [750], [30062], [-15446], [25110], [-7968], [-14398], [-9234], [8030], [27060], [3724], [5668], [-16072], [8256], [-6352], [-11558], [7770], [22646], [35502], [17080], [-5730], [2550], [-27538], [-19242], [11752], [28692], [28442], [20172], [-19820], [10290], [-31606], [-23172], [15550], [28530], [28780], [-22872], [10708], [1326], [-13696], [42354], [-6644], [1350], [-49320], [-5940], [-47216], [12552], [-46908], [46128], [-12184], [5164], [24878], [-33402], [-45534], [14330], [10650], [-23762], [12350], [8502], [17660], [-17646], [3796], [-37438], [-10064], [-57048], [-34022], [67278], [57168], [-53022], [35422], [-61616], [50366], [59988], [71944], [23820], [-36160], [48870], [-30000], [-9162], [-51154], [-13142], [59874], [8544], [55998], [76826], [-9200], [-79234], [18936], [68334], [-2482], [45420], [-31218], [-3958], [11914], [58650], [-51536], [77364], [34092], [-72178], [-75800], [17970], [-78504], [-31668], [-76642], [-81358], [-9474], [14704], [62580], [-16270], [67122], [16806], [48688], [1746], [39706], [36542], [-110500], [88974], [-29288], [-39984], [-19582], [-97836], [-36750], [103716], [-15612], [-28474], [-60032], [32402], [-15774], [5076], [-47972], [107028], [79796], [-70596], [43270], [-28398], [-103068], [-66238], [17382], [88674], [10658], [-36164], [-79866], [-13376], [45520], [103416], [-19186], [-89264], [3294], [-32614], [19062], [-84066], [36052], [-6084], [-68830], [141964], [-57008], [80984], [-69464], [-29684], [-75324], [-64474], [-87190], [-26352], [6336], [16976], [-66216], [40250], [-59384], [-114906], [62386], [51096], [-96982], [-14814], [48390], [-21468], [50892], [-97212], [-94718], [-132210], [160526], [31362], [58920], [-87680], [118780], [-27996], [-12220], [-62736], [91568], [-94034], [-85812], [94358], [-39678], [81178], [-156816], [-83274], [-82638], [98332], [-102060], [94070], [-104316], [-8082], [-104744], [13146], [108218], [-39494], [55926], [41920], [24528], [-27970], [108560], [-136532], [-151524], [-48312], [-70], [-41652], [-179818], [-150972], [-92860], [-68004], [-62530], [-117678], [-8386], [67444], [-15518], [-152076], [-48702], [-106108], [-69156], [214974], [-59362], [13372], [-104964], [33654], [-26458], [-9758], [106062], [99088], [-4390], [-189666], [-137508], [-150252], [213612], [229128], [-124382], [172710], [86064], [15678], [-50456], [-177014], [61962], [-9200], [-83446], [117258], [101666], [69936], [110946], [201566], [-245594], [153252], [-22626], [16072], [-136506], [42604], [-63174], [-47364], [-73136], [-201408], [-196810], [30192], [78896], [-74684], [101860], [115320], [-1690], [-105246], [-56130], [-125768], [22338], [-220250], [252110], [61914], [235208], [35118], [4394], [-124188], [219328], [144186], [-226482], [-34090], [-120602], [-266118], [-115292], [59256], [277972], [5976], [45864], [-56068], [21526], [22074], [180690], [-231284], [73638], [-50952], [-255558], [-71876], [58416], [-43248], [172744], [198], [-101196], [-126126], [61274], [109788]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_525_a_Hecke(Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_525_4_a_e();".
// 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_525_4_a_e(:prec:=1)
    chi := MakeCharacter_525_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_525_4_a_e();".
// 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_525_4_a_e( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_525_a();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,4,sign)));
    Vf := Kernel([<2,R![0, 1]>,<11,R![-42, 1]>],Snew);
    return Vf;
end function;