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