unlisted
ubuntu2004r"""1Evaluation of integrals of cohomology classes against the fundamental class2"""34from sage.misc.cachefunc import cached_function5from sage.rings.integer_ring import ZZ6from sage.combinat.subset import Subsets7from sage.arith.misc import bernoulli, multinomial8910from .moduli import MODULI_ST, MODULI_CT, MODULI_RT, MODULI_SM, dim_form11from .utils import setparts_with_auts12from .graph import single_stratum131415def socle_evaluation(num, g, markings=(), moduli_type=MODULI_ST):16r"""17EXAMPLES::1819sage: from admcycles.DR.graph import num_strata20sage: from admcycles.DR.moduli import MODULI_ST21sage: from admcycles.DR.evaluation import socle_evaluation22sage: g = 223sage: markings = (1,)24sage: for i in range(num_strata(g, 3*g-3+len(markings), (1,))):25....: print(i, socle_evaluation(i, g, markings, MODULI_ST))260 1/1152271 13/1920282 53/5760293 259/5760304 29/128315 1/384326 101/5760337 169/1920348 29/5760359 139/57603610 29/57603711 1/11523812 1/57639...4076 24177 24278 14379 14480 14581 14682 14783 14884 14985 15086 15187 15288 15389 15490 15591 156"""57answer = 158G = single_stratum(num, g, dim_form(59g, len(markings), moduli_type), markings, moduli_type)60for i in range(1, G.M.nrows()):61g0 = G.M[i, 0][0]62psilist = []63for j in range(1, G.M.ncols()):64if G.M[i, j][0] > 0:65psilist.append(G.M[i, j][1])66if G.M[i, j][0] == 2:67psilist.append(G.M[i, j][2])68n0 = len(psilist)69dim0 = dim_form(g0, n0, moduli_type)70kappalist = []71for j in range(1, dim0 + 1):72for k in range(G.M[i, 0][j]):73kappalist.append(j)74if sum(psilist) + sum(kappalist) != dim0:75raise ValueError("wrong dimension")76answer *= socle_formula(g0, psilist, kappalist, moduli_type)77return answer787980def socle_formula(g, psilist, kappalist, moduli_type=MODULI_ST):81r"""82Return the integral of a product of kappa and psi classes.8384EXAMPLES::8586sage: from admcycles.DR.evaluation import socle_formula87sage: from admcycles.DR.moduli import MODULI_SM, MODULI_RT, MODULI_CT, MODULI_ST8889sage: socle_formula(4, [], [2], MODULI_SM)901/322560091sage: socle_formula(4, [], [1, 1], MODULI_SM)921/30240093sage: socle_formula(3, [0], [2], MODULI_SM)941/12096095sage: socle_formula(3, [0], [1, 1], MODULI_SM)961/1344097sage: socle_formula(3, [1], [1], MODULI_SM)981/2419299sage: socle_formula(3, [2], [], MODULI_SM)1001/120960101102sage: socle_formula(3, [0], [2], MODULI_RT)1031/120960104sage: socle_formula(3, [0], [1, 1], MODULI_RT)1051/13440106sage: socle_formula(3, [1], [1], MODULI_RT)1071/24192108sage: socle_formula(3, [2], [], MODULI_RT)1091/120960110111sage: socle_formula(4, [], [5], MODULI_CT)112127/154828800113sage: socle_formula(4, [], [1, 4], MODULI_CT)114127/7741440115sage: socle_formula(4, [], [2, 3], MODULI_CT)1162159/77414400117sage: socle_formula(4, [], [1, 1, 1, 1, 1], MODULI_CT)1183171571/77414400119120sage: socle_formula(3, [], [6], MODULI_ST)1211/82944122sage: socle_formula(3, [], [1, 5], MODULI_ST)1231/5760124sage: socle_formula(3, [], [2, 4], MODULI_ST)125971/2903040126sage: socle_formula(3, [], [1, 1, 4], MODULI_ST)1272173/967680128sage: socle_formula(3, [], [1, 1, 1, 1, 1, 1], MODULI_ST)129176557/107520130"""131degree = sum(psilist) + sum(kappalist)132n = len(psilist)133if moduli_type == MODULI_SM:134if degree != g - 1 + (g == 0) - (n == 0):135raise ValueError("invalid degree")136elif moduli_type == MODULI_RT:137if degree != g - 2 + n - (g == 0):138raise ValueError("invalid degree")139elif moduli_type == MODULI_CT:140if degree != 2 * g - 3 + n:141raise ValueError("invalid degree")142elif moduli_type == MODULI_ST:143if degree != 3 * g - 3 + n:144raise ValueError("invalid degree")145146if moduli_type == MODULI_CT or g == 0:147return CTconst(g) * CTsum(psilist, kappalist)148if moduli_type <= MODULI_SM or moduli_type == MODULI_RT:149return RTconst(g) * RTsum(g, psilist, kappalist)150if moduli_type == MODULI_ST:151return STsum(psilist, kappalist)152153154def multi2(g, sigma):155r"""156EXAMPLES::157158sage: from admcycles.DR.evaluation import multi2159sage: multi2(3, [3, 0])1601161sage: multi2(3, [2])1621163sage: multi2(3, [2, 2, 0])16410165"""166sigma.sort()167if sigma[0] == 0:168total = ZZ.zero()169for i in range(len(sigma) - 1):170sigmacopy = sigma[1:]171if sigmacopy[i] > 0:172sigmacopy[i] -= 1173total += multi2(g, sigmacopy)174return total175term = ZZ(2 * g - 3 + len(sigma)).factorial()176term *= ZZ(2 * g - 1).multifactorial(2)177term /= ZZ(2 * g - 1).factorial()178for i in sigma:179term /= ZZ(2 * i - 1).multifactorial(2)180return term181182183def STsum(psilist, kappalist):184kappalist.sort()185total = 0186for i0, i1 in setparts_with_auts(kappalist):187total += (-1)**(len(i0)) * i1 * \188STrecur([1 + sum(j) for j in i0] + psilist)189return total * (-1)**(len(kappalist))190191192def RTsum(g, psilist, kappalist):193kappalist.sort()194total = ZZ.zero()195for i0, i1 in setparts_with_auts(kappalist):196total += (-1) ** len(i0) * i1 * \197multi2(g, [1 + sum(j) for j in i0] + psilist)198return total * (-1)**(len(kappalist))199200201def CTsum(psilist, kappalist):202kappalist.sort()203total = ZZ.zero()204for i0, i1 in setparts_with_auts(kappalist):205total += (-1)**len(i0) * i1 * \206multinomial([1 + sum(j) for j in i0] + psilist)207return total * (-1)**len(kappalist)208209210def CTconst(g):211"""212Sequence of rational numbers related to Bernoulli numbers.213214INPUT: an integer g215216OUTPUT: a rational217218EXAMPLES::219220sage: from admcycles.DR.evaluation import CTconst221sage: [CTconst(g) for g in range(12)]222[1,2231/24,2247/5760,22531/967680,226127/154828800,22773/3503554560,2281414477/2678117105664000,2298191/612141052723200,23016931177/49950709902213120000,2315749691557/669659197233029971968000,23291546277357/420928638260761696665600000,2333324754717/603513268363481705349120000]234"""235gg = 2 * ZZ(g)236power = ZZ(2)**(gg - 1)237return ((power - 1) * bernoulli(gg)).abs() / (power * ZZ(gg).factorial())238239240@cached_function241def RTconst(g):242r"""243Universal constant computing the intersection number244245\int_{Mbar_{g,n}} \psi_1^{g-1} \lambda_g \lambda_{g-1}.246247EXAMPLES::248249sage: from admcycles.DR.evaluation import RTconst250sage: [RTconst(g) for g in range(12)]251[1,2521/24,2531/2880,2541/120960,2551/3225600,2561/63866880,257691/697426329600,2581/13284311040,2593617/541999890432000,26043867/64877386884710400,261174611/2265559542005760000,26277683/7958292791191142400]263264TESTS::265266sage: from admcycles import TautologicalRing267sage: R = TautologicalRing(1,1)268sage: (R.psi(1)^0*R.lambdaclass(1)*R.lambdaclass(0)).evaluate()2691/24270sage: R = TautologicalRing(2,1)271sage: (R.psi(1)^1*R.lambdaclass(2)*R.lambdaclass(1)).evaluate()2721/2880273sage: R = TautologicalRing(3,1)274sage: (R.psi(1)^2*R.lambdaclass(3)*R.lambdaclass(2)).evaluate()2751/120960276"""277if g == 0:278return ZZ(1)279return (bernoulli(2 * ZZ(g))).abs() / (2**(2 * g - 1) * ZZ(2 * g - 1).multifactorial(2) * 2 * g)280281282def STrecur(psi):283"""284Integral of psi classes.285286INPUT: a sorted tuple of nonegative integers287288OUTPUT: a rational289290EXAMPLES::291292sage: from admcycles.DR.evaluation import STrecur293sage: STrecur((0, 0, 0))2941295sage: STrecur((1,))2961/24297sage: STrecur((4,))2981/1152299sage: STrecur((7,))3001/82944301sage: STrecur((2,) * 3)3027/240303sage: STrecur((2,) * 6)3041225/144305sage: STrecur((1,) * 3)3061/12307"""308return STrecur_calc(tuple(sorted(psi)))309310311@cached_function312def STrecur_calc(psi):313if not psi:314return ZZ.one()315s = sum(psi)316n = len(psi)317if (s - n) % 3:318return ZZ.zero()319if psi[0] == 0:320if s == 0 and n == 3:321return ZZ.one()322total = ZZ.zero()323psi_end = list(psi[1:])324for i in range(n - 1):325psicopy = list(psi_end)326if psicopy[i] > 0:327psicopy[i] -= 1328total += STrecur(psicopy)329return total330331g = ZZ(s - n) // 3 + 1 # in ZZ332d = ZZ(psi[-1])333total = ZZ.zero()334335psicopy = [0, 0, 0, 0] + list(psi)336psicopy[-1] += 1337total += (2 * d + 3) / 12 * STrecur(psicopy)338339psicopy = [0, 0, 0] + list(psi)340total -= (2 * g + n - 1) / 6 * STrecur(psicopy)341342for I in Subsets(list(range(n - 1))):343# 3g - 3 + n344nI = len(I) + 2345degI = sum(psi[i] for i in I)346if (degI - nI) % 3 != 0:347continue348gI = (degI - nI) // 3 + 1349if 2 * gI - 2 + nI <= 0:350continue351psi3 = [0, 0] + [psi[i] for i in I]352x = STrecur(psi3)353if not x:354raise ValueError355psi1 = [0, 0] + [psi[i] for i in range(n - 1) if i not in I] + [d + 1]356psi2 = list(psi1[1:])357psi2[-1] = d358total += ((2 * d + 3) * STrecur(psi1) -359(2 * g + n - 1) * STrecur(psi2)) * x360total /= (2 * g + n - 1) * (2 * g + n - 2)361return total362363364