$ \newcommand{\qPochhammer}[3][\infty]{\left( #2;#3 \right)_{#1}} \newcommand{\setQ}{\mathbb{Q}} $ Via jupytext this file can be shown as a jupyter notebook.
This notebook demonstrates the finding and verification of some identities involving the Goellnitz-Gordon functions.
)cd ..
)read input/jfricas-test-support.input )quiet
The current FriCAS default directory is /home/hemmecke/backup/git/qeta All user variables and function definitions have been cleared. All )browse facility databases have been cleared. Internally cached functions and constructors have been cleared. )clear completely is finished. The current FriCAS default directory is /home/hemmecke/backup/git/qeta/tmp
We want to show the variable tau
nicely in the output,
so we translate any symbol tau
into the TeX-expression
\tau
. That is just technical boilerplate.
setHandler!(operatorHandlers()$FormatMathJax, 0 ,_
"tau", formatConstant("\tau")$FormatMathJax)_
$ OperatorHandlers((Integer, List OutputForm) -> OutputBox);
Do no execute the following if you are in a jFriCAS notebook.
)set output algebra on
)set output formatted off
Goellnitz-Gordon identities $G$, $H$¶
\begin{align*} G(q) &= \sum_{n=0}^\infty \frac{q^{n^2}\qPochhammer[n]{-q}{q^2}}{\qPochhammer[n]{q^2}{q^2}} = \prod_{n=0}^\infty \frac{1}{(1-q^{8n+1})(1-q^{8n+4})(1-q^{8n+7})} = \frac{\qPochhammer{q^8}{q^8}}{\qPochhammer{q,q^7}{q^8} \qPochhammer{q^4}{q^4}} \\ H(q) &= \sum_{n=0}^\infty \frac{q^{n(n+2)}\qPochhammer[n]{-q}{q^2}}{\qPochhammer[n]{q^2}{q^2}} = \prod_{n=0}^\infty \frac{1}{(1-q^{8n+3})(1-q^{8n+4})(1-q^{8n+5})} = \frac{\qPochhammer{q^8}{q^8}}{\qPochhammer{q^3,q^5}{q^8} \qPochhammer{q^4}{q^4}} \end{align*}
Krishna Alladi showed \begin{align*} G(-q^2)-q H(-q^2) &= \frac{\qPochhammer{q}{q^2}}{\qPochhammer{-q^2}{q^2}}. \end{align*}
In this notebook, we proof this identity, by turning the terms into modular function for $\Gamma_1(32)$ and showing that the $q$-expansions (after bringing everything to the left-hand side) have a positive order at every cusp of $\Gamma_1(32)$ and thus must be the zero function.
Furthermore, QEta is not only able to find the above identity automatically, but also the following identities \begin{align*} \frac{1}{H(-q^2)} - \frac{q}{G(-q^2)} &= \frac{\qPochhammer{q}{q} \qPochhammer{q^4}{q^4} \qPochhammer{q^8}{q^8}} {\qPochhammer{q^2}{q^2} \qPochhammer{q^{16}}{q^{16}}^2}, \\ \frac{(G(-q^2) - q H(-q^2))^2}{G(-q^2) + q H(-q^2)} &= \frac{\qPochhammer{q}{q}^3}{\qPochhammer{q^2}{q^2}^3}. \end{align*}
Since the QEta package does its work in terms of Dedekind eta functions, we first must translate $G(q)$, $G(-q^2)$, $H(q)$, $H(-q^2)$ into eta-quotients.
Note that for $q=\exp(2\pi i \tau)$ we have \begin{align*} \qPochhammer{q}{q^2} &= \frac{\qPochhammer{q}{q}}{\qPochhammer{q^2}{q^2}} = q^{\frac{1}{24}} \frac{\eta(\tau)}{\eta(2\tau)} \\ \qPochhammer{-q}{q} &= \frac{\qPochhammer{q^2}{q^2}}{\qPochhammer{q}{q}} = q^{-\frac{1}{24}} \frac{\eta(2\tau)}{\eta(\tau)} \\ \frac{\qPochhammer{q}{q^2}}{\qPochhammer{-q^2}{q^2}} &= \frac{\qPochhammer{q}{q}}{\qPochhammer{q^4}{q^4}} = q^{\frac{1}{8}}\frac{\eta(\tau)}{\eta(4\tau)} \end{align*}
Thus, we have \begin{align*} G(q) &= \frac{\qPochhammer{q^8}{q^8}}{\qPochhammer{q^4}{q^4} \qPochhammer{q,q^7}{q^8}} = q^{\frac{1}{16}} \frac{\eta(8\tau)}{η(4\tau)\,\eta_{8, 1}(\tau)}, \\ H(q) &= \frac{\qPochhammer{q^8}{q^8}}{\qPochhammer{q^4}{q^4} \qPochhammer{q^3,q^5}{q^8}} = q^{-\frac{7}{16}} \frac{\eta(8\tau)}{η(4\tau)\,\eta_{8, 3}(\tau)}. \end{align*}
And eventually, \begin{align*} G(-q^2) &= \frac{\qPochhammer{q^{16}}{q^{16}} \qPochhammer{q^2,q^{14}}{q^{16}}} {\qPochhammer{q^8}{q^8} \qPochhammer{q^4,q^{28}}{q^{32}}} = q^{\frac{1}{8}} \frac{\eta(16\tau) \, \eta_{16, 2}(\tau)} {\eta(8\tau) \, \eta_{32, 4}(\tau)}, \\ H(-q^2) &= \frac{\qPochhammer{q^{16}}{q^{16}} \qPochhammer{q^6,q^{10}}{q^{16}}} {\qPochhammer{q^8}{q^8} \, \qPochhammer{q^{12},q^{20}}{q^{32}}} = q^{-\frac{7}{8}} \frac{\eta(16\tau) \, \eta_{16, 6}(\tau)} {\eta(8\tau) \, \eta_{32, 12}(\tau)}. \end{align*}
Init¶
This section just defines a few things to work more conveniently with the functionality provided by QEta.
-------------------------------------------------------------------
--setup
-------------------------------------------------------------------
C ==> QQ
)set mess type off
)read convenience.input )quiet
printSPEC spec ==> _
qEtaQuotient(spec, varPochhammer) = etaQuotient(spec, varEta)
The following command determines how many terms of a series will be shown on output. You can change it if you want to see more.
)set stream calc 15
-------------------------------------------------------------------
--endsetup
-------------------------------------------------------------------
-------------------------------------------------------------------
--test:Goellnitz-Gordon-G-H
-------------------------------------------------------------------
Verify Alladi relation of $G(-q^2)$ and $H(-q^2)$¶
Instead of $G(-q^2)$ and $H(-q^2)$, we work with the functions $g_{-2}(\tau)$, $h_{-2}(\tau)$, $\frac{\eta(\tau)}{\eta(4\tau)}$ (for the right-hand side) where $q=\exp(2\pi i \tau)$.
specg := eqSPEC[[4,-1],[8,1],[8,1,-1]];
spech := eqSPEC[[4,-1],[8,1],[8,3,-1]];
specgm2 := eqSPEC([[8,-1],[16,1],[16,2,1],[32,4,-1]]);
spechm2 := eqSPEC([[8,-1],[16,1],[16,6,1],[32,20,-1]]);
specrhs := eqSPEC(32, [[1,1],[4,-1]]); -- That's the rhs eta-quotient.
prefix(g[-2]::OF,[tau]) = q^((-1/8)::OF)*'G(-q^2) = printSPEC specgm2
prefix(h[-2]::OF,[tau]) = q^(( 7/8)::OF)*'H(-q^2) = printSPEC spechm2
printSPEC specrhs
Unfortunately, these functions are not modular for $\Gamma_1(32)$.
[modularGamma1? x for x in [specgm2, spechm2,specrhs]]
Expressed in $q$-Pochhammer symbols we must show \begin{align*} \frac{\qPochhammer{q^{16}}{q^{16}} \qPochhammer{q^2,q^{14}}{q^{16}}} {\qPochhammer{q^8}{q^8} \, \qPochhammer{q^4,q^{28}}{q^{32}}} - q \frac{\qPochhammer{q^{16}}{q^{16}} \qPochhammer{q^6,q^{10}}{q^{16}}} {\qPochhammer{q^8}{q^8} \, \qPochhammer{q^{12},q^{20}}{q^{32}}} &= \frac{\qPochhammer{q}{q}}{\qPochhammer{q^4}{q^4}}. \end{align*}
Turning this into an $\eta$-function identity, we get. \begin{align*} \frac{\eta(16\tau) \, \eta_{16, 2}(\tau)} {\eta(8\tau) \, \eta_{32, 4}(\tau)} - \frac{\eta(16\tau) \, \eta_{16, 6}(\tau)} {\eta(8\tau) \, \eta_{32, 12}(\tau)} &= \frac{\eta(\tau)}{\eta(4\tau)} \end{align*}
Let us divide by the right-hand side.
specgm2m := specgm2 / specrhs;
spechm2m := spechm2 / specrhs;
printSPEC specgm2m
printSPEC spechm2m
We arrive at modular functions for $\Gamma_1(32)$.
[modularGamma1?(specgm2m), modularGamma1?(spechm2m)]
That is we must show
etaQuotient(spechm2m, varEta) - etaQuotient(spechm2m, varEta) - 1
vanishes at every cusp of $\Gamma_1(32)$.
It is easy to compute that the expansion at infinity shows no poles.
expansion specEQI(ZZ)(specgm2m) - expansion specEQI(ZZ)(spechm2m) - 1
In QEta, we can enter the above eta-quotient expression by converting a rational function expression in the variables $E_d$ that stand for $\eta_d(\tau)$.
Internally, we use the type QEtaSpecificationRing
to represent
such expressions.
This allows us to print the expression in various formats.
specr := (E4/E1 * E16/E8 * (E16_2/E32_4 - E16_6/E32_12) - 1)::SPECR(ZZ);
We can print it as identity in $\eta$-functions
pretty(specr, formatAsExpression())
or as an identity in $q$-Pochhammer symbols.
pretty(specr, formatAsExpression() + formatWithQFactor())
Each of the terms and therefore the whole expression is a modular function for $\Gamma_1(32)$.
[modularGamma1?(t.k) for t in terms specr]
assertTrue(modularGamma1? specr)
For verifying that the above modular function is zero, it is enough to expand it at all cusps of $\Gamma_1(32)$ and show that at each cusp the respective expansion has no pole and a constant zero term.
We start with the cusps (or corresponding transformation matrices).
gammas := cuspMatricesM1 32
spitzen := map(cusp, gammas)
The expansion at cusps other than $\infty$ may require an extension
of the coefficient domain. The following code determines the
extension CX
of the domain $C$ (rational numbers) by a certain
root of unity.
ys := [specYM1EQ(t.k, gammas) for t in terms specr];
xiord := lcm [minimalRootOfUnity(y)::PP for y in ys]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
The 32 shown above means that it is enough to adjoin to $\setQ$ a 32-th root of unity $\xi$.
We can determine the pole orders (qetaGrades
) of the terms of
specr
and realize that there are poles at the cusps different
from $\infty$.
[qetaGrades y for y in ys]
Since the terms have poles not only at infinity,
we must look at all cusps.
The macro specrM1An
hides some technical details, but eventually
computes the $q$-expansions at each of the cusps.
trfs := gammas
specrx := specrM1An(CX)(specr)
assertTrue(zero? specrx)
If you want to see the expansions of the terms at all the cusps, you can achieve it like this.
as := [specrM1An(CX)(m) for m in monomials specr]; #as
as.1
as.2
as.3
as.1 + as.2 + as.3
Find Alladi relation for $G(-q^2)$ and $H(-q^2)$¶
Since neither $g_{-2}(\tau)$ nor $h_{-2}(\tau)$ are modular for $\Gamma_1(32)$, we find eta-quotients, that we multiply to these functions so that the products are modular function for $\Gamma_1(32)$.
QEta provides the function etaCofactorNoPoles
in order
to compute such an eta-quotient.
Clearly, in general, such an eta-quotient need not be unique,
thus this function allows to specifies the search space for
the eta-functions that are allowed to be used in the cofactor.
That is encoded below in the variables idxs
.
Here we want an eta-quotient that possibly only contains $\eta(\tau)$, $\eta(2\tau)$, and $\eta(4\tau)$.
QMOD ==> QMOD1
idxs := etaFunctionIndices 4
cofac(spec,idx) ==> etaCofactorNoPoles(32, idxs, spec, 1, 0, [])$QMODPKG(QMOD)
s1specg := cofac(specgm2, idx);
s1spech := cofac(spechm2, idx);
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in [s1specg, s1spech]]
As it turns out, it can be done by the same eta-quotient
cofactor s1specg
=s1spech
.
s1spec := s1specg;
printSPEC(s1spec)
specg1m2 := s1spec * specgm2;
spech1m2 := s1spec * spechm2;
spec1s := [specg1m2, spech1m2];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in spec1s]
[modularGamma1? x for x in spec1s]
Let us call the above functions $g_{-2}^{(1)}$ and $h_{-2}^{(1)}$ and let us compute their pole orders at the cusps of $\Gamma_1(32)$.
Since we aim at computing a polynomial $p$ such that $p(g_{-2}^{(1)}(\tau),h_{-2}^{(1)}(\tau))=0$, we only need to consider the cusps where at least one of the functions has a pole.
y1alls := [specYM1EQ(x, gammas) for x in spec1s];
qgrd1ss := [qetaGrades y for y in y1alls];
poscomponent1s := [i for i in 1..#qgrd1ss.1 | qgrd1ss.1.i > 0 or qgrd1ss.2.i > 0]
The orders of $g_{-2}^{(1)}$ and $h_{-2}^{(1)}$ at the cusps corresponding to these components can easily be computed.
trfs := [gammas.i for i in poscomponent1s];
y1s := [specYM1EQ(x,trfs) for x in spec1s];
[qetaGrades x for x in y1s]
For the multisamba algorithm to run, we need an element with proper poles at all these cusps. Fortunately, this is the case here.
In order to work with the $q$-expansion of the above functions, we need an extension of the coefficient field (the rational numbers).
xiord := lcm [minimalRootOfUnity(y)::PP for y in y1s]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
Obviously, we must adjoin a 32-th root of unity (denoted by $\xi$) to the coefficient field.
a1s := [expandM1An(CX)(y) for y in y1s];
a1s.1
a1s.2
matrix [qetaGrades x for x in a1s]
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
)time on
mp := modPolynomial(a1s)
)time off
Indeed, plugging in the series expansions of $g_{-2}^{(1)}$ and $h_{-2}^{(1)}$ at all the cusps of $\Gamma_1(32)$ gives a positive order and, therefore, proves that the polynomial is an identity for $g_{-2}^{(1)}$ and $h_{-2}^{(1)}$.
trfs := gammas;
xiord := lcm [minimalRootOfUnity(y)::PP for y in y1alls]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
an1s := [specM1An(CX)(x) for x in spec1s];
zser := eval(mp::Pol(CX), c+->c*1$An(CX), ['x,'y], an1s)$PolynomialEvaluation(CX, An CX)
assertTrue(zero? zser)
Find relation for $\frac{1}{G(-q^2)}$ and $\frac{1}{H(-q^2)}$¶
In contrast to the previous section, we now allow to choose from all eta functions $\eta(d\tau)$ for $d$ being a divisor of 32.
idxs := etaFunctionIndices 32
s2specg := cofac(specgm2, idxs);
s2spech := cofac(spechm2, idxs);
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in [s2specg, s2spech]]
As it turns out, it can be done by the same eta-quotient cofactor. We now repeat the same process as in the previous section, but due to a different cofactor, we get a different result.
s2spec := s2specg;
specg2m2 := s2spec * specgm2;
spech2m2 := s2spec * spechm2;
spec2s := [specg2m2, spech2m2];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in spec2s]
[modularGamma1? x for x in spec2s]
Let us call the above functions $g_{-2}^{(2)}$ and $h_{-2}^{(2)}$ and let us compute their pole orders at the cusps of $\Gamma_1(32)$.
Since we aim at computing a polynomial $p$ such that $p(g_{-2}^{(2)}(\tau),h_{-2}^{(2)}(\tau))=0$, we only need to consider the cusps where at least one of the functions has a pole.
y2alls := [specYM1EQ(x, gammas) for x in spec2s];
qgrd2ss := [qetaGrades y for y in y2alls];
poscomponent2s := [i for i in 1..#qgrd2ss.1 | qgrd2ss.1.i > 0 or qgrd2ss.2.i > 0]
The orders of $g_{-2}^{(2)}$ and $h_{-2}^{(2)}$ at these cusps can easily be computed.
trfs := [gammas.i for i in poscomponent2s];
y20s := [specYM1EQ(x,trfs) for x in spec2s];
[qetaGrades x for x in y20s]
For the multisamba algorithm to run, we need an element with proper poles at all these cusps. So instead of computing a modular polynomial $p$ with $p(g_{-2}^{(2)}(\tau), h_{-2}^{(2)}(\tau))=0$, we compute a polynomial $p_2$ such that $p_2(g_{-2}^{(2)}(\tau) h_{-2}^{(2)}(\tau), h_{-2}^{(2)}(\tau))=0$ and reconstruct a polynomial $p$ from $p_2$.
spec2Xs := [specg2m2 * spech2m2, spech2m2];
y2s := [specYM1EQ(x,trfs) for x in spec2Xs];
[qetaGrades x for x in y2s]
In order to work with the $q$-expansion of the above functions, we need an extension of the coefficient field (the rational numbers).
xiord := lcm [minimalRootOfUnity(y)::PP for y in y2s]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
Obviously, we must adjoin an 8-th root of unity (denoted by $\xi$) to the coefficient field.
a2s := [expandM1An(CX)(y) for y in y2s];
a2s.1
a2s.2
matrix [qetaGrades x for x in a2s]
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
)time on
mp2 := modPolynomial(a2s)
)time off
Now we remind ourselves that the variable x actually stands for the product $g_{-2}^{(2)} h_{-2}^{(2)}$.
mp := eval(mp2, [x=g*h, y=h])
To get the minimal polynomial, we drop the extraneous factor $h$.
fl := factorList factor mp; #fl
fl.1
p := fl.2.factor
Indeed, plugging in the series expansions of $g_{-2}^{(2)}$ and $h_{-2}^{(2)}$ at all the cusps of $\Gamma_1(32)$ gives a positive order and, therefore, proves that the polynomial is an identity for $g_{-2}^{(2)}$ and $h_{-2}^{(2)}$.
trfs := gammas;
xiord := lcm [minimalRootOfUnity(y)::PP for y in y2alls]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
an2s := [specM1An(CX)(x) for x in spec2s];
zser := eval(p::Pol(CX), c+->c*1$An(CX), [g,h], an2s)$PolynomialEvaluation(CX, An CX)
assertTrue(zero? zser)
Let us translate polynomial to a nicer form by dividing by the product of the variables.
assertEquals(p/(g*h), 1 + 1/g -1/h)
Indeed, if we plug in the series expansions, we get 0 as above.
xg2 := an2s.1; xh2 := an2s.2; one:=1$An(CX);
zser := one + one/xg2 - one/xh2
assertTrue(zero? zser)
The above can be translated back into an identity for $G(-q^2)$ and $H(-q^2)$.
Note that \begin{align*} g_{-2}^{(2)}(\tau)&=s_2(\tau) g_{-2}(\tau) \\ h_{-2}^{(2)}(\tau)&=s_2(\tau) h_{-2}(\tau) \end{align*} where
prefix(g[-2]::OF,[tau]) = q^((-1/8)::OF)*'G(-q^2) = printSPEC specgm2
prefix(h[-2]::OF,[tau]) = q^(( 7/8)::OF)*'H(-q^2) = printSPEC spechm2
prefix(s[2]::OF,[tau]) = printSPEC s1spec
So we have \begin{align*} \frac{1}{h_{-2}(\tau)} - \frac{1}{g_{-2}(\tau)} &= \frac{\eta(\tau)\eta(4\tau)\eta(8\tau)} {\eta(2\tau) \eta(16\tau)} \\ \frac{1}{H(-q^2)} - \frac{q}{G(-q^2)} &= \frac{\qPochhammer{q}{q} \qPochhammer{q^4}{q^4} \qPochhammer{q^8}{q^8}} {\qPochhammer{q^2}{q^2} \qPochhammer{q^{16}}{q^{16}}^2} \end{align*}
Find a relation for the product $G(-q^2) H(-q^2)$¶
The relation $gh + h - g$ that we found above, looks suspiciously like the relation $y - x + 1$ relation, i.e. like the relation that Alladi originally found. Let us try to verify, that the above relation of the inverses is actually not new.
We do this by showing that the product $G(-q^2) H(-q^2)$ is a simple eta-quotient and cancels nicely with the other involved eta-quotient from the last section, so that Alladi's relation is obtained.
Let us consider the product $g_{-2}(\tau) h_{-2}(\tau)$ and determine an eta-quotient $s_\infty(\tau)$ such that the product \begin{gather*} u(\tau) = s_\infty(\tau) g_{-2}(\tau) h_{-2}(\tau). \end{gather*} gives a modular function $u(\tau)$ for $\Gamma_1(32)$ that has pole at most at infinity.
idxs := etaFunctionIndices 16
specgm2 * spechm2
sspecghinf := cofactInfM1(32, idxs, specgm2 * spechm2, 1, 0);
prefix(s[oo]::OF,[tau]) = printSPEC sspecghinf
specu := sspecghinf * specgm2 * spechm2;
prefix('u,[tau])$OF = printSPEC(specu)
modularGamma1?(specsu)
Compute the expansion of $u(\tau)$ at all cusps of $\Gamma_1(32)$.
trfs := gammas;
xiord := lcm [minimalRootOfUnity(y)::PP for y in y2alls]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
u := specM1An(CX)(specu)
assertTrue(zero?(u - 1$An(CX)))
We are lucky, $u(\tau)=1$, i.e., \begin{gather*} g_{-2}(\tau) h_{-2}(\tau)=\frac{1}{s_\infty(\tau)}. \end{gather*}
So \begin{gather*} s_2(\tau) g_{-2}(\tau) - s_2(\tau) h_{-2}(\tau) = s_2(\tau)^2 g_{-2}(\tau) h_{-2}(\tau) \end{gather*} becomes \begin{gather*} g_{-2}(\tau) - h_{-2}(\tau) = s_2(\tau) g_{-2}(\tau) h_{-2}(\tau) = \frac{ s_2(\tau)}{s_\infty(\tau)}. \end{gather*}
specrhs2 := s2spec /sspecghinf;
printSPEC(specrhs2)
assertEquals(specrhs2, specrhs)
In other words, we recover the identity found by Alladi.
Find other relation for $G(-q^2)$ and $H(-q^2)$¶
In contrast to the previous sections, we now allow only eta-functions $\eta(\tau)$ and $\eta(2\tau)$ in a cofactor. Clearly, it may happen that we are unlucky, but here we are successful.
idxs := etaFunctionIndices 2
s3specg := cofac(specgm2, idxs);
s3spech := cofac(spechm2, idxs);
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in [s3specg, s3spech]]
As it turns out, it can be done by the same eta-quotient
cofactor s3specg
=s3spech
.
s3spec := s3specg;
spec3gm2 := s3spec * specgm2;
spec3hm2 := s3spec * spechm2;
spec3s := [spec3gm2, spec3hm2];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in spec3s]
[modularGamma1? x for x in spec3s]
Let us call the above functions $g_{-2}^{(3)}$ and $h_{-2}^{(3)}$ and let us compute their pole orders at the cusps of $\Gamma_1(32)$.
Since we aim at computing a polynomial $p$ such that $p(g_{-2}^{(3)}(\tau),h_{-2}^{(3)}(\tau))=0$, we only need to consider the cusps where at least one of the functions has a pole.
y3alls := [specYM1EQ(x, gammas) for x in spec3s];
qgrd3ss := [qetaGrades y for y in y3alls];
poscomponent3s := [i for i in 1..#qgrd3ss.1 | qgrd3ss.1.i > 0 or qgrd3ss.2.i > 0]
The orders of $g_{-2}^{(3)}$ and $h_{-2}^{(3)}$ at the cusps corresponding to these components can easily be computed.
trfs := [gammas.i for i in poscomponent3s];
y3s := [specYM1EQ(x,trfs) for x in spec3s];
[qetaGrades x for x in y3s]
For the multisamba algorithm to run, we need an element with proper poles at all these cusps. Fortunately, this is the case here.
In order to work with the $q$-expansion of the above functions, we need an extension of the coefficient field (the rational numbers).
xiord := lcm [minimalRootOfUnity(y)::PP for y in y3s]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
Obviously, we must adjoin a 32-th root of unity (denoted by $\xi$) to the coefficient field.
a3s := [expandM1An(CX)(y) for y in y3s];
a3s.1
a3s.2
matrix [qetaGrades x for x in a3s]
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
)time on
mp3 := modPolynomial(a3s)
)time off
Indeed, plugging in the series expansions of $g_{-2}^{(3)}$ and $h_{-2}^{(3)}$ at all the cusps of $\Gamma_1(32)$ gives a positive order and, therefore, proves that the polynomial is an identity for $g_{-2}^{(3)}$ and $h_{-2}^{(3)}$.
trfs := gammas;
xiord := lcm [minimalRootOfUnity(y)::PP for y in y3alls]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
an3s := [specM1An(CX)(x) for x in spec3s];
zser := eval(mp3::Pol(CX), c+->c*1$An(CX), [x,y], an3s)$PolynomialEvaluation(CX, An CX)
assertTrue(zero? zser)
Let us translate it to a nicer form by dividing by the product of the variables.
assertEquals(mp3/(x+y), (x-y)^2/(x+y) - 1)
Indeed, if we plug in the series expansions, we get 0 as above.
xg2 := an3s.1; xh2 := an3s.2; one:=1$An(CX);
(xg2-xh2)^2/(xg2+xh2) - one
assertTrue(zero?((xg2-xh2)^2/(xg2+xh2) - one))
By plugging in $s_3(\tau) g_{-2}(\tau)$ for $x$ and $s_3(\tau) h_{-2}(\tau)$ for $y$ we get after cancelling common factors: \begin{align*} g_{-2}(\tau) + h_{-2}(\tau) &= s_3(\tau) (g_{-2}(\tau) - h_{-2}(\tau))^2 \end{align*} where
prefix(s[3]::OF, [tau]) = printSPEC s3spec
And after plugging in the right-hand side from the identity of Alladi, we get \begin{align*} g_{-2}(\tau) + h_{-2}(\tau) &= \frac{\eta(2\tau)^3}{\eta(\tau)\eta(4\tau)^2} \end{align*}
which is \begin{align*} G(-q^2) + q H(-q^2) &= \frac{\qPochhammer{q^2}{q^2}^3} {\qPochhammer{q}{q} \qPochhammer{q^4}{q^4}^2}. \end{align*}
Although, by construction, that is already a proven identity, we can recheck it as we did for Alladi's identity.
specrhs3 := eqSPEC(32, [[1,-1],[2,3],[4,-2]]);
specgm23 := specgm2 / specrhs3;
spechm23 := spechm2 / specrhs3;
[modularGamma1?(specgm23), modularGamma1?(spechm23)]
Again we adjoin a 32-th root of unity to the rational numbers to be able to compute the expansions of the involved eta-quotients at all cusps of $\Gamma_1(32)$.
yp3s := [specYM1EQ(x, gammas) for x in [specgm23, spechm23]];
xiord := lcm [minimalRootOfUnity(y)::PP for y in yp3s]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
ap3s := [specrM1An(CX)(m) for m in [specgm23, spechm23]];
ap3s.1
ap3s.2
assertTrue(zero?(ap3s.1 + ap3s.2 - 1$An(CX)))
-------------------------------------------------------------------
--endtest
-------------------------------------------------------------------
Modular Equations for $R(q)$ and $R(q^2)$¶
-------------------------------------------------------------------
--test:RamanujanGoellnitzGordonModularPolynomials-32
-------------------------------------------------------------------
Let $R(q):= q^{\frac{1}{2}} \frac{G(q)}{H(q)}$ as defined in formula (1.1) in On the Ramanujan-Göllnitz-Gordon Continued Fraction by Heng Huat Chan and Sen-Shan Huang. We show (ii) of Theorem 2.1 of this article, which is \begin{gather*} u^2 = w \frac{1-w}{1+w} \end{gather*} where $u$ stands for $R(q)$ and $w$ stands for $R(q^2)$ in our notation by means of computing a modular polynomial with the multisamba algorithm.
In this section we compute the modular polynomial between $R(q)$ and $R(q^2)$. We have to find a modular polynomial between the following two eta-quotients.
n := 2
rspec := eqSPEC(8, [[8,1,1],[8,3,-1]]);
r2spec := dilate(rspec, n);
r1spec := eqSPEC(level r2spec, parts rspec);
rspecs := [r1spec, r2spec];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in rspecs]
However, the first quotient, i.e. $R(q)$ is not a modular function for $\Gamma_1(16)$.
[level x for x in rspecs]
[modularGamma1? x for x in rspecs]
So instead, we consider $R(q^2)$ and $R(q^4)$ as modular functions for $\Gamma_1(32)$.
rrspecs := [dilate(x,2) for x in rspecs];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in rrspecs]
nn := lcm [level x for x in rrspecs]
[modularGamma1? x for x in rrspecs]
We compute a datastructure that contains enough information to
compute the pole orders (qetaGrades
) of the respective
$q$-expansions at the cusps without computing the actual series.
gammas := cuspMatrices(nn)$QMOD1;
yalls := [specYM1EQ(x,gammas) for x in rrspecs];
qgrdss := [qetaGrades x for x in yalls]
Cusps that correspond to non-poles in the series expansions for both $R(q^2)$ and $R(q^4)$ can be excluded for the computation of the modular polynomial between the two.
poscomponents := [i for i in 1..#qgrdss.1 | qgrdss.1.i > 0 or qgrdss.2.i > 0]
trfs := [gammas.i for i in poscomponents]
#trfs
If we look at the pole orders of the remaining cusps, $R(q^2)$ has positive pole order at all these cusps.
vgrdss := [vector qetaGrades specYM1EQ(x,gammas) for x in rrspecs];
[[x.i for i in poscomponents] for x in vgrdss]
For the expansions at the remaining cusps, the coefficient ring must be extended. From the data we have, we conclude that an extension by an 8-th root of unity (we call it $\xi$) is enough.
ys := [specYM1EQ(x,trfs) for x in rrspecs];
xiord := lcm [minimalRootOfUnity(y)::PP for y in ys]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
ans := [specM1An(CX)(x) for x in rrspecs];
matrix [qetaGrades x for x in ans]
The modular polynomial between $x=R(q)$ and $y=R(q^2)$ can easily be computed.
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
)time on
mp := modPolynomial(ans);
)time off
There is only one factor.
)clear prop u v
fl := factorList factor eval(mp,[x=u,y=w]); #fl
modpol := fl.1.factor
Clearly, that is equal to formula (ii) in Theorem 2.1 of the article On the Ramanujan-Göllnitz-Gordon Continued Fraction by Heng Huat Chan and Sen-Shan Huang..
assertEquals(modpol, numer(u^2 - w*(1-w)/(1+w)))
We can again check the result at all cuspe of $\Gamma_1(32)$. We set the transformation matrices such that they correspond to all cusps.
trfs := gammas;
xiord := lcm [minimalRootOfUnity(y)::PP for y in yalls]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
ans := [specM1An(CX)(x) for x in rrspecs];
matrix [qetaGrades x for x in ans]
zser := eval(modpol::Pol(CX), c+->c*1$An(CX), [u,w], ans)$PolynomialEvaluation(CX, An CX)
assertTrue(zero? zser)
-------------------------------------------------------------------
--endtest
-------------------------------------------------------------------