def lvector(nu, mu, p_max): ans = LCACHE.get((nu, mu), RowVector()) if len(ans) >= p_max: return ans.subvector(p_max) for p in range(len(ans), p_max): v = 0 for lam in lshapes(nu, mu): c = sum(lam) - sum(mu) if p == 0: d = Tableau.KOG_counts(nu, lam, p) else: d = 2 * Tableau.KOG_counts(nu, lam, p) + Tableau.KOG_counts( nu, lam, p + 1) v += d * 2**(len(mu) - c) * (-1)**(columns(lam, mu) + c) if p == 0 and columns(nu, mu) == 1: v *= -1 ans.append(v) LCACHE[(nu, mu)] = ans return ans
def test_gq_pieri(n=4, m=10, l=5): for mu in Partition.all(m, strict=True): if not mu: continue f = gq(n, mu) for p in range(1, l + 1): g = gq(n, (p,)) actual = f * g expected = 0 pieri = gq_pieri(mu, p) for (lam, c) in pieri.items(): expected += gq(n, lam) * c # print('gq_%s(x_%s)' % (mu, n), '*', 'gq_%s(x_%s)' % (p, n)) # print(' ', actual - expected) # print() assert actual == expected q = mu[0] if mu else 0 nu = (q + p,) + mu print() print(Partition.printable(nu, mu, shifted=True)) print() print('mu =', mu, 'p =', p, 'q =', q) print() rho1 = (q + p,) + mu[1:] rho2 = (q + p - 1,) + mu[1:] for lam in pieri: co = pieri[lam].substitute(0, 1) co = co - 1 if lam in [rho1, rho2] else co kog = Tableau.KOG_counts(nu, lam, q) print(lam, co, kog) assert co == kog print()