
// Make newform 1764.4.k.k in Magma, downloaded from the LMFDB on 19 March 2026.
// To make the character of type GrpDrchElt, type "MakeCharacter_1764_k();"
// To make the character of type GrpDrchElt with Codomain the HeckeField, type "MakeCharacter_1764_k_Hecke();"
// To make the coeffs of the qexp of the newform in the Hecke field type "qexpCoeffs();"
// To make the newform (type ModFrm), type "MakeNewformModFrm_1764_4_k_k();".
// 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_1764_4_k_k();".
// 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 := [1, -1, 1];
        Kf := NumberField(Polynomial([elt : elt in poly]));
        AssignNames(~Kf, ["nu"]);
    end if;
    Rfbasis := [Kf.1^i : i in [0..Degree(Kf)-1]];
    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_1764_k();"
function MakeCharacter_1764_k()
    N := 1764;
    order := 3;
    char_gens := [883, 785, 1081];
    v := [3, 3, 2];
    // 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;

// To make the character of type GrpDrchElt with Codomain the HeckeField, type "MakeCharacter_1764_k_Hecke();"
function MakeCharacter_1764_k_Hecke( : Kf := false)
    N := 1764;
    order := 3;
    char_gens := [883, 785, 1081];
    char_values := [[1, 0], [1, 0], [0, -1]];
    assert UnitGenerators(DirichletGroup(N)) eq char_gens;
    values := ConvertToHeckeField(char_values : pass_field := ISA(Type(Kf), Fld), Kf := Kf); // the value of chi on the gens as elements in the Hecke field
    F := Universe(values);// the Hecke field
    chi := DirichletCharacterFromValuesOnUnitGenerators(DirichletGroup(N,F),values);
    return chi;
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], [0, 0], [0, 6], [0, 0], [-12, 12], [-82, 0], [-30, 30], [0, -68], [0, 216], [-246, 0], [112, -112], [0, -110], [246, 0], [-172, 0], [0, 192], [558, -558], [540, -540], [0, -110], [-140, 140], [840, 0], [550, -550], [0, 208], [-516, 0], [0, -1398], [1586, 0], [-1242, 1242], [0, -680], [0, 996], [-1382, 1382], [750, 0], [176, 0], [0, -1548], [378, -378], [-2500, 0], [0, 846], [2536, -2536], [1186, -1186], [0, -2108], [1944, 0], [0, -1362], [1596, -1596], [-1690, 0], [0, 3552], [2686, -2686], [1410, 0], [2968, -2968], [-1348, 0], [3872, 0], [5364, -5364], [0, 874], [0, 378], [-1920, 0], [-4322, 4322], [-5292, 0], [0, -5118], [3768, -3768], [3918, -3918], [0, -4880], [3538, -3538], [5430, 0], [6436, -6436], [-1350, 0], [3332, 0], [-4728, 4728], [0, -5114], [0, 7206], [0, -6260], [-5326, 0], [36, -36], [3134, 0], [1218, -1218], [0, -10008], [1072, -1072], [0, 274], [7652, 0], [0, 2160], [-1074, 1074], [0, -6926], [0, 1938], [9574, -9574], [5052, 0], [3422, 0], [2208, -2208], [-6814, 0], [0, -12584], [0, 6996], [-9474, 0], [0, -5786], [-3438, 0], [9392, 0], [0, -4956], [-20592, 20592], [13432, -13432], [14172, 0], [0, 5956], [-16968, 0], [0, 5214], [-1398, 1398], [0, 18580], [0, 18970], [-16036, 0], [8310, -8310], [7092, -7092], [0, -7158], [-6500, 6500], [-21794, 21794], [-9756, 0], [0, 5586], [-24, 24], [4298, 0], [0, -8480], [1906, -1906], [-7482, 0], [7348, -7348], [4520, 0], [-19806, 19806], [-5020, 0], [28392, -28392], [0, -17562], [-4716, 0], [22762, -22762], [4802, 0], [0, 21558], [3780, -3780], [0, 5500], [-10230, 0], [0, -10190], [0, 9408], [-33064, 0], [0, 6322], [20740, -20740], [-32040, 0], [0, 12832], [-19906, 0], [0, 10842], [28274, 0], [-32346, 32346], [-30116, 30116], [6594, 0], [-43014, 43014], [-14164, 0], [0, 34830], [-31016, 31016], [-9876, 0], [3154, -3154], [-36936, 0], [9638, 0], [10266, -10266], [0, 4084], [0, -192], [0, -19910], [-14802, 0], [-32548, 0], [0, 1464], [49564, -49564], [-8448, 0], [0, -14600], [0, -21102], [-20806, 0], [24510, -24510], [0, -44148], [-27114, 0], [-10264, 0], [0, 51468], [-23790, 23790], [26424, -26424], [-39488, 39488], [-30854, 30854], [-19246, 0], [0, 43782], [62676, -62676], [42302, 0], [0, -19272], [52198, -52198], [38080, -38080], [62742, 0], [22964, 0], [-25650, 25650], [-48904, 0], [0, 21250], [0, 37168], [1500, 0], [11630, 0], [0, -5766], [-5568, 5568], [-42042, 42042], [1114, -1114], [62476, -62476], [0, -39194], [-16944, 16944], [0, -38498], [15516, 0], [0, -34940], [0, -13218], [-17556, 17556], [-7782, 7782], [-12434, 12434], [0, -25238], [35838, 0], [0, -83496], [-43338, 43338], [-53632, 0], [0, -27542], [2590, -2590], [15924, 0], [-3474, 3474], [0, -48080], [0, -61956], [8742, 0], [53764, -53764], [0, 26926], [61770, 0], [-27880, 0], [0, 17820], [42168, -42168], [0, -14954], [-47504, 47504], [68706, -68706], [0, 50664], [75498, 0], [0, 80146], [63272, 0], [0, 39810], [0, -55712], [-66756, 0], [63614, 0], [0, 78282], [42000, -42000], [0, 45160], [0, -64812], [10618, -10618], [-103412, 103412], [-83008, 0], [104730, -104730], [-34612, 0], [61392, -61392], [0, 83614], [0, 70350], [-14004, 0], [1800, 0], [-28884, 28884], [0, -114812], [32392, -32392], [0, -7094], [-90354, 0], [0, -62376], [-5536, 0], [12948, -12948], [38284, -38284], [88656, 0], [112646, 0], [0, -60702], [49176, -49176], [-85414, 0], [19614, -19614], [0, 60828], [122242, -122242], [60916, -60916], [36762, 0], [0, 63430], [-23792, 23792], [3588, 0], [48442, -48442], [34382, 0], [-107406, 107406], [0, -80420], [16362, 0], [108822, 0], [49556, 0], [-55314, 55314], [0, -11918], [104884, -104884], [18454, -18454], [0, -39056], [13970, 0], [0, 65176], [0, -15324], [-88358, 88358], [0, -150362], [0, -31164], [88032, -88032], [328, -328], [18504, 0], [12902, 0], [0, 118132], [0, -112320], [106894, -106894], [101586, 0], [37480, -37480], [-65154, 0], [72726, -72726], [-140700, 140700], [0, -122454], [-31692, 0], [-39850, 0], [110334, -110334], [0, -27584], [45786, 0], [0, 80364], [63044, 0], [0, -30314], [0, -100026], [-2864, 2864]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_1764_k_Hecke( : Kf := Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_1764_4_k_k();".
// 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_1764_4_k_k(:prec:=2)
    chi := MakeCharacter_1764_k();
    f_vec := qexpCoeffs();
    Kf := Universe(f_vec);
    // SetVerbose("ModularForms", true);
    // SetVerbose("ModularSymbols", true);
    S := CuspidalSubspace(ModularForms(chi, 4));
    S := BaseChange(S, Kf);
    maxprec := NextPrime(1999) - 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_1764_4_k_k();".
// 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_1764_4_k_k( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_1764_k();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,4,sign)));
    Vf := Kernel([<5,R![36, -6, 1]>,<11,R![144, 12, 1]>,<13,R![82, 1]>],Snew);
    return Vf;
end function;