def _cis_iterator(self, base_ring): r""" The cycle index series of the species of cyclic permutations is given by .. math:: -\sum_{k=1}^\infty \phi(k)/k * log(1 - x_k) which is equal to .. math:: \sum_{n=1}^\infty \frac{1}{n} * \sum_{k|n} \phi(k) * x_k^{n/k} . EXAMPLES:: sage: P = species.CycleSpecies() sage: cis = P.cycle_index_series() sage: cis.coefficients(7) [0, p[1], 1/2*p[1, 1] + 1/2*p[2], 1/3*p[1, 1, 1] + 2/3*p[3], 1/4*p[1, 1, 1, 1] + 1/4*p[2, 2] + 1/2*p[4], 1/5*p[1, 1, 1, 1, 1] + 4/5*p[5], 1/6*p[1, 1, 1, 1, 1, 1] + 1/6*p[2, 2, 2] + 1/3*p[3, 3] + 1/3*p[6]] """ from sage.combinat.sf.sf import SymmetricFunctions p = SymmetricFunctions(base_ring).power() zero = base_ring(0) yield zero for n in _integers_from(1): res = zero for k in divisors(n): res += euler_phi(k) * p([k]) ** (n // k) res /= n yield self._weight * res
def _cis_iterator(self, base_ring): r""" The cycle index series of the species of cyclic permutations is given by .. math:: -\sum_{k=1}^\infty \phi(k)/k * log(1 - x_k) which is equal to .. math:: \sum_{n=1}^\infty \frac{1}{n} * \sum_{k|n} \phi(k) * x_k^{n/k} . EXAMPLES:: sage: P = species.CycleSpecies() sage: cis = P.cycle_index_series() sage: cis.coefficients(7) [0, p[1], 1/2*p[1, 1] + 1/2*p[2], 1/3*p[1, 1, 1] + 2/3*p[3], 1/4*p[1, 1, 1, 1] + 1/4*p[2, 2] + 1/2*p[4], 1/5*p[1, 1, 1, 1, 1] + 4/5*p[5], 1/6*p[1, 1, 1, 1, 1, 1] + 1/6*p[2, 2, 2] + 1/3*p[3, 3] + 1/3*p[6]] """ from sage.combinat.sf.all import SFAPower p = SFAPower(base_ring) zero = base_ring(0) yield zero for n in _integers_from(1): res = zero for k in divisors(n): res += euler_phi(k)*p([k])**(n//k) res /= n yield self._weight*res
def cyclotomic_restriction(L,K): r""" Given two cyclotomic fields L and K, compute the compositum M of K and L, and return a function and the index [M:K]. The function is a map that acts as follows (here `M = Q(\zeta_m)`): INPUT: element alpha in L OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = \alpha`, where we view alpha as living in `M`. (Note that `\zeta_m` generates `M`, not `L`.) EXAMPLES:: sage: L = CyclotomicField(12) ; N = CyclotomicField(33) ; M = CyclotomicField(132) sage: z, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L,N) sage: n 2 sage: z(L.0) -zeta33^19*x sage: z(L.0)(M.0) zeta132^11 sage: z(L.0^3-L.0+1) (zeta33^19 + zeta33^8)*x + 1 sage: z(L.0^3-L.0+1)(M.0) zeta132^33 - zeta132^11 + 1 sage: z(L.0^3-L.0+1)(M.0) - M(L.0^3-L.0+1) 0 """ if not L.has_coerce_map_from(K): M = CyclotomicField(lcm(L.zeta_order(), K.zeta_order())) f = cyclotomic_restriction_tower(M,K) def g(x): """ Function returned by cyclotomic restriction. INPUT: element alpha in L OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = \alpha`, where we view alpha as living in `M`. (Note that `\zeta_m` generates `M`, not `L`.) EXAMPLES:: sage: L = CyclotomicField(12) sage: N = CyclotomicField(33) sage: g, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L,N) sage: g(L.0) -zeta33^19*x """ return f(M(x)) return g, euler_phi(M.zeta_order())//euler_phi(K.zeta_order()) else: return cyclotomic_restriction_tower(L,K), \ euler_phi(L.zeta_order())//euler_phi(K.zeta_order())
def cyclotomic_restriction(L, K): r""" Given two cyclotomic fields L and K, compute the compositum M of K and L, and return a function and the index [M:K]. The function is a map that acts as follows (here `M = Q(\zeta_m)`): INPUT: element alpha in L OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = \alpha`, where we view alpha as living in `M`. (Note that `\zeta_m` generates `M`, not `L`.) EXAMPLES:: sage: L = CyclotomicField(12) ; N = CyclotomicField(33) ; M = CyclotomicField(132) sage: z, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L,N) sage: n 2 sage: z(L.0) -zeta33^19*x sage: z(L.0)(M.0) zeta132^11 sage: z(L.0^3-L.0+1) (zeta33^19 + zeta33^8)*x + 1 sage: z(L.0^3-L.0+1)(M.0) zeta132^33 - zeta132^11 + 1 sage: z(L.0^3-L.0+1)(M.0) - M(L.0^3-L.0+1) 0 """ if not L.has_coerce_map_from(K): M = CyclotomicField(lcm(L.zeta_order(), K.zeta_order())) f = cyclotomic_restriction_tower(M, K) def g(x): """ Function returned by cyclotomic restriction. INPUT: element alpha in L OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = \alpha`, where we view alpha as living in `M`. (Note that `\zeta_m` generates `M`, not `L`.) EXAMPLES:: sage: L = CyclotomicField(12) sage: N = CyclotomicField(33) sage: g, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L,N) sage: g(L.0) -zeta33^19*x """ return f(M(x)) return g, euler_phi(M.zeta_order()) // euler_phi(K.zeta_order()) else: return cyclotomic_restriction_tower(L,K), \ euler_phi(L.zeta_order())//euler_phi(K.zeta_order())