# This file combines the files findQ and Hirzebruch into one program. # An example is given at the end of this file. FindQ := proc(FL, AL) global L,H,y,U; local i, A, F, C, P, CY; A := mul(1+y*exp(-i), i = AL); F := mul(1+y*exp(-i), i = FL); C := F/((1+y)*A); P := convert(FL,`*`); CY := P * eval(A/F, y = -1); PiStar(factor(normal(C * CY, expanded)), P); map(factor, convert(subs(exp(L) = 1/U, %),parfrac,U) ); end: # Evaluate C at H = point. Use L'Hopital if necessary. EVAL_AT := proc( C, point ) global H; local F,G; F := normal(C); F := [numer(F), denom(F)]; G := expand( eval(F, H = point) ); while testeq(G[2]) do if G[1] <> 0 then error "non-zero divided by zero" fi; F := [diff(F[1],H), diff(F[2],H)]; G := expand( eval(F, H = point) ) od; factor(G[1]/G[2]) end: # The input an is a list where each entry is of the form [co, i, point] # The program evaluates the i'th derivative of F at the point H = point, # multiplies that by co, and adds this up for all members of the list an. Apply_AN := proc(an, F) local i; add(`if`(i[1]=0, 0, i[1]*EVAL_AT(DIFF(F,i[2]),i[3])), i=an ) end: # i'th derivative of F w.r.t. H DIFF := proc(F,i) global H; options remember; if i=0 then F else normal( diff(procname(F,i-1), H) ) fi end: # The PiStar(C, P) program returns Apply_AN(an, C) for a suitable list an. # # See Apply_AN for notations. For each [co, i, point] in the list an, we can read # off the possible i's and points from the list P. Initially, we'll use unknowns # for the co's. Next, we apply Apply_AN(an, H^i) for a number of i's, and compare # with what the result should have been. This gives a set of equations, from which # the unknown co's can be computed. PiStar := proc(C, P) global H; local A, V, an, i,j, co, eq; if type(P,list) then A := convert(P,`*`) else A := P fi; V := factors(A * H^(degree(A,H)-ldegree(A,H)) )[2]; an := [seq(seq([co[i,j], j, solve(V[i][1],H)], j=0..V[i][2]-1), i=1..nops(V))]; eq := {seq(Apply_AN(an, H^i) + residue(H^i/A, H=infinity), i=0..nops(an))}; an := subs(solve(eq, {seq(i[1],i=an)}), an); Apply_AN(an,C) end: # If the base has Chern classes c1, c2, c3,... # then the first argument C in the input should be: 1 - c1*t + c2*t^2 - c3*t^3 + ... # # The second+third argument are as in FindQ. # # The third argument n specifies the t-adic precision; the procedure computes chi(y,t) # modulo t^n, so its output is usable for any base up to dimension n-1. # chi_t := proc(C, FL, AL, n) global y,t,L,U; local P,H,Q; P := -t*diff(C,t)/C; H := HadamardProduct(P, ln(t/(1-exp(-t))) + ln(1+y*exp(-t)), t, n); Q := subs(U = exp(-L*t), FindQ(FL, AL)); Series( eval(Q*exp(H), t=t*(1+y)), t,n) end: # HadamardProduct( sum a_i * t^i, sum b_i * t^i ) is defined as: sum a_i * b_i * t^i HadamardProduct := proc(f, g, t, n) local a,b,i; a,b := Series(f,t,n), Series(g,t,n); add( normal(coeff(a,t,i)*coeff(b,t,i))*t^i, i=0..n-1) end: # This computes f mod t^n, and then simplifies the coefficients. Series := proc(f, t, n) local fs; fs := series(f, t=0, n); if op(-1,fs) < n then error "Precision is only:", op(-1,fs) fi; sort(collect(convert(fs,polynom),t,simp),t,ascending) end: # This routine simplifies an expression by factoring it, and then # collecting and sorting it w.r.t. the variables L and y. simp := proc(a) global L,y; local v; v := factor(a); if type(v,`+`) and has(v,L) then sort(collect(v,L,procname),L) elif type(v,`+`) and has(v,y) then sort(collect(v,y,procname),y) elif type(v,`*`) or type(v,`^`) then map(procname,v) else v fi end: # This program computes the coefficient of y^i * t^j in chi(y,t). OneCoefficient := proc(C, FL, AL, i, j) global y,t; local acc, ch; acc := j+1; ch := chi_t(C, FL, AL, acc); ch := coeff(ch,t,j); acc := i+1; coeff(Series(ch + t*y^acc, y, acc), y, i) # is the coefficient of y^i * t^j end: ############ Example ############ # The series is valid for any dimension d, if you increase acc, you # will get more terms of the same power series. acc := 6; C := 1 + add( c||i * (-t)^i, i=1..acc); FL := [H,H,H+L]; AL := [3*H+2*L]; # Note: this could be called E7-star or E6-prime. ct := chi_t(C, FL, AL, acc); # View one coefficient: # OneCoefficient(C, FL, AL, 1, 3); # Let C5 be the coefficient of t^5. C5 := collect(subs(L = c1, coeff(ct, t, 5)), y, factor); # Now assume that the y^0 coefficient of C5 is 2. solve(coeff(C5, y, 0) = 2, c4); # and adjust C5 accordingly: C5 := sort(collect(subs(c4 = %, C5), y, factor),y); expand(6*coeff(C5,y,1)) mod 6; # congruent to 0 mod 6