@@ -2505,21 +2505,48 @@ def franklin_glaisher(self, s):
2505
2505
sage: Partition([4, 3, 2, 2, 1]).franklin_glaisher(2)
2506
2506
[3, 2, 2, 1, 1, 1, 1, 1]
2507
2507
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::
2509
2526
2510
2527
sage: d = lambda la, s: set(p / s for p in la if p % s == 0)
2511
2528
sage: r = lambda la, s: set(p for p in la if list(la).count(p) >= s)
2512
2529
sage: all(d(mu, s) == r(mu.franklin_glaisher(s), s)
2513
2530
....: for n in range(20) for mu in Partitions(n)
2514
2531
....: for s in range(1, 5))
2515
2532
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])
2516
2538
"""
2539
+ s = ZZ (s )
2540
+ if s .is_one ():
2541
+ return self
2517
2542
mu = []
2518
2543
for p , m in enumerate (self .to_exp (), 1 ):
2519
2544
if not p % s :
2520
- mu .extend ([p // s ]* (m * s ))
2545
+ mu .extend ([p // s ]* (m * s ))
2521
2546
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 ))
2523
2550
2524
2551
P = self .parent ()
2525
2552
return P .element_class (P , sorted (mu , reverse = True ))
@@ -2547,32 +2574,32 @@ def franklin_glaisher_inverse(self, s):
2547
2574
sage: Partition([3, 2, 2, 1, 1, 1, 1, 1]).franklin_glaisher_inverse(2)
2548
2575
[4, 3, 2, 2, 1]
2549
2576
2550
- TESTS::
2577
+ TESTS:
2551
2578
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
2555
2582
....: for n in range(20) for mu in Partitions(n)
2556
2583
....: for s in range(1, 5))
2557
2584
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])
2558
2590
"""
2591
+ s = ZZ (s )
2592
+ if s .is_one ():
2593
+ return self
2559
2594
mu = []
2560
- nu = []
2561
2595
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 ))
2573
2600
2574
2601
P = self .parent ()
2575
- return P .element_class (P , sorted (mu + nu , reverse = True ))
2602
+ return P .element_class (P , sorted (mu , reverse = True ))
2576
2603
2577
2604
def suter_diagonal_slide (self , n , exp = 1 ):
2578
2605
r"""
0 commit comments