QEtaAuxiliaryPackage

qetaaux.spad line 109 [edit on github]

QEtaAuxiliaryPackage helps to do computations with eta-quotients that are modular functions.

dedekindSum: (Integer, Integer) -> Fraction Integer

dedekindSum(p,q) returns for two relatively prime integers p and q the Dedekind sum as defined by dedekindSum(p,q)=sum(sawTooth(1/q)*sawTooth(p*i/q), i=1..q-1).

fractionalBernoulli1: Fraction Integer -> Fraction Integer

fractionalBernoulli1(x) computes t - 1/2 where t is the fractional part of x, i.e. t = x - floor(x)

fractionalBernoulli2: Fraction Integer -> Fraction Integer

fractionalBernoulli2(x) computes t^2 - t + 1/6 where t is the fractional part of x, i.e. t = x - floor(x)

fractionalPart: Fraction Integer -> Fraction Integer

fractionalPart(x) returns x - floor(x)::Fraction(Integer).

generalizedDedekindSum: (PositiveInteger, Integer, Integer, Integer, Integer) -> Fraction Integer

generalizedDedekindSum(nn,g,h,p,q) returns the generalized Dedekind sum as defined in cite[p~673]{Yang:GeneralizedDedekindEtaFunctions} by generalizedDedekindSum(nn,g,h,p,q) = sum(sawTooth((g+i*nn)/(q*nn))*sawTooth((g’+p*i*nn)/(q*nn)),i=1..q-1). Condition: one? gcd(p,q).

jacobiLowerStar: (Integer, Integer) -> Integer

See, for example, Definition 2.26 in the PhD thesis of Silviu Radu. http://www3.risc.jku.at/publications/download/risc_5453/main.pdf

jacobiUpperStar: (Integer, Integer) -> Integer

See, for example, Definition 2.26 in the PhD thesis of Silviu Radu. http://www3.risc.jku.at/publications/download/risc_5453/main.pdf

kappaSchoeneberg: (PositiveInteger, Integer, Integer, Integer, Integer, Integer, Integer) -> Fraction Integer

kappaSchoeneberg(nn, g, h, a, b, c, d) returns a value x such that eta_{g,h}(mat*tau) = exp(2*%pi*%i*x) * eta_{g',h'}(tau) as given at the top of page 673 of cite{Yang_GeneralizedDedekindEtaFunctions_2004} where mat=matrix[[a,b],[c,d]]. See also eqref{eq:kappa_g-h-N-gamma-Schoeneberg}.

kappaSchoeneberg: (PositiveInteger, Integer, Integer, Matrix Integer) -> Fraction Integer

kappaSchoeneberg(nn, g, h, mat) returns a value x such that eta_{g,h}(mat*tau) = exp(2*%pi*%i*x) * eta_{g',h'}(tau) as given at the top of page 673 of cite{Yang_GeneralizedDedekindEtaFunctions_2004}. See also eqref{eq:kappa_g-h-N-gamma-Schoeneberg}.

kappaYang: (PositiveInteger, Integer, Integer, Integer, Integer, Integer, Integer) -> Fraction Integer

kappaYang(nn, g, h, a, b, c, d) returns a value x such that E_{g,h}(mat*tau) = exp(2*%pi*%i*x) * E_{g',h'}(tau) as given in cite[Theorem~1]{Yang_GeneralizedDedekindEtaFunctions_2004} where mat = matrix [[a,b],[c,d]]. Condition: not zero? c.

kappaYang: (PositiveInteger, Integer, Integer, Matrix Integer) -> Fraction Integer

kappaYang(nn, g, h, mat) returns a value x such that E_{g,h}(mat*tau) = exp(2*%pi*%i*x) * E_{g',h'}(tau) as given in cite[Theorem~1]{Yang_GeneralizedDedekindEtaFunctions_2004}. Condition: not zero? mat(2,1).

matrixAtkinLehner: (PositiveInteger, PositiveInteger) -> Matrix Integer

matrixAtkinLehner(m, t) with t a Hall divisor (https://en.wikipedia.org/wiki/Hall_subgroup) of m returns the 2x2 matrix with entries [[t, -a], [m, t*b]] such that n=m/t and t*b + n*a = 1, see cite{Kohnen_WeierstrassPointsAtInfinity_2004}.

minimalSquareRootOfUnity: PositiveInteger -> PositiveInteger

minimalSquareRootOfUnity(p) returns an integer n such that in Z(x) (where x is a primitive n-th root of unity) there exists an element y such that y^2=p. p must be a radical integer, i.e. should not contain the square of a prime.

minimizeVector: (Vector Integer, List Vector Integer) -> Vector Integer

minizeVector(v, basis) computes vps := concat [w for b in bas | (w:=v+b; dot(w,w)<dot(v,v)] vms := concat [w for b in bas | (w:=v-b; dot(w,w)<dot(v,v)] From these vectors it takes the one with minimal length as the new v and iterates as long as concat(vps, vms) is not empty. This minimal vector is eventually returned.

modularGamma0?: (PositiveInteger, List Integer) -> Boolean

modularGamma0(nn, r) returns true iff the eta-quotient corresponding to r is a modular function for Gamma_0(nn). It is equivalent to zero?(modularGamma0(nn, r)).

modularGamma0: (PositiveInteger, List Integer) -> Integer

modularGamma0(nn, r) returns 0 if all conditions are fulfilled. Otherwise it returns a positive number in the range 1 to 4 that corresponds to the condition that is not met. This corresponds to the conditions given for R(N,i,j,k,l) on page 226 of cite{Radu_RamanujanKolberg_2015} and to the conditions eqref{eq:sum=0}, eqref{eq:pure-rhoinfinity}, eqref{eq:pure-rho0}, and eqref{eq:productsquare} in qeta.tex. It is equivalent to check whether there is an extension v of r such that matrixModular(nn)*v is 0.

numberOfGaps: (PositiveInteger, List PositiveInteger) -> NonNegativeInteger

numberOfGaps(n, l) computes reduce(+, [floor(x/n) for x in l], 0).

primePower: (PositiveInteger, PositiveInteger) -> NonNegativeInteger

primePower(d, p) returns e such that gcd(d/p^e, p)=1, i.e. the highest power e such that p^e is a factor of d.

rationalSquareRoot: Fraction Integer -> Record(rat: Fraction Integer, rootOf: PositiveInteger)

if z = rationalSquareRoot(x) then x = (z.rat)^2 * z.root

sawTooth: Fraction Integer -> Fraction Integer

sawTooth(x) is 0 if x is an integer and fractionalBernoulli1(x) otherwise.

splitMatrix: (Integer, Integer, Integer, Integer) -> Record(red: Matrix Integer, triang: Matrix Integer)

splitMatrix(a, b, c, d) returns a record rec that contains two matrices rec.red=m1 and rec.triang=m2 such that mat=m1*m2 according to cide[Lemma~4.8]{Radu_PhD_2010}, but in a variation as described in qeta.tex, i.e. such that 0<=m2(1,2)<det(mat)/g where g = gcd(a, c) and mat=[[a,b],[c,d]]. Input condition: a*d-b*c>0.

splitMatrix: (Matrix Integer, Integer) -> Record(red: Matrix Integer, triang: Matrix Integer)

splitMatrix(mat, delta) computes splitMatrix(mat, delta, 1, 0). Input condition: determinant(mat)>0.

splitMatrix: (Matrix Integer, Integer, PositiveInteger, NonNegativeInteger) -> Record(red: Matrix Integer, triang: Matrix Integer)

splitMatrix(mat, delta, m, lambda) computes splitMatrix(a, b, c, d) where the arguments are the matrix entries of matrix [[delta, delta*lambda], [0, m]]*mat. Input condition: determinant(mat)>0.

upsilonExponent: (Integer, Integer, Integer, Integer) -> Integer

upsilonExponent(a,b,c,d) returns z in {0..23} such that exp(pi*i*z/12) is a multiplier in the transformation of an eta-function by the matrix [[a,b],[c,d]] from SL_2(ZZ). A definition can be found in cite[Lemma~2.27]{Radu_PhD_2010}.

upsilonExponent: Matrix Integer -> Integer

upsilonExponent(m) for a matrix m from SL_2(ZZ) returns upsilonExponent(m(1,1), m(1,2), m(2,1), m(2,2)).

verticalConcat: (Matrix Fraction Integer, Matrix Fraction Integer) -> Matrix Fraction Integer

verticalConcat(m1, m2) puts m1 on top of m2 while creating a matrix big enough to hold all columns.