FUNCTION : qseries[jacprodmake] - Convert a q-series into a product of
theta functions if possible
VERSION: May 4, 2010
CALLING SEQUENCE : jacprodmake(f,q,T)
jacprodmake(f,q,T,P)
PARAMETERS : f - q-series
T,P - positive integers
GLOBAL VARIABLES : xprint,ft0,fixjacp:
SYNOPSIS :
jacprodmake(f,q,T) converts the q-series f into a product of theta
T
functions that agrees with f to O(q ).
Each theta-function has the form JAC(a,b), where a,b are integers
and 0 < a < b.
=
If 0 < a, then JAC(a,b) corresponds to the theta-product
a b b-a b b b
(q , q ) (q , q ) (q , q )
oo oo oo
If a = 0, then JAC(0,b) corresponds to the eta-product
b b
(q , q )
oo
jacprodmake(f,q,T,P) is a version that searches for theta-products
where b is a divisor of P. If xprint=true then extra information is
printed as the program runs. An ERROR is returned if f is NOT a jac-prod.
In this case the global var fixjacp saves the value of args.
In this new version jacprodmake should still work even if the
coefficient of q^0 is not 1.
CHANGES :
1.2: o Changed failure from ERROR to WARNING
o Changed handling of half-integer exponents
EXAMPLES :
> with(qseries);
> x:=tripleprod(q,q^5,10);
99 70 46 27 13 4 7 18 34 55 81
x := q - q + q - q + q - q + 1 - q + q - q + q - q + q
> jacprodmake(x,q,50);
JAC(1, 5)
> XX:=series( (1- theta4(q,60)^2/theta4(q^5,12)^2)/4/q,q,60);
3 4 5 6 7 8 9 10 11 12
XX := 1 - q - q + q + 4 q - 4 q - q - 3 q + 3 q + 12 q - 12 q - 2 q
13 14 15 16 17 18 19 20
- 8 q + 8 q + 31 q - 30 q - 5 q - 20 q + 19 q + 72 q
21 22 23 24 25 26 27 28
- 68 q - 12 q - 44 q + 41 q + 154 q - 144 q - 24 q - 90 q
29 30 31 32 33 34 35
+ 84 q + 312 q - 289 q - 48 q - 178 q + 164 q + 603 q
36 37 38 39 40 41 42
- 554 q - 92 q - 336 q + 307 q + 1122 q - 1024 q - 168 q
43 44 45 46 47 48 49
- 612 q + 557 q + 2024 q - 1836 q - 300 q - 1087 q + 983 q
50 51 52 53 54 55 56
+ 3552 q - 3206 q - 522 q - 1880 q + 1692 q + 6088 q - 5472 q
57 58 59
- 886 q - 3180 q + O(q )
> jacprodmake(XX,q,50);
JAC(1, 10) JAC(3, 10)
---------------------
2
JAC(5, 10)
> V:=add(q^n/aqprod(q,q,2*n+1),n=0..100):
> jacprodmake(V,q,50);
8 / 2
JAC(0, 16, infinity) / (JAC(1, 16, infinity) JAC(3, 16, infinity) JAC(4, 16, infinity)
/
2
JAC(5, 16, infinity) JAC(6, 16, infinity) JAC(7, 16, infinity) )
> xprint:=true:
> jacprodmake(V,q,50);
"jacmake started with args", _A, 49
8 / 2
JAC(0, 16, infinity) / (JAC(1, 16, infinity) JAC(3, 16, infinity) JAC(4, 16, infinity)
/
2
JAC(5, 16, infinity) JAC(6, 16, infinity) JAC(7, 16, infinity) )
> jacprodmake(V,q,50,16);
"_A done"
"jacmake started with args", _A, 49, 16
"TRYING period pp=", 2
"TRYING period pp=", 4
"TRYING period pp=", 8
"TRYING period pp=", 16
8 / 2
JAC(0, 16, infinity) / (JAC(1, 16, infinity) JAC(3, 16, infinity) JAC(4, 16, infinity)
/
2
JAC(5, 16, infinity) JAC(6, 16, infinity) JAC(7, 16, infinity) )
> jacprodmake(V,q,50,8);
"_A done"
"jacmake started with args", _A, 49, 8
"TRYING period pp=", 2
"TRYING period pp=", 4
"TRYING period pp=", 8
ERROR: PP should be multiple of pp
Error, (in jacprodmake) jacprodmake failed (see gobal var fixjacp)
> Y:=add(q^(n*(n+1)/2),n=-20..20);
45 36 28 21 15 10 6 3 55 190
Y := 2 + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q
171 153 136 120 105 91 78 66 210
+ 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + 2 q + q
> jacprodmake(Y,q,100);
2 JAC(0, 2, infinity)
------------------------
/JAC(1, 2, infinity)\1/2
|-------------------|
\JAC(0, 2, infinity)/
> V:=add( (q)^(n)/aqprod(q,q,max(min(2*n+1,400-n),0)),n=0..400):
> V:=series(V,q,350):
> jacprodmake(V2*aqprod(q,q^2,150),q,300);
"jacmake started with args", _A, 299
4
JAC(0, 16, infinity)
-----------------------------------------------------------------------------------
JAC(1, 16, infinity) JAC(4, 16, infinity) JAC(6, 16, infinity) JAC(7, 16, infinity)
SEE ALSO : jac2prod