Skip to content

Commit f0cc54e

Browse files
committed
fix algorithm, add doctests
1 parent 52e366b commit f0cc54e

File tree

1 file changed

+47
-20
lines changed

1 file changed

+47
-20
lines changed

src/sage/combinat/partition.py

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2505,21 +2505,48 @@ def franklin_glaisher(self, s):
25052505
sage: Partition([4, 3, 2, 2, 1]).franklin_glaisher(2)
25062506
[3, 2, 2, 1, 1, 1, 1, 1]
25072507
2508-
TESTS::
2508+
TESTS:
2509+
2510+
The map preserves the size::
2511+
2512+
sage: all(mu.franklin_glaisher(s).size() == n
2513+
....: for n in range(20) for mu in Partitions(n)
2514+
....: for s in range(1, 5))
2515+
True
2516+
2517+
The map is bijective::
2518+
2519+
sage: l = [[mu.franklin_glaisher(s)
2520+
....: for n in range(20) for mu in Partitions(n)]
2521+
....: for s in range(1, 5)]
2522+
sage: all(len(set(ls)) == len(ls) for ls in l)
2523+
True
2524+
2525+
The map transports the statistics::
25092526
25102527
sage: d = lambda la, s: set(p / s for p in la if p % s == 0)
25112528
sage: r = lambda la, s: set(p for p in la if list(la).count(p) >= s)
25122529
sage: all(d(mu, s) == r(mu.franklin_glaisher(s), s)
25132530
....: for n in range(20) for mu in Partitions(n)
25142531
....: for s in range(1, 5))
25152532
True
2533+
2534+
For `s=2`, the map is known to findstat::
2535+
2536+
sage: findmap(Partitions, lambda mu: mu.franklin_glaisher(2)) # optional - internet
2537+
0: Mp00312 (quality [100])
25162538
"""
2539+
s = ZZ(s)
2540+
if s.is_one():
2541+
return self
25172542
mu = []
25182543
for p, m in enumerate(self.to_exp(), 1):
25192544
if not p % s:
2520-
mu.extend([p//s]*(m*s))
2545+
mu.extend([p // s]*(m*s))
25212546
else:
2522-
mu.extend(p * v * s**i for i, v in enumerate(m.digits(s)) if v)
2547+
mu.extend(p1 for i, v in enumerate(m.digits(s))
2548+
if (p1 := p * s**i)
2549+
for _ in range(v))
25232550

25242551
P = self.parent()
25252552
return P.element_class(P, sorted(mu, reverse=True))
@@ -2547,32 +2574,32 @@ def franklin_glaisher_inverse(self, s):
25472574
sage: Partition([3, 2, 2, 1, 1, 1, 1, 1]).franklin_glaisher_inverse(2)
25482575
[4, 3, 2, 2, 1]
25492576
2550-
TESTS::
2577+
TESTS:
25512578
2552-
sage: d = lambda la, s: set(p / s for p in la if p % s == 0)
2553-
sage: r = lambda la, s: set(p for p in la if list(la).count(p) >= s)
2554-
sage: all(r(mu, s) == d(mu.franklin_glaisher_inverse(s), s)
2579+
The map is inverse to :meth:`franklin_glaisher`::
2580+
2581+
sage: all(mu.franklin_glaisher(s).franklin_glaisher_inverse(s) == mu
25552582
....: for n in range(20) for mu in Partitions(n)
25562583
....: for s in range(1, 5))
25572584
True
2585+
2586+
For `s=2`, the map is known to findstat::
2587+
2588+
sage: findmap(Partitions, lambda mu: mu.franklin_glaisher_inverse(2)) # optional - internet
2589+
0: Mp00313 (quality [100])
25582590
"""
2591+
s = ZZ(s)
2592+
if s.is_one():
2593+
return self
25592594
mu = []
2560-
nu = []
25612595
for p, m in enumerate(self.to_exp(), 1):
2562-
mu.extend([p*s]*(m // s))
2563-
nu.extend([p]*(m % s))
2564-
2565-
i = 0
2566-
while i < len(nu):
2567-
p = nu[i]
2568-
if not p % s:
2569-
del nu[i]
2570-
nu.extend([p // s]*s)
2571-
else:
2572-
i += 1
2596+
p = ZZ(p)
2597+
mu.extend([p * s]*(m // s))
2598+
m1, p1 = p.val_unit(s)
2599+
mu.extend([p1]*((m % s) * s**m1))
25732600

25742601
P = self.parent()
2575-
return P.element_class(P, sorted(mu + nu, reverse=True))
2602+
return P.element_class(P, sorted(mu, reverse=True))
25762603

25772604
def suter_diagonal_slide(self, n, exp=1):
25782605
r"""

0 commit comments

Comments
 (0)