QEtaModularCategory

qetamod.spad line 162 [edit on github]

QEtaModularCategory provides functions to check modularity conditions.

candidateLevelsCoEtaQuotient: (QEtaSpecification, PositiveInteger, NonNegativeInteger) -> List PositiveInteger

candidateLevelsCoEtaQuotient(rspec,m,t) returns an ascendingly sorted list of the nn up to 24*m*level(rspec) such that conditionCoEtaQuotient?(nn,rspec,m,t) is true.

conditionCoEtaQuotient?: (PositiveInteger, QEtaSpecification, PositiveInteger, NonNegativeInteger) -> Boolean

conditionCoEtaQuotient?(nn,rspec,m,t) returns true iff a cofactor eta-quotient can be found such that the product of the cofactor with the orbit product corresponding to the dissection (m,t) gives a modular function in level nn.

cuspMatrices: PositiveInteger -> List Matrix Integer

cuspMatrices(nn) returns [cuspToMatrix(nn,c) for c in cusps(nn)].

cusps: PositiveInteger -> List Cusp

cusps(nn) returns representatives for all the (inequivalent) cusps for the congruence subgroup that the respective package represents. They are sorted by their size as rational numbers with infinity being the biggest cusp. Note that cusps()=[cusp(x(1,1),x(2,1)) for x in doubleCosetRepresentatives()] where doupleCosetRepresentatives() is from the respective congruence subgroup that is connected to the package.

cuspToMatrix: (PositiveInteger, Cusp) -> Matrix Integer

For cusp=(a:c), cuspToMatrix(nn,cusp) returns a matrix gamma=[[a,b],[c,d]] corresponding to the cusp (a:c) of this domain. We assume that a/c is a normalized cusp, i.e. cusp=normalizeCusp(cusp).

etaCofactorSpace: (PositiveInteger, List List Integer, QEtaSpecification, PositiveInteger, NonNegativeInteger) -> Record(level: PositiveInteger, indices: List List Integer, particular: Union(Vector Integer, failed), basis: List Vector Integer)

etaCofactorSpace(nn,idxs,rspec,m,t) returns a vector v and the basis of a space such that #v=#idxs and modular?(nn,members(s),rspec,m,t) is true for any s = v + reduce(_+, [z.i * basis.i for i in 1..#basis]) and any sufficiently long list z of integers. The function fails, if there is no such solution. The indices part of the result is equal to idxs and corresponds to the entries of the solution vectors.

etaCofactorSpaceSystem: (PositiveInteger, List List Integer, QEtaSpecification, PositiveInteger, NonNegativeInteger) -> Record(qmat: Matrix Fraction Integer, zrels: Vector Integer, qrhs: Vector Fraction Integer, qsgn: List Integer)

etaCofactorSpaceSystem(nn,idxs,rspec,m,t) returns a matrix mat and a vector v such that for the integer solutions s of the equation mat*s=v it holds modular?(sspec,rspec,m,t) where sspec results from the list of the first #idxs entries of s. With idxs one can specify what indexes should be allowed in the solution space.

etaQuotientMonoidInfinitySystem: (PositiveInteger, List List Integer) -> Record(qmat: Matrix Fraction Integer, zrels: Vector Integer, qrhs: Vector Fraction Integer, qsgn: List Integer)

etaQuotientMonoidInfinitySystem(nn,idxs) returns etaQuotientMonoidSystem(nn,idxs,[infinity()$Cusp]).

etaQuotientMonoidNoPolesSystem: (PositiveInteger, List List Integer, List Cusp) -> Record(qmat: Matrix Fraction Integer, zrels: Vector Integer, qrhs: Vector Fraction Integer, qsgn: List Integer)

etaQuotientMonoidNoPolesSystem(nn,idxs,nopolesat) returns etaQuotientMonoid(nn,idxs,[],nopolesat).

etaQuotientMonoidSystem: (PositiveInteger, List List Integer, List Cusp) -> Record(qmat: Matrix Fraction Integer, zrels: Vector Integer, qrhs: Vector Fraction Integer, qsgn: List Integer)

etaQuotientMonoidSystem(nn,idxs,polesat) returns etaQuotientMonoidNoPolesSystem(nn,idxs,nopolesat) = etaQuotientMonoidSystem(nn,idxs,[],nopolesat) for nopolesat := [c for c in cusps nn | not member?(c, polesat)].

etaQuotientMonoidSystem: (PositiveInteger, List List Integer, List Cusp, List Cusp) -> Record(qmat: Matrix Fraction Integer, zrels: Vector Integer, qrhs: Vector Fraction Integer, qsgn: List Integer)

etaQuotientMonoidSystem(nn,idxs,polesat,nopolesat) returns a record that can be given to zsolve$X4ti2 in order to find the generators of the monoid of (generalized) eta-quotients that are modular wrt. QMOD and have no poles at the cusps given by nopolesat. Furthermore, setup the system in such a way that at all cusps in polesat the expansion order of a solution of the system will be non-positive. The indices of the eta-functions that may appear is given by idxs. Note that the union of poleat and nopolesat can be a subset of all cusps given by cusps(nn).

etaQuotientMonoidSystem: (PositiveInteger, List List Integer, List Cusp, List Integer, List Integer, List Cusp) -> Record(qmat: Matrix Fraction Integer, zrels: Vector Integer, qrhs: Vector Fraction Integer, qsgn: List Integer)

etaQuotientMonoidSystem(nn,idxs,polesat,rels,ords,nopolesat) returns a record that can be given to zsolve$X4ti2 in order to find the generators of the monoid of (generalized) eta-quotients that are modular wrt. QMOD and have no poles at the cusps given by nopolesat and for all cusps in polesat the expansion order fulfills the relation at the respective cusp. #polesat>=#rels and #polesat>=#ords. Missing values are assumed to be 0. Entries in rels can be 1,0,-1 and stand for >=, =, and <=, respectively. The indices of the eta-functions that may appear is given by idxs.

genus: PositiveInteger -> NonNegativeInteger

genus(nn) returns the genus of the congruence subgroup connected to the package (either Gamma_0(nn) or Gamma_1(nn).

matrixEtaOrder: (PositiveInteger, List Cusp, List List Integer) -> Matrix Fraction Integer

matrixEtaOrder(nn,spitzen,idxs) returns the matrix given by [matrixEtaOrderRow(nn,cusp,idxs) for cusp in spitzen] with duplicate rows removed.

matrixEtaOrderElement: (PositiveInteger, Cusp, List Integer) -> Fraction Integer

z:=matrixEtaOrderElement(nn,cusp,idx). The parameter corresponds to the index of a (generalized) eta-quotient, i.e. it can be of the form idx=[delta,g] or of the form idx=[delta] with g in the range 0..delta. Then z is the coefficient of r_{delta,g} in cite[Thm.~4]{Robins_GeneralizedDedekindEtaProducts_1994}, except for the case nn=4, gcd(denom(cusp),nn)=2 (or Gamma1(4)-equivalent) where we return half of this coefficient. If idx=[delta] then z=1/2*matrixEtaOrderElement(nn,cusp,[delta,0])/2. and thus corresponds to the coefficient of $r_delta$ in eqref{eq:order-rbar-non-adjusted} in Theorem~ref{thm:matrixEtaOrderRobins}. Note that Robins refers to an expansion in the uniformizing variable q^(gcd(c,nn)/nn) (where cusp=a/c). That is equal to q^(1/width(c)$CongruenceSubgroupGamma1(nn)) except for the case nn=4 and gcd(nn,c)=2. In that case the width of the cusp 1/2 is 1 and not 2=4/gcd(4.2). For this case, we deviate from Robins’ coefficients and adapt to an expansion in q rather than an expansion in q^(1/2).

matrixEtaOrderFull: (PositiveInteger, List Cusp, List List Integer) -> Matrix Fraction Integer

matrixEtaOrderFull(nn,spitzen,idxs) returns a matrix given by [matrixEtaOrderRow(nn,cusp,idxs) for cusp in spitzen].

matrixEtaOrderRow: (PositiveInteger, Cusp, List List Integer) -> List Fraction Integer

matrixEtaOrderRow(nn, cusp, idxs) returns [matrixEtaOrderElement(nn,cusp,idx) for idx in idxs].

matrixModular: (PositiveInteger, List List Integer) -> Matrix Fraction Integer

matrixModular(nn, idxs) returns a matrix mat mat*v=0 for an (extended) exponent vector where the exponents correspond to idxs, i.e. #v=#idxs+k where k corresponds to additional (slack) variables due to the modularity conditions. The rows corresponding to slack variables have been normalized so that the entry of the slack variable is 1. The first row corresponds to 1/2 of the sum of exponents of pure eta-functions, so that when multiplied by the exponent vectors corresponding to idxs it gives the weight of the eta-quotient. The second row (when multiplied by the exponent vectors corresponding to idxs) gives the expansion order at infinity. The third row (when multiplied by the exponent vectors corresponding to idxs) gives the expansion order at the cusp 0.

minimalLevelCoEtaQuotient: (QEtaSpecification, PositiveInteger, NonNegativeInteger) -> PositiveInteger

minimalLevelCoEtaQuotient(rspec, m, t) returns the smallest nn of candidateLevalsCoEtaQuotient(rspec,m,t).

modular?: (QEtaSpecification, QEtaSpecification, PositiveInteger, NonNegativeInteger) -> Boolean

modular?(sspec,rspec,m,t) returns true iff (sspec,rspec,m,t) specifies a modular function in level(sspec).

modular?: QEtaSpecification -> Boolean

modular?(rspec) returns true iff spec specifies a modular function in level(rspec).

modularOrbit: (QEtaSpecification, PositiveInteger, NonNegativeInteger) -> List NonNegativeInteger

modularOrbit(rspec, m, t) (for $Gamma_0(N) where N is level(rspec)) computes the elements of $modularOrbit{r,m,t)$ as defined in qeta.tex, cite[Def.~42]{Radu_RamanujanKolberg_2015} and cite[Lemma 4.35]{Radu_PhD_2010} were r is pureExponents(rspec) and rspec is expected to specify a pure eta-quotient. For $Gamma_1(N)$, modularOrbit(rspec, m, t) returns [t].

numberOfGapsForSamba: PositiveInteger -> Integer

numberOfGapsForSamba(nn) returns the number of gaps (counted from the elements in the algorithm SAMBA that is sufficient to ensure a module basis, i.e. it is a criterion to avoid needless computation. For CongruenceSubgroupGamma0 this is equal to genus(nn). If no theorem for another group is known it will return -1, with the meaning that SAMBA must really check all critical element for zero reduction.

rightCosetRepresentatives: (PositiveInteger, PositiveInteger) -> List Matrix Integer

rightCosetRepresentatives(nn, mm) returns representatives of $G(nn) diagdown G(mm)$ for $G$ being the group constructor represented by this domain, i.e. either $Gamma_0$ or $Gamma_1$.

weaklyModular?: QEtaSpecification -> Boolean

weaklyModular?(spec) returns true iff spec specifies a weakly modular function of some integer weight k.

width: (PositiveInteger, Cusp) -> PositiveInteger

width(nn, cusp) returns the width of the cusp=(a:c) for G(nn) where G is the congruence subgroup of SL_2(ZZ) connected to this package.

width: (PositiveInteger, Matrix Integer) -> PositiveInteger

width(nn, gamma) returns the width of the cusp=(a:c) for G(nn) where G is the congruence subgroup of SL_2(ZZ) connected to this package and gamma = matrix [[a,b],[c,d]].