Skip to content

Commit 81ded32

Browse files
committed
multisort set-like species
1 parent 886bad4 commit 81ded32

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

src/sage/rings/species.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
from sage.combinat.cyclic_sieving_phenomenon import orbit_decomposition
4444
from sage.combinat.free_module import CombinatorialFreeModule
4545
from sage.combinat.integer_vector import IntegerVectors
46+
from sage.combinat.integer_vector_weighted import WeightedIntegerVectors
4647
from sage.combinat.partition import Partitions, _Partitions
4748
from sage.combinat.sf.sf import SymmetricFunctions
4849
from sage.groups.perm_gps.constructor import PermutationGroupElement
@@ -592,7 +593,7 @@ def _rename(self, n):
592593
self(PermutationGroup(gens), pi, check=False).rename(f"Pb_{n}" + sort)
593594

594595
if self._arity == 1:
595-
_ = _atomic_set_like_species(n)
596+
_ = _atomic_set_like_species(n, self._names)
596597

597598
def __contains__(self, x):
598599
r"""
@@ -2513,39 +2514,56 @@ def factor(s, c, d):
25132514

25142515

25152516
@cached_function
2516-
def _atomic_set_like_species(n):
2517+
def _atomic_set_like_species(n, names):
25172518
r"""
25182519
Return a list of the atomic set like species of degree `n`,
25192520
and provide their traditional names.
25202521
25212522
INPUT:
25222523
25232524
- ``n`` -- positive integer, the degree
2525+
- ``names`` -- an iterable of strings for the sorts of the
2526+
species
25242527
25252528
EXAMPLES::
25262529
25272530
sage: from sage.rings.species import _atomic_set_like_species
2528-
sage: _atomic_set_like_species(6)
2531+
sage: _atomic_set_like_species(6, "X")
25292532
[E_2(E_3), E_2(X*E_2), E_2(X^3), E_3(E_2), E_3(X^2), E_6]
25302533
2531-
sage: oeis([len(_atomic_set_like_species(n)) for n in range(1,10)]) # optional - internet
2534+
sage: l = [len(_atomic_set_like_species(n, "X")) for n in range(12)]
2535+
sage: l
2536+
[0, 1, 1, 1, 3, 1, 6, 1, 10, 4, 12, 1]
2537+
sage: oeis(l) # optional - internet
25322538
0: A007650: Number of set-like atomic species of degree n.
2539+
2540+
sage: _atomic_set_like_species(4, "U, V")
2541+
[E_2(E_2(V)), E_2(E_2(U)), E_2(V^2), E_2(U*V), E_2(U^2), E_4(U), E_4(V)]
25332542
"""
2534-
M = MolecularSpecies("X")
2543+
if not n:
2544+
return []
2545+
M1 = MolecularSpecies("X")
2546+
M = MolecularSpecies(names)
25352547
if n == 1:
2536-
return [M(SymmetricGroup(1))]
2548+
return [M(SymmetricGroup(1), {s: [1]}) for s in range(M._arity)]
25372549
result = []
25382550
for d in divisors(n):
25392551
if d == 1:
25402552
continue
2541-
E_d = M(SymmetricGroup(d))
25422553
if d == n:
2543-
result.append(E_d)
2554+
result.extend(M(SymmetricGroup(n), {s: range(1, n+1)})
2555+
for s in range(M._arity))
25442556
continue
2545-
for pi in Partitions(n // d):
2546-
for l_F in cartesian_product([_atomic_set_like_species(p) for p in pi]):
2547-
G = prod(l_F)
2548-
F = E_d(G)
2549-
F.support()[0].rename(f"E_{d}({G})")
2550-
result.append(F)
2557+
E_d = M1(SymmetricGroup(d))
2558+
l = []
2559+
w = []
2560+
for degree in range(1, n // d + 1):
2561+
a_degree = _atomic_set_like_species(degree, names)
2562+
l.extend(a_degree)
2563+
w.extend([degree]*len(a_degree))
2564+
for a in WeightedIntegerVectors(n // d, w):
2565+
G = prod(F ** e for F, e in zip(l, a))
2566+
F = E_d(G)
2567+
F.support()[0].rename(f"E_{d}({G})")
2568+
result.append(F)
25512569
return result

0 commit comments

Comments
 (0)