
// Make newform 432.4.a.b in Magma, downloaded from the LMFDB on 12 September 2025.
// To make the character of type GrpDrchElt, type "MakeCharacter_432_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_432_4_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_432_4_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_432_a();"
function MakeCharacter_432_a()
    N := 432;
    order := 1;
    char_gens := [271, 325, 353];
    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_432_a_Hecke( : Kf := Kf)
    return MakeCharacter_432_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], [-12], [7], [60], [-79], [108], [-11], [-132], [-96], [-20], [-169], [-192], [-488], [204], [-360], [156], [83], [-47], [216], [-511], [529], [-1128], [-36], [605], [-1248], [-965], [1332], [-1942], [-516], [52], [48], [-2364], [-173], [1608], [997], [614], [-2693], [1164], [3648], [1800], [-547], [3156], [1127], [-1116], [3283], [295], [2644], [-6024], [-4462], [1008], [-5064], [6257], [-2160], [168], [-2424], [396], [-1811], [-3022], [3072], [8080], [4668], [-6752], [1812], [6203], [-10968], [-8165], [-6523], [6168], [-6001], [552], [-5004], [4291], [-2833], [5137], [5088], [-7980], [-1834], [1464], [-151], [-11508], [-6271], [9468], [3026], [-11180], [-840], [-12780], [-15658], [15564], [4183], [13932], [-2712], [9439], [-11724], [11968], [8892], [6756], [6228], [-11639], [17705], [-3485], [19116], [22368], [-8340], [14677], [-10069], [1572], [-1368], [-23712], [-11014], [6415], [15851], [-5772], [27781], [29869], [-3480], [7432], [-12960], [-23592], [32280], [22619], [-19861], [8292], [19728], [-27272], [21996], [2009], [26280], [-20900], [-17638], [-30080], [15708], [-20423], [-4399], [20652], [27407], [-5976], [-24131], [-912], [12888], [6856], [-636], [-39827], [38124], [18965], [27816], [-12337], [11352], [2527], [-26388], [6383], [-28908], [-36893], [-45528], [31201], [23856], [-23492], [15096], [-14965], [-19524], [11076], [44748], [-41519], [28404], [-43032], [18132], [44467], [19550], [-14011], [48732], [9528], [-15802], [43212], [-35107], [50299], [-50088], [21328], [50796], [-45479], [37478], [-34823], [744], [-574], [-46044], [-55248], [-38904], [-39283], [51847], [46901], [972], [56873], [-51240], [-53777], [29100], [-58140], [46500], [-48949], [44237], [25356], [-7848], [-21972], [56797], [-64771], [30053], [-13104], [28152], [-28955], [23628], [-80844], [56257], [43895], [-62796], [-73631], [65004], [47856], [-241], [18988], [-70980], [13896], [28968], [22709], [51604], [-55632], [12580], [-60684], [13187], [-14532], [-47412], [27547], [91068], [-106423], [28024], [-70220], [77604], [-67385], [66084], [16445], [64620], [-58056], [-6984], [12840], [99277], [-67115], [-13201], [-37812], [-72876], [-40079], [-46752], [4192], [21744], [-111814], [-110556], [28956], [2405], [-62412], [-23580], [-70603], [28672], [-26496], [14906], [-134633], [-120108], [26561], [-26845], [-30936], [-68528], [23292], [132312], [-50888], [114828], [30035], [66103], [-117178], [21121], [-63970], [-83189], [-52692], [5510], [-10582], [13200], [-80052], [-4124], [-16896], [55271], [-103673], [-109980], [-75967], [-32088], [-96257], [107892], [-136428], [-53712], [-84216], [-17664], [72038], [1248], [-143057], [-78540], [-36432], [140821], [-68821], [73440], [52540], [-82176], [44647], [108110], [-127020], [-48823], [116544], [-107233], [177612], [-35568], [133104], [17467], [-50076], [106598], [-160788], [32556], [58430], [70836], [3697], [-20653], [-174312], [-64100], [-72312], [-120211], [138616], [-102008], [18132], [-15156], [21521], [-190704], [72421], [38832], [-57296], [128664], [179255], [-191820], [14006], [-87212], [-67273], [3684], [-178680], [137761], [182640], [71028], [142130], [43792], [-86376], [58644], [-193115], [-36007], [68640], [106324], [143687], [64836], [-151512], [19152], [46320], [2184], [110171], [-200400], [164952], [48300], [-929], [-18961], [-54708], [-110873], [-175705], [113748], [143215], [-1824], [-58416], [-42473], [-144655], [1020], [127872], [-13705], [-27864], [-12499], [-22668], [152160], [8485], [38136], [190645], [71064], [-46388], [35381], [-193493], [-36780], [246782], [220800], [-100260], [65941], [97980], [106913], [-201035], [-103740], [71800], [147984], [-162682], [-133776], [-19676], [-158016], [-59256], [62476], [228053], [47928], [-21917], [-132636], [-98062], [-79800], [-7668], [99979], [-77263], [-165636], [180108], [264157], [196128], [212088], [-129084], [159518], [-301764], [-50640], [-12742], [-158016], [126924], [125496], [-22520], [264624]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_432_a_Hecke( : Kf := Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_432_4_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_432_4_a_b(:prec:=1)
    chi := MakeCharacter_432_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_432_4_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_432_4_a_b( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_432_a();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,4,sign)));
    Vf := Kernel([<5,R![12, 1]>,<7,R![-7, 1]>],Snew);
    return Vf;
end function;