$ \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 find and checks relations for the Rogers-Ramanujan functions $G$, $H$, and the Rogers-Ramanujan continued fraction $R$.
)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
)set output algebra on
)set output formatted off
Init¶
We start with a few functions that we will need further below.
-------------------------------------------------------------------
--setup
-------------------------------------------------------------------
C ==> QQ
RKI ==> QEtaRamanujanKolbergIdentity C
)set mess type off
)read convenience.input )quiet
findID1a(nn,rspec,m,t)==> _
findIdM1(nn, rspec,m,t,generalizedEtaFunctionIndices nn)
idxSPEC idx ==> if #idx=3 then eqSPEC[idx] else eqSPEC[concat(idx,1)]
ERMp(spec) ==> etaRelationMonomial(1,spec,0,varPochhammer,0)$RKI
ERMe(spec) ==> etaRelationMonomial(1,spec,0,varEta,0)$RKI
printSPEC spec ==> _
qEtaQuotient(spec, varPochhammer) = etaQuotient(spec, varEta)
REL1(id) ==> ERMp definingSpecification id = (_
if fpol = 'fpol then fpol := 1;_
idpol := identityPolynomial(id);_
rpol := F - (inv(coefficient(idpol,'F, 1))::C) * idpol;_
assertEquals(rpol,fpol);_
rspec := definingSpecification id;_
sspec := coSpecification id;_
mspecs := monoidSpecifications id;_
msyms := indexedSymbols("M", #mspecs);_
m := multiplier id;_
f := specM1A1(C)(sspec,rspec,m,first orbit id);_
egens := [specM1A1(C) mspec for mspec in mspecs];_
zser := eval(idpol, c+->c::A1(C), cons('F,msyms), cons(f,egens))$_
PolynomialEvaluation(C, A1 C);_
assertTrue(zero? zser);_
if one? rpol then _
ERMp inv coSpecification id _
else _
rhs pretty(id, formatWithQFactor() + formatExpanded()_
+ formatAsNonModular()_
+ formatWithSubscript() + formatAsExpression()))
findREL1(nn,idx,idxs) ==> (id:=findIdM1(nn,idxs,idxSPEC idx,1,0,idxs);REL1 id)
findREL1ID(nn,idx,idxs) ==> (id:=findIdM1(nn,idxs,idxSPEC idx,1,0,id);REL1 id)
findREL1x(nn,idx,idxs,pol) ==> (fpol:=pol;findREL1(nn,idx,idxs))
findREL1IDx(nn,idx,idxs,pol) ==> (fpol:=pol;findREL1ID(nn,idx,idxs))
commonFactor id ==> (_
pol := inv coefficient id * identityPolynomial id - 'F;_
cs := [leadingCoefficient x for x in monomials pol];_
den := lcm [denom x for x in cs];_
num := gcd [numer(den*x) for x in cs];_
num/den)
findID1a(nn,rspec,m,t)==> _
findID1(nn,rspec,m,t,generalizedEtaFunctionIndices nn)
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 4
-------------------------------------------------------------------
--endsetup
-------------------------------------------------------------------
Rogers-Ramanujan functions $G$, $H$, $R$¶
We define the Rogers-Ramanujan functions as in. \cite{FryeGarvan_AutomaticProofOfThetaFunctionIdentities_2019}
\begin{align} G(q) &= \sum_{n=0}^\infty \frac{q^{n^2}}{(q;q)_n} = \prod_{n=0}^\infty \frac{1}{(1-q^{5n+1})(1-q^{5n+4})} = \frac{1}{\qPochhammer{q,q^4}{q^5}} \\ H(q) &= \sum_{n=0}^\infty \frac{q^{n(n+1)}}{(q;q)_n} = \prod_{n=0}^\infty \frac{1}{(1-q^{5n+2})(1-q^{5n+3})} = \frac{1}{\qPochhammer{q^2,q^3}{q^5}} \end{align}
-------------------------------------------------------------------
--test:time21-Rogers-Ramanujan-1-5
-------------------------------------------------------------------
Verify Ramanujan identity¶
Let us first check the following identity..
\begin{align} H(q) G(q)^{11}-q^2 G(q) H(q)^{11} &= 1 + 11 G(q)^6 H(q)^6 %\tag{1.2} \end{align}
\begin{align} \frac{1}{\eta_{5,1}(\tau)^{11} \eta_{5,2}(\tau)} - \frac{1}{\eta_{5,1}(\tau) \eta_{5,2}(\tau)^{11}} &= 1 + 11 \frac{\eta(5\tau)^6}{\eta(\tau)^6} %\tag{1.5} \end{align}
Bringing everything to the right-hand side, we can enter the last formula easily like this. We use the variables $E_d$ to stand for $\eta_d(\tau)$.
specrf := 1 + 11 * E5^6/E1^6 - (1/(E5_1^11 * E5_2) - 1/(E5_1 * E5_2^11));
specr := specrf::SPECR(ZZ);
Internally, we use the type QEtaSpecificationRing
to represent
such expressions.
This allows us to print the expression in various formats.
pretty(specr, formatAsExpression())
Expressed in $q$-Pochhammer symbols, it looks like this.
pretty(specr, formatAsExpression() + formatWithQFactor())
Each of the terms and therefore the whole expression is a modular function for $\Gamma_1(5)$.
[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(5)$ 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).
trfs := cuspMatricesM1 5
spitzen := map(cusp, trfs)
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, trfs) for t in terms specr];
xiord := lcm [minimalRootOfUnity(y)::PP for y in ys]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
We can determine the pole orders (qetaGrade
) of the terms of
specr
and realize that there are poles at the cusps $0$ and
$\frac{1}{2}$.
[qetaGrades y for y in ys]
Since the terms have poles not only at infinity, we must look at all cusps.
specrx := specrM1An(CX)(specr)
assertTrue(zero? specrx)
If you want to see the expansions of the terms, you can achieve it like this.
as := [specrM1An(CX)(m) for m in monomials specr]; #as
as.1
as.2
as.3
as.4
Relations between $G$ and $H$¶
Let us determine a (Gröbner) basis of all relations between $G$ and $H$. In other words, find an ideal $I$ in $K[x,y]$ such that $p(g,h)=0$ for \begin{align*} g(\tau) &= \frac{1}{\eta_{5,1}(\tau)} = \frac{1}{q^{\frac{1}{60}}\qPochhammer{q,q^4}{q^5}}, \\ h(\tau) &= \frac{1}{\eta_{5,2}(\tau)} = \frac{q^{\frac{11}{60}}}{\qPochhammer{q^2,q^3}{q^5}} \end{align*} where $q=\exp(2\pi i \tau)$.
We enter the data as follows.
specrg := (1/E5_1)::SPECR(ZZ)
specrh := (1/E5_2)::SPECR(ZZ)
pretty(specrg, formatAsExpression() + formatWithQFactor())
pretty(specrh, formatAsExpression() + formatWithQFactor())
We can easily find all relations between the eta-functions $\eta_{5,1}(\tau)$ and $\eta_{5,2}(\tau)$.
er := etaRelations([[5,1],[5,2]]$List(List ZZ))$QEtaIdealHemmecke(QMOD1)
-- numOfGaps:=[0, -1] -- numOfGaps:=[0, -1] -- TIME:=0.0
There is only one and we can recover the Ramanujan identity from above by dividing this generator appropriately and noting that \begin{align*} \frac{1}{\eta_{5,1}(\tau)^6 \eta_{5,2}(\tau)^6} &= \frac{\eta(5\tau)^6}{\eta(\tau)^6}. \end{align*}
erel := (first(er)/(E5_1*E5_2)^11) :: SPECR(ZZ);
pretty(erel, formatAsExpression())
We can also do the steps in such a way that we directly get a polynomial for $g$ and $h$.
eligs := etaLaurentIdealGenerators(5, [[5,1],[5,2]])$QEtaIdealHemmecke(QMOD1)
-- numOfGaps:=[0, -1] -- numOfGaps:=[0, -1]
In the polynomial above Y5_1
and Y5_2
correspond to the
inverses of E5_1
and E5_2
. We replace them by g
and h
and
eliminate the E
variables by a Gröbner basis computation.
ghxideal := [eval(p,[Y5_1=g,Y5_2=h]) for p in eligs]
ghideal:=groebnerEliminate(ghxideal, [E5_1,E5_2], [g,h])$QEtaGroebnerBasisTools
-- TIME:=0.0
Again, the ideal of all relations of $g$ and $h$ is generated by the above relation.
We can include the eta-functions of level 5 in this computation.
alleligs := etaLaurentIdealGenerators(5, [[1],[5],[5,1],[5,2]])$QEtaIdealHemmecke(QMOD1)
-- numOfGaps:=[0, -1] -- numOfGaps:=[0, -1]
allghxideal := [eval(p,[Y5_1=g,Y5_2=h]) for p in alleligs]
allghideal:=groebnerEliminate(allghxideal, [Y1,Y5,E5_1,E5_2], [E1,E5,g,h])$QEtaGroebnerBasisTools
-- TIME:=0.0
Above we have all relations between $g(\tau)$, $h(\tau)$, $\eta(\tau)$, $\eta(5\tau)$ and rediscover as the last entry in the list a relation that we have used above.
last allghideal
Congruences for $G$ and $H$¶
Divisibility property of $H(q) G(q)^{11} = \frac{1}{\eta_{5;1}(\tau)^{11} \eta_{5;2}(\tau)}$¶
We can prove by the following witness identity that $a(5n+4) \equiv 0 \pmod{5}$ for \begin{gather*} A_1(q) = \sum_{n=0}^\infty a_1(n) q^n = H(q)G(q)^{11}. \end{gather*}
)set stream calc 20
pretty(specr, formatAsExpression())
We consider the third monomial.
m3 := -monomials(specr).3; pretty(m3, formatAsExpression())
rspec1 := leadingTerm(m3).k
s1 := series(specrM1An(CX)(m3), 4)
t := 4
idxs := [[5,1],[5,2]]$List(List ZZ)
id1 := findIdM1(5,idxs,rspec1,5,t,idxs);
-- == z:=[zinhom=[[4, 2]], zhom=[], zfree=[]] -- numOfGaps:=[0, 0]
--pretty(id1, formatWithQFactor() + formatWithSubscript())
eq1 := inv(coefficient id1)*equationX(id1,a[1])
assertEquals(commonFactor id1, 5)
Divisibility property of $q^2 G(q) H(q)^{11} = \frac{1}{\eta_{5;1}(\tau) \eta_{5;2}(\tau)^{11}}$¶
We can prove by the following witness identity that $a(5n+4) \equiv 0 \pmod{5}$ for \begin{gather*} A_2(q) = \sum_{n=0}^\infty a_2(n) q^n = G(q)H(q)^{11}. \end{gather*}
)set stream calc 20
m1 := -monomials(specr).1; pretty(m1, formatAsExpression())
rspec2 := leadingTerm(m1).k
s2 := series(specrM1An(CX)(m1), 4)
idxs := [[5,1],[5,2]]
id2 := findIdM1(5,rspec2,5,t,idxs);
-- pretty(id2, formatWithQFactor() + formatWithSubscript())
eq2 := inv(coefficient id2)*equationX(id2,a[2])
assertEquals(commonFactor id2, 5)
-- == z:=[zinhom=[[4, 2]], zhom=[], zfree=[]] -- numOfGaps:=[0, 0]
Curious divisibility by $5^3$¶
Since there is an equation involving $G(q)H(q)^{11}$ and $H(q)G(q)^{11}$, we can try the difference of the representations that we got above.
Note that the $M_1$ corresponds to the same generalized eta-quotient.
monoidSpecifications(id1)
monoidSpecifications(id2)
M[1] = ERMe(monoidSpecifications(id1).1)
equ := 5^(-3)*(eq1 - eq2)
assertEquals(content(rhs(eq1-eq2)::Polynomial(ZZ)),5^3)
Written in a more symmetric form this gives \begin{align*} \frac{H(q)}{G(q)} \sum_{n=0}^\infty a_1(5n+4) q^n - \frac{G(q)}{H(q)} \sum_{n=0}^\infty a_2(5n+4) q^n &\equiv 0 \pmod{5^3} \\ \frac{\qPochhammer{q,q^4}{q^5}}{\qPochhammer{q^2,q^3}{q^5}} \sum_{n=0}^\infty a_1(5n+4) q^n - \frac{\qPochhammer{q^2,q^2}{q^5}}{\qPochhammer{q,q^4}{q^5}} \sum_{n=0}^\infty a_2(5n+4) q^n &\equiv 0 \pmod{5^3}. \end{align*}
Rogers-Ramanujan R function¶
Rogers-Ramanujan continued fraction. \begin{gather*} R(q) = q^{\frac15} \dfrac{1}{1+\dfrac{q}{1+\dfrac{q^2}{1+\dfrac{q^3}{1+\ddots}}}} = q^{\frac15} \frac{\qPochhammer{q,q^4}{q^5}} {\qPochhammer{q^2,q^3}{q^5}} = \frac{\eta_{5,1}(\tau)}{\eta_{5,2}(\tau)} \end{gather*}
\begin{align} \frac{1}{R(q)^5} - R(q)^5 &= 11 + \frac{\eta(\tau)^6}{\eta(5\tau)^6} %\tag{1.2} \end{align}
\begin{align} \frac{\eta_{5;2}(\tau)^5}{\eta_{5;1}(\tau)^5} - \frac{\eta_{5;1}(\tau)^5}{\eta_{5;2}(\tau)^5} &= 11 + \frac{\eta(\tau)^6}{\eta(5\tau)^6} %\tag{1.5} \end{align}
Compare with \begin{align} \frac{1}{\eta_{5;1}(\tau)^{11} \eta_{5;2}(\tau)} - \frac{1}{\eta_{5;1}(\tau) \eta_{5;2}(\tau)^{11}} &= 1 + 11 \frac{\eta(5\tau)^6}{\eta(\tau)^6} %\tag{1.5} \end{align} and note that we have \begin{align} \eta_{5;1}(\tau) \, \eta_{5;2}(\tau) &= \frac{\eta(\tau)}{\eta(5\tau)}. \end{align}
findREL1(5,[5,2,-1],[[1],[5],[5,1]])
-- numOfGaps:=[0, 0]
Divisibility property of $\frac{\eta(5\tau)^6}{q\cdot\eta(\tau)^{6}}=\frac{\qPochhammer{q^5}{q^5}}{\qPochhammer{q}{q}}$¶
m2 := -monomials(specr).3; pretty(m3, formatAsExpression())
rspec3 := leadingTerm(m2).k
s1 := series(specrM1An(CX)(m2), 4)
idxs := [[5,1],[5,2]]
id3 := findIdM1(5,rspec3,5,4,idxs);
pretty(id3, formatWithQFactor() + formatWithSubscript())
't=ERMe(monoidSpecifications(id3).1) = 1/('R(q)^5)
-- qEtaQuotient(rspecs.3,varPochhammer$RKI)
-- == z:=[zinhom=[[4, 2]], zhom=[], zfree=[]] -- numOfGaps:=[0, 0]
assertEquals(commonFactor(id3), 5)
Divisibility for $(5n+t)$-disection ($t=1,2,3,4$) of $R(q)^5 = q \frac{\qPochhammer{q,q^4}{q^5}^5}{\qPochhammer{q^2,q^3}{q^5}^5}$ and $\frac{1}{R(q)^5}$¶
It is perhaps not so surprising that these disections give rise to a divisibility by 5.
t := 1
idxs := [[5,1],[5,2]]
rrspec := eqSPEC [[5,1,1],[5,2,-1]];
r5spec := rrspec^5;
idrp := findIdM1(5,r5spec,5,t,idxs);
-- pretty(id, formatWithQFactor() + formatWithSubscript())
e1 := inv(coefficient idrp)*qequationX(idrp,a[1])
idrn := findIdM1(5,inv r5spec,5,t,idxs);
-- pretty(idrn, formatWithQFactor() + formatWithSubscript())
e2 := inv(coefficient idrn)*qequationX(idrn,a[2])
-- == z:=[zinhom=[[1, 0]], zhom=[], zfree=[]] -- numOfGaps:=[0, 0]
-- == z:=[zinhom=[[1, 0]], zhom=[], zfree=[]] -- numOfGaps:=[0, 0]
However, the sum of both is divisible by 25.
e1+e2
assertEquals(rhs(e1+e2), -25)
m1spec := monoidSpecifications(idrp).1
M1 = printSPEC m1spec
m1 := specEQI(QQ)(monoidSpecifications(idrp).1)
Check relation $e1+e2$ for $5n+4$¶
We can check the relation from above by expanding it at all cusps of $\Gamma_1(5)$. For that we need to extend the the rational numbers by a primitive 10-th root of unity.
sspecp := coSpecification(idrp)
sspecn := coSpecification(idrn)
y1 := specYM1EQ(sspecp,r5spec,5,t);
y2 := specYM1EQ(sspecn,inv r5spec,5,t);
xiord := lcm(minimalRootOfUnity y1, minimalRootOfUnity y2)
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
trfs := transformationMatrices y1
spitzen := map(cusp, trfs)
)set stream calc 2
a1 := expandM1AnCX y1
a2 := expandM1AnCX y2
qetaGrades a1, qetaGrades a2
a1 + a2
ym1 := specYM1EQ(m1spec);
assertTrue(zero?(a1 + a2 + 25 * 1$An(CX)))
Divisibility for $(5n)$-disection of $R(q)^5 = \frac{\qPochhammer{q,q^4}{q^5}^5}{\qPochhammer{q^2,q^3}{q^5}^5}$ and $\frac{1}{R(q)^5}$¶
We have an exception when $t=0$. There is no divisibility by 5. However, the 5-disections of $\frac{R(q)^5}{q}$ and $\frac{q}{R(q)^5}$ are equal.
t := 0;
idxs := [[5,1],[5,2]]
rrspec := eqSPEC [[5,1,1],[5,2,-1]];
r5spec := rrspec^5;
idrp := findIdM1(5,r5spec,5,t,idxs);
pretty(idrp, formatWithQFactor() + formatWithSubscript());
e1 := inv(coefficient idrp)*qequationX(idrp,a[1])
idrn := findIdM1(5,inv r5spec,5,t,idxs);
pretty(idrn, formatWithQFactor() + formatWithSubscript());
e2 := inv(coefficient idrn)*qequationX(idrn,a[2])
-- == z:=[zinhom=[[1, 1]], zhom=[], zfree=[]] -- numOfGaps:=[0, 0]
-- == z:=[zinhom=[[1, 1]], zhom=[], zfree=[]] -- numOfGaps:=[0, 0]
e1+e2
The above congruence modulo 2 follows immediately
from the equality of e1
and e2
, see below.
e1-e2
It says for \begin{gather*} r(q) = q^{-1/5} R(q) = \frac{H(q)}{G(q)} = \frac{\qPochhammer{q,q^4}{q^5}}{\qPochhammer{q^2,q^3}{q^5}} \end{gather*} that \begin{align*} \frac{1}{r(q)} \, U_5(r(q)^5) &= r(q) \, U_5\!\left(\frac{1}{r(q)^5}\right) \end{align*} or \begin{align*} \frac{G(q)}{H(q)} \, U_5\!\left(\frac{H(q)^5}{G(q)^5}\right) &= \frac{H(q)}{G(q)} \, U_5\!\left(\frac{G(q)^5}{H(q)^5}\right) \end{align*} or \begin{align*} U_5\!\left(\frac{R(q)^5}{R(q^5)}\right) &= U_5\!\left(\frac{R(q^5)}{R(q)^5}\right) \end{align*}
where $U_5$ is the operator that acts as follows: \begin{gather*} U_5\left(\sum_{n=k}^\infty a(n)q^n\right) = \sum_{n=\lceil k/5 \rceil}^\infty a(5n)q^n \end{gather*}
Check relation for $5n$¶
Let us extract the co-specifications from the identities above. Note that these co-factors have been chosen in such a way that
e1-e2
is an identity of modular functions for $\Gamma_1(5)$.
sspecp := coSpecification(idrp)
sspecn := coSpecification(idrn)
Now we compute an auxiliary structure and extract information from it of how we have to extend our coefficient domain (the rational numbers) such that the expansions at all cusps can be represented in this extended field.
y1 := specYM1EQ(sspecp,r5spec,5,t);
y2 := specYM1EQ(sspecn,inv r5spec,5,t);
xiord := lcm(minimalRootOfUnity y1, minimalRootOfUnity y2)
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
It turns out that adjoining a primitive 10-th root of unity is enough.
trfs := transformationMatrices y1
spitzen := map(cusp, trfs)
)set stream calc 2
a1 := expandM1AnCX y1
a2 := expandM1AnCX y2
qetaGrades a1, qetaGrades a2
Obviously, there are only poles at the cusp infinity.
In the following we do some obvious checks.
c := first transformationMatrices(y1);
s1 := definingSpecification first basefactor y1 c
s2 := definingSpecification first basefactor y2 c
assertEquals(s1, inv s2)
s1 := definingSpecification cofactor y1 c
s2 := definingSpecification cofactor y2 c
assertEquals(s1, eqSPEC[[5,2,12]])
assertEquals(s2, eqSPEC[[5,1,2],[5,2,10]])
But, most importantly, the difference of the values a1
and a2
vanish at every cusp of $\Gamma_1(5)$.
assertTrue(zero?(a1 - a2))
Expansion at infinity gives 0 up to high order¶
Although, the above is already enough to prove equality, we here show that the coefficients of the series for the difference vanishes up to $q^{200}$.
)set stream calc 10
rrser := eulerExpansion specEQI(C)(rrspec)
r5ser := eulerExpansion specEQI(C)(r5spec)
r55ser := choose(5,0,r5ser)
irrser := inv rrser
ir5ser := inv r5ser
ir55ser := choose(5,0,ir5ser)
ser := irrser*r55ser - rrser*ir55ser
cs := removeDuplicates [ser.i for i in 0..200]
assertEquals(cs,[0])
Check series expansion at all cusps¶
Here we check that the $q$-expansion at all cusps agree in the principal part for the following equality. \begin{gather*} U_5\left(\frac{R(q)^5}{R(q^5)}\right) = U_5\left(\frac{R(q^5)}{R(q)^5}\right) \end{gather*}
We first compute the arguments of the $U_5$ operator and check that they are modular functions for $\Gamma_1(5)$.
rrspec := eqSPEC [[ 5,1,1],[ 5, 2,-1]]
d5rrspec := eqSPEC [[25,5,1],[25,10,-1]]
xspec := rrspec^5 / d5rrspec
ixspec := inv xspec
assertTrue(modularGamma1? xspec)
assertTrue(modularGamma1? ixspec)
We do not need a cofactor to make the 5-disection modular in $\Gamma_1(25)$.
v := (etaCofactorSpace(25,idxs, xspec,5,0)$QMOD1).particular
iv := (etaCofactorSpace(25,idxs,ixspec,5,0)$QMOD1).particular
assertEquals(v ::Vector(ZZ), vector [0,0])
assertEquals(iv::Vector(ZZ), vector [0,0])
Thus, we can choose 1 as a cofactor for both dissections, but the $U_5$ operator brings as from $\Gamma_1(5)$ to $\Gamma_1(25)$.
sspec := eqSPEC(25,[]$List(ZZ))
yx := specYM1EQ(sspec,xspec,5,0);
yix := specYM1EQ(sspec,ixspec,5,0);
Again, we only need a primitive 10-th root of unity in the coefficient domain. But there are a lot more cusps in $\Gamma_1(25)$ than in $\Gamma_1(5)$.
xiord := lcm(minimalRootOfUnity yx, minimalRootOfUnity yix)
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
trfs := transformationMatrices yx
spitzen := map(cusp, trfs)
We compute the expansions for each of $U_5\left(\frac{R(q)^5}{R(q^5)}\right)$ and $U_5\left(\frac{R(q^5)}{R(q)^5}\right)$ and see their pole orders at the above cusps below.
ax := expandM1AnCX yx;
aix := expandM1AnCX yix;
[qetaGrades ax, qetaGrades aix]
Eventually, we check that the difference is zero at each cusp.
assertTrue(zero?(ax - aix))
Check Relation for $R(q)$ and $R(q^5)$¶
In Ramanujan's notebook Ramanujan, S.: Notebooks, 2 volumes. Tata Institute of Fundamenmtal Research, Bombay (1957) there is a relation \begin{align*} R(q)^5 &= R(q^5)\cdot \frac{1 - 2 R(q^5) + 4 R(q^5)^2 - 3 R(q^5)^3 + R(q^5)^4} {1 + 3 R(q^5) + 4 R(q^5)^2 + 2 R(q^5)^3 + R(q^5)^4} \end{align*} which we are going to verify by multiplying by the denominator and then checking that every term is a modular function for $\Gamma_1(25)$. Then it is enough to check that the expansion at every cusp has no pole and a zero constant term. We repeat the definition: \begin{gather*} R(q) = \frac{\eta_{5,1}(\tau)}{\eta_{5,2}(\tau)} \end{gather*}
r := E5_1/E5_2; s := E25_5/E25_10;
lhsnum := 1 - 2*s + 4*s^2 - 3*s^3 + s^4;
lhsden := 1 + 3*s + 4*s^2 + 2*s^3 + s^4;
specrf := r^5 * lhsden - s * lhsnum;
specr := specrf::SPECR(ZZ);
--pretty(specr, formatAsExpression())
Each of the terms is a modular function for $\Gamma_1(25)$.
[level(t.k) for t in terms specr]
[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(25)$ and show that each expansion has no pole and a constant zero term for each cusp.
We start with the cusps (or corresponding transformation matrices).
trfs := cuspMatricesM1 25
spitzen := map(cusp, trfs)
The expansion at cusps other than $\infty$ may require an extension of the coefficient domain. The following code determines the extension of the domain $C$ (rational numbers) by a certain root of unity.
ys := [specYM1EQ(t.k, trfs) for t in terms specr];
xiord := lcm [minimalRootOfUnity(y)::PP for y in ys]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
We can determine the pole orders (qetaGrade
) of the terms of
specr
and realize that there are poles at 9 of the 28 cusps.
[qetaGrades y for y in ys]
poles := [[c for c in spitzen for g in qetaGrades y|g>0] for y in ys]
joinedpoles := removeDuplicates concat poles
[#joinedpoles, #spitzen]
Since the terms have poles not only at infinity, we must look at all cusps.
specrx := specrM1An(CX)(specr)
assertTrue(zero? specrx)
Find Relation for $R(q)^5$ and $R(q^5)$¶
In Ramanujan's notebook Ramanujan, S.: Notebooks, 2 volumes. Tata Institute of Fundamenmtal Research, Bombay (1957) there is a relation \begin{align*} R(q)^5 &= R(q^5)\cdot \frac{1 - 2 R(q^5) + 4 R(q^5)^2 - 3 R(q^5)^3 + R(q^5)^4} {1 + 3 R(q^5) + 4 R(q^5)^2 + 2 R(q^5)^3 + R(q^5)^4}, \end{align*} where $R(q)$ is defined by \begin{gather*} R(q) = \frac{\eta_{5,1}(\tau)}{\eta_{5,2}(\tau)}. \end{gather*} This relation involves only $R(q)^5$ and $R(q^5)$, which are both modular functions for $\Gamma_1(25)$. Let us compute the modular polynomial between the two.
rspec := eqSPEC(25, [[5,1,1],[5,2,-1]]);
rspec5 := rspec^5;
r5spec := eqSPEC(25, [[25,5,1],[25,10,-1]]);
specrx := rspec5::SPECR(ZZ);
specry := r5spec::SPECR(ZZ);
[pretty(specrx, formatAsExpression()), pretty(specry, formatAsExpression())]
[level specrx, level specry]
[modularGamma1? specrx, modularGamma1? specry]
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(25)$QMOD1
rspecs := [rspec5, r5spec];
yauxs := [specYM1EQ(spec,gammas) for spec in rspecs];
qgrdss := [qetaGrades x for x in yauxs]
Cusps that correspond to non-poles in the series expansions for both $R(q)^5$ and $R(q^5)$ can be excluded for the computation of the modular polynomial between the two.
trfs := [gammas.i for i in 1..#qgrdss.1 | qgrdss.1.i > 0 or qgrdss.2.i > 0]
spitzen := map(cusp, trfs)
For the expansions at the remaining cusps, the coefficient ring must be extended. From the data we have, we conclude that an extension by a primitive 10-th root of unity (we call it $\xi$) is enough.
ys := [specYM1EQ(spec,trfs) for spec in rspecs];
xiord := lcm [minimalRootOfUnity(y)::PP for y in ys]
EXTENDEDCOEFFICIENTRING(C, xiord, CX, xi);
ans := [specM1An(CX)(x) for x in rspecs]
a1 := ans.1
a2 := ans.2
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
The modular polynomial between $x=R(q)^5$ and $y=R(q^5)$ can easily be computed and agrees with the equation given above.
mp := modPolynomial([a1,a2],[x,y],[])
c0 := coefficient(mp,x,0); c1 := -coefficient(mp,x,1);
x = c0/c1
assertEquals(c0/c1, y * ((1-2*y+4*y^2-3*y^3+y^4)) / (1+3*y+4*y^2+2*y^3+y^4))
Note that $\xi$ is a primitive 10-th root of unity.
factor c0
factor c1
-------------------------------------------------------------------
--endtest
-------------------------------------------------------------------
Find Modular Equations for $R(q)$ and $R(q^n)$¶
Modular Equations for $R(q)$ and $R(q^{n})$, $n\not\equiv0\pmod5$¶
-------------------------------------------------------------------
--test:RogersRamanujanModularPolynomials
-------------------------------------------------------------------
In this section we compute the modular polynomial between $R(q)$ and $R(q^n)$ for $n$ not congruent to 0 modulo 5.
For this demonstration we choose $n=2$ and find the relation \begin{align*} \frac{R(q^2) - R(q)^2}{R(q^2) + R(q)^2} &= R(q) R(q^2)^2 \end{align*} that was already given by Ramanujan in his Lost Notebook (p. 365).
n := 2
rspec := eqSPEC(5, [[5,1,1],[5,2,-1]]);
r2spec := dilate(rspec, n);
r1spec := eqSPEC(level r2spec, parts rspec);
Unfortunately, these eta-quotients are not modular functions for $\Gamma_1(10)$.
[level x for x in [r1spec,r2spec]]
[modularGamma1? x for x in [r1spec,r2spec]]
Thus we look for a modular equation of $R(q^5)$ and $R(q^{5n})$.
rspecs := [dilate(x,5) for x in [r1spec, r2spec]];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in rspecs]
Those are modular functions for $\Gamma_1(50)$.
[level x for x in rspecs]
[modularGamma1? x for x in rspecs]
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.
nn := lcm [level x for x in rspecs]
gammas := cuspMatrices(nn)$QMOD1;
yauxs := [specYM1EQ(spec,gammas) for spec in rspecs];
qgrdss0 := [qetaGrades x for x in yauxs]
Cusps that correspond to non-poles in the series expansions for both $R(q^5)$ and $R(q^{5n})$ can be excluded for the computation of the modular polynomial between the two.
trfs0 := [gammas.i for i in 1..#qgrdss0.1 | qgrdss0.1.i > 0 or qgrdss0.2.i > 0]
#trfs0
Unfortunately, if we look at the pole orders of the remaining cusps, neither $R(q^5)$ nor $R(q^{5n})$ has positive pole order at all these cusps.
matrix [qetaGrades specYM1EQ(x,trfs0) for x in rspecs]
We realize, however, that if we start with $R(q^5)R(q^{25n})^n$ and $R(q^{25n})$, we can remove more cusps and end with an element that has proper poles at all the remaining cusps.
rrspecs := [dilate(x,5) for x in [r1spec*r2spec^n, r2spec]];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in rrspecs]
ys0 := [specYM1EQ(x,gammas) for x in rrspecs];
qgrdss := [qetaGrades x for x in ys0];
trfs := [gammas.i for i in 1..#qgrdss.1 | qgrdss.1.i > 0 or qgrdss.2.i > 0];
#trfs
For the expansions at the remaining cusps, the coefficient ring must be extended. From the data we have, we conclude that an extension by a 10-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^5)R(q^{5n})^n$ and $y=R(q^{5n})$ can easily be computed.
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
mp := modPolynomial(reverse ans,[y,x],[])
Let us express that polynomial in the original functions $u=R(q^5)$ and $v=R(q^{5n})$. The first factor is a power of $y=v$ and can be ignored.
)clear prop v
fl := factorList factor eval(mp,[x=u*v^n,y=v]);
fl.1
modpol := fl.2.factor
The second factor agrees with the equation of Ramanujan given above.
if n=2 then assertEquals(u*v^2*(v+u^2) - (v-u^2), modpol)
For $n=3$ the following should be true.
if n=3 then assertEquals((v-u^3)*(1+u*v^3)-3*u^2*v^2, modpol)
-------------------------------------------------------------------
--endtest
-------------------------------------------------------------------
Modular Equations for $R(q)$ and $R(q^{5n})$¶
-------------------------------------------------------------------
--test:time36-RogersRamanujanModularPolynomials-5
-------------------------------------------------------------------
In this section we compute the modular polynomial between $R(q)$ and $R(q^{5n})$. In a previous section we found the modular polynomial between $R(q)^5$ and $R(q^5)$. This time we do not actually pretend that the modular polynomial is in $R(q)^5$ instead of $R(q)$. However, the computation delivers that $R(q)$ always comes in powers of 5.
For demonstration let us set $n=2$. We have to find a modular polynomial between the following two eta-quotients.
n := 2
rspec := eqSPEC(5, [[5,1,1],[5,2,-1]]);
r2spec := dilate(rspec, 5*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(50)$.
[level x for x in rspecs]
[modularGamma1? x for x in rspecs]
So instead, we consider $R(q^5)$ and $R(q^{25n})$ as modular functions for $\Gamma_1(250)$.
rrspecs0 := [dilate(x,5) for x in rspecs];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in rrspecs0]
nn := lcm [level x for x in rrspecs0]
[modularGamma1? x for x in rrspecs0]
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;
yauxs0 := [specYM1EQ(x,gammas) for x in rrspecs0];
qgrdss0 := [qetaGrades x for x in yauxs0]
Cusps that correspond to non-poles in the series expansions for both $R(q^5)$ and $R(q^{25k})$ can be excluded for the computation of the modular polynomial between the two.
trfs0 := [gammas.i for i in 1..#qgrdss0.1 | qgrdss0.1.i > 0 or qgrdss0.2.i > 0]
#trfs0
Unfortunately, if we look at the pole orders of the remaining cusps, neither $R(q^5)$ nor $R(q^{25n})$ has positive pole order at all these cusps.
vgrdss0 := [vector qetaGrades specYM1EQ(x,gammas) for x in rrspecs0]
We realize, however, that if we start with $R(q^5)R(q^{25n})$ and $R(q^{25n})$, we can remove more cusps and end with an element that has proper poles at all the remaining cusps.
rrspecs := [rrspecs0.1*rrspecs0.2, rrspecs0.2]
lcm [level x for x in rrspecs]
[modularGamma1? x for x in rrspecs]
yauxs := [specYM1EQ(x,gammas) for x in rrspecs];
qgrdss := [qetaGrades x for x in yauxs]
trfs := [gammas.i for i in 1..#qgrdss.1 | qgrdss.1.i > 0 or qgrdss.2.i > 0]
#trfs
For the expansions at the remaining cusps, the coefficient ring must be extended. From the data we have, we conclude that an extension by a 10-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^5)$ and $y=R(q^{25n})$ can easily be computed and agrees with a result computed by Michael Trott in Modular equations of the Rogers-Ramanujan continued fraction, Mathematica Journal, 2004.
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
)time on
mp := modPolynomial(ans,[x,y],[]);
)time off
We only need the second factor.
fl := factorList factor eval(mp,[x=u*v,y=v]);
fl.1
modpol := fl.2.factor;
f1 := v^4-3*v^3+4*v^2-2*v+1;
f2 := v^4+2*v^3+4*v^2+3*v+1;
f3 := v^10+4*v^9+17*v^8+32*v^7+120*v^6+248*v^5+342*v^4+296*v^3+181*v^2+70*v+10;
f4 := 10*v^10-70*v^9+181*v^8-296*v^7+342*v^6-248*v^5+120*v^4-32*v^3+17*v^2-4*v+1;
assertEquals(modpol,
u^15 * v^2 * f1^2 * f2_
+ u^10 * f2 * f4_
+ u^5 * v * f1 * f3_
- v * f1 * f2^2)
-------------------------------------------------------------------
--endtest
-------------------------------------------------------------------
Modular Equations for $R(q)$ and $R(q^{5n})$, Gröbner basis method¶
-------------------------------------------------------------------
--test:RogersRamanujanModularPolynomials-5-GB
-------------------------------------------------------------------
For this demonstration we choose $n=2$. We already know the two relations from the previous sections. \begin{align*} \frac{R(q^2) - R(q)^2}{R(q^2) + R(q)^2} &= R(q) R(q^2)^2 \\ R(q)^5 &= R(q^5)\cdot \frac{1 - 2 R(q^5) + 4 R(q^5)^2 - 3 R(q^5)^3 + R(q^5)^4} {1 + 3 R(q^5) + 4 R(q^5)^2 + 2 R(q^5)^3 + R(q^5)^4} \end{align*}
If we replace $q$ by $q^5$ in the first relation,
combine it with the second relation and then eliminate
the variable R5
by computing a Gröbner basis.
rels := [R5*R10^2*(R10+R5^2) - (R10-R5^2),_
R1^5 * (1+3*R5+4*R5^2+2*R5^3+R5^4) - R5*(1-2*R5+4*R5^2-3*R5^3+R5^4)]
gb := groebnerEliminate(rels,[R5],[R1,R10])$QEtaGroebnerBasisTools
#gb
-- TIME:=0.01
modpol := eval(gb.1, [R1=u,R10=v])
f1 := v^4-3*v^3+4*v^2-2*v+1;
f2 := v^4+2*v^3+4*v^2+3*v+1;
f3 := v^10+4*v^9+17*v^8+32*v^7+120*v^6+248*v^5+342*v^4+296*v^3+181*v^2+70*v+10;
f4 := 10*v^10-70*v^9+181*v^8-296*v^7+342*v^6-248*v^5+120*v^4-32*v^3+17*v^2-4*v+1;
assertEquals(modpol,
u^15 * v^2 * f1^2 * f2_
+ u^10 * f2 * f4_
+ u^5 * v * f1 * f3_
- v * f1 * f2^2)
With this method, it suffices to find modular equations for $R(q)$ and $R(q^n)$ if $n$ is a prime.
-------------------------------------------------------------------
--endtest
-------------------------------------------------------------------
Modular Equations for $R(q)$ and $R(-q)$¶
-------------------------------------------------------------------
--test:RogersRamanujanModularPolynomials-minus
-------------------------------------------------------------------
In this section we compute the modular polynomial between $R(q)$ and $R(-q)$.
From the definition of $R(q)$ as a generalized eta-quotient, it is easy to show that \begin{align*} R(-q^5) &= \frac{\eta_{50,15}(\tau) \eta_{50,20}(\tau) \eta_{100,10}(\tau)} {\eta_{50, 5}(\tau) \eta_{50,10}(\tau) \eta_{100,30}(\tau)}. \end{align*} We compute the relation \begin{align*} uv(u-v)^4 - u^2v^2(u-v)^2+2*u^3v^3 + (u-v)(1+u^5v^5) &=0 \end{align*} for $u=R(q^5)$ and $v=R(-q^5)$. See https://link.springer.com/article/10.1023/A:1013991704758#preview.
rspec := eqSPEC(5, [[5,1,1],[5,2,-1]]);
r2spec := eqSPEC[[10,1,-1],[10,2,-1],[10,3,1],[10,4,1],[20,2,1],[20,6,-1]]
r1spec := eqSPEC(level r2spec, parts rspec)
Unfortunately, these eta-quotients are not modular functions for $\Gamma_1(20)$.
[level x for x in [r1spec,r2spec]]
[modularGamma1? x for x in [r1spec,r2spec]]
Thus we look for a modular equation of $R(q^5)$ and $R(q^{5n})$.
rspecs := [dilate(x,5) for x in [r1spec, r2spec]];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in rspecs]
Those are modular functions for $\Gamma_1(100)$.
[level x for x in rspecs]
[modularGamma1? x for x in rspecs]
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.
nn := lcm [level x for x in rspecs]
gammas := cuspMatrices(nn)$QMOD1; #gammas
yauxs := [specYM1EQ(spec,gammas) for spec in rspecs];
qgrdss0 := [qetaGrades x for x in yauxs]
Cusps that correspond to non-poles in the series expansions for both $R(q^5)$ and $R(-q^5)$ can be excluded for the computation of the modular polynomial between the two.
trfs0 := [gammas.i for i in 1..#qgrdss0.1 | qgrdss0.1.i > 0 or qgrdss0.2.i > 0]
#trfs0
Unfortunately, if we look at the pole orders of the remaining cusps, neither $R(q^5)$ nor $R(-q^5)$ has positive pole order at all these cusps.
matrix [qetaGrades specYM1EQ(x,trfs0) for x in rspecs]
We realize, however, that if we start with $R(q^5)$ and $R(q^5)^4 R(-q^5)$, we can remove more cusps and end with an element that has proper poles at all the remaining cusps.
rrspecs := [dilate(x,5) for x in [r1spec, r1spec^4*r2spec]];
[pretty(x::SPECR(ZZ), formatAsExpression()) for x in rrspecs]
ys0 := [specYM1EQ(x,gammas) for x in rrspecs];
qgrdss := [qetaGrades x for x in ys0];
trfs := [gammas.i for i in 1..#qgrdss.1 | qgrdss.1.i > 0 or qgrdss.2.i > 0];
#trfs
For the expansions at the remaining cusps, the coefficient ring must be extended. From the data we have, we conclude that an extension by a primitive 10-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^5)R(q^{5n})^n$ and $y=R(q^{5n})$ can easily be computed.
modPolynomial ==> modularPolynomial$QEtaModularEquation(CX, An CX)
mp := modPolynomial([ans.1, ans.2],[x,y],[])
Let us express that polynomial in the original functions $u=R(q^5)$ and $v=R(-q^5)$. The first factor is a power of $y=v$ and can be ignored.
modpol := (eval(mp,[x=u,y=u^4*v])/u^19) :: Pol(ZZ)
epol := u*v*(u-v)^4 - u^2*v^2*(u-v)^2 + 2*u^3*v^3 + (u-v)*(1+u^5*v^5)
assertEquals(modpol, -epol)
-------------------------------------------------------------------
--endtest
-------------------------------------------------------------------