@@ -166,11 +166,13 @@ def planar_diagrams(k):
166
166
EXAMPLES::
167
167
168
168
sage: import sage.combinat.diagram_algebras as da
169
- sage: all_diagrams = da.partition_diagrams(2)
170
- sage: [SetPartition(p) for p in all_diagrams if p not in da.planar_diagrams(2)]
169
+ sage: all_diagrams = [SetPartition(p) for p in da.partition_diagrams(2)]
170
+ sage: da2 = [SetPartition(p) for p in da.planar_diagrams(2)]
171
+ sage: [p for p in all_diagrams if p not in da2]
171
172
[{{-2, 1}, {-1, 2}}]
172
- sage: all_diagrams = da.partition_diagrams(5/2)
173
- sage: [SetPartition(p) for p in all_diagrams if p not in da.planar_diagrams(5/2)]
173
+ sage: all_diagrams = [SetPartition(p) for p in da.partition_diagrams(5/2)]
174
+ sage: da5o2 = [SetPartition(p) for p in da.planar_diagrams(5/2)]
175
+ sage: [p for p in all_diagrams if p not in da5o2]
174
176
[{{-3, -1, 3}, {-2, 1, 2}},
175
177
{{-3, -2, 1, 3}, {-1, 2}},
176
178
{{-3, -1, 1, 3}, {-2, 2}},
@@ -182,9 +184,73 @@ def planar_diagrams(k):
182
184
{{-3, -1, 3}, {-2, 1}, {2}},
183
185
{{-3, -1, 3}, {-2, 2}, {1}}]
184
186
"""
185
- for i in partition_diagrams (k ):
186
- if is_planar (i ):
187
- yield i
187
+ if k in ZZ :
188
+ X = list (range (1 ,k + 1 )) + list (range (- k ,0 ))
189
+ yield from planar_partitions_rec (X )
190
+ elif k + ZZ (1 )/ ZZ (2 ) in ZZ : # Else k in 1/2 ZZ
191
+ k = ZZ (k + ZZ (1 ) / ZZ (2 ))
192
+ X = list (range (1 ,k + 1 )) + list (range (- k + 1 ,0 ))
193
+ for Y in planar_partitions_rec (X ):
194
+ Y = list (Y )
195
+ for part in Y :
196
+ if k in part :
197
+ part .append (- k )
198
+ break
199
+ yield Y
200
+ else :
201
+ raise ValueError ("argument %s must be a half-integer" % k )
202
+
203
+ def planar_partitions_rec (X ):
204
+ r"""
205
+ Iterate over all planar set partitions of ``X`` by using a
206
+ recursive algorithm.
207
+
208
+ ALGORITHM:
209
+
210
+ To construct the set partition `\rho = \{\rho_1, \ldots, \rho_k\}` of
211
+ `[n]`, we remove the part of the set partition containing the last
212
+ element of ``X``, which, we consider to be `\rho_k = \{i_1, \ldots, i_m\}`
213
+ without loss of generality. The remaining parts come from the planar set
214
+ partitions of `\{1, \ldots, i_1-1\}, \{i_1+1, \ldots, i_2-1\}, \ldots,
215
+ \{i_m+1, \ldots, n\}`.
216
+
217
+ EXAMPLES::
218
+
219
+ sage: import sage.combinat.diagram_algebras as da
220
+ sage: list(da.planar_partitions_rec([1,2,3]))
221
+ [([1, 2], [3]), ([1], [2], [3]), ([2], [1, 3]), ([1], [2, 3]), ([1, 2, 3],)]
222
+ """
223
+ if not X :
224
+ return
225
+ if len (X ) <= 2 :
226
+ # Direct implementation of small cases
227
+ yield (X ,)
228
+ if len (X ) > 1 :
229
+ yield ([X [0 ]], [X [1 ]])
230
+ return
231
+ from sage .misc .misc import powerset
232
+ from itertools import product
233
+ for S in powerset (range (len (X )- 1 )):
234
+ if not S :
235
+ for Y in planar_partitions_rec (X [:- 1 ]):
236
+ yield Y + ([X [- 1 ]],)
237
+ continue
238
+ last = [X [i ] for i in S ]
239
+ last .append (X [- 1 ])
240
+ pt = []
241
+ if S [0 ] != 0 :
242
+ pt += [X [:S [0 ]]]
243
+ pt = [X [S [i ]+ 1 :S [i + 1 ]] for i in range (len (S )- 1 ) if S [i ]+ 1 != S [i + 1 ]]
244
+ if S [- 1 ] + 1 != len (X ) - 1 :
245
+ pt += [X [S [- 1 ]+ 1 :- 1 ]]
246
+ parts = [planar_partitions_rec (X [S [i ]+ 1 :S [i + 1 ]]) for i in range (len (S )- 1 )
247
+ if S [i ] + 1 != S [i + 1 ]]
248
+ if S [0 ] != 0 :
249
+ parts .append (planar_partitions_rec (X [:S [0 ]]))
250
+ if S [- 1 ] + 1 != len (X ) - 1 :
251
+ parts .append (planar_partitions_rec (X [S [- 1 ]+ 1 :- 1 ]))
252
+ for Y in product (* parts ):
253
+ yield sum (Y , ()) + (last ,)
188
254
189
255
def ideal_diagrams (k ):
190
256
r"""
@@ -606,20 +672,20 @@ class PlanarDiagram(AbstractPartitionDiagram):
606
672
sage: PlanarDiagrams(2)
607
673
Planar diagrams of order 2
608
674
sage: PlanarDiagrams(2).list()
609
- [{{-2, -1, 1, 2}},
610
- {{-2, 1, 2}, {-1}},
611
- {{-2}, {-1, 1, 2}},
612
- {{-2, -1}, {1, 2}},
613
- {{-2}, {-1}, {1, 2}},
614
- {{-2, -1, 1}, {2}},
675
+ [{{-2}, {-1}, {1, 2}},
676
+ {{-2}, {-1}, {1}, {2}},
615
677
{{-2, 1}, {-1}, {2}},
616
- {{-2, 2}, {-1, 1}},
617
- {{-2, -1, 2}, {1}},
618
678
{{-2, 2}, {-1}, {1}},
679
+ {{-2, 1, 2}, {-1}},
680
+ {{-2, 2}, {-1, 1}},
619
681
{{-2}, {-1, 1}, {2}},
620
682
{{-2}, {-1, 2}, {1}},
683
+ {{-2}, {-1, 1, 2}},
684
+ {{-2, -1}, {1, 2}},
621
685
{{-2, -1}, {1}, {2}},
622
- {{-2}, {-1}, {1}, {2}}]
686
+ {{-2, -1, 1}, {2}},
687
+ {{-2, -1, 2}, {1}},
688
+ {{-2, -1, 1, 2}}]
623
689
"""
624
690
@staticmethod
625
691
def __classcall_private__ (cls , diag ):
@@ -1183,27 +1249,27 @@ def __iter__(self):
1183
1249
[{{-2, -1}, {1, 2}}, {{-2, 2}, {-1, 1}}]
1184
1250
1185
1251
sage: list(da.PlanarDiagrams(3/2))
1186
- [{{-2, - 1, 1, 2 }},
1187
- {{-2, 1, 2}, {-1}},
1252
+ [{{-2, 1, 2}, {-1 }},
1253
+ {{-2, 2}, {-1}, { 1}},
1188
1254
{{-2, 2}, {-1, 1}},
1189
1255
{{-2, -1, 2}, {1}},
1190
- {{-2, 2}, {-1}, {1 }}]
1256
+ {{-2, -1, 1, 2 }}]
1191
1257
1192
1258
sage: list(da.PlanarDiagrams(2))
1193
- [{{-2, -1, 1, 2}},
1194
- {{-2, 1, 2}, {-1}},
1195
- {{-2}, {-1, 1, 2}},
1196
- {{-2, -1}, {1, 2}},
1197
- {{-2}, {-1}, {1, 2}},
1198
- {{-2, -1, 1}, {2}},
1259
+ [{{-2}, {-1}, {1, 2}},
1260
+ {{-2}, {-1}, {1}, {2}},
1199
1261
{{-2, 1}, {-1}, {2}},
1200
- {{-2, 2}, {-1, 1}},
1201
- {{-2, -1, 2}, {1}},
1202
1262
{{-2, 2}, {-1}, {1}},
1263
+ {{-2, 1, 2}, {-1}},
1264
+ {{-2, 2}, {-1, 1}},
1203
1265
{{-2}, {-1, 1}, {2}},
1204
1266
{{-2}, {-1, 2}, {1}},
1267
+ {{-2}, {-1, 1, 2}},
1268
+ {{-2, -1}, {1, 2}},
1205
1269
{{-2, -1}, {1}, {2}},
1206
- {{-2}, {-1}, {1}, {2}}]
1270
+ {{-2, -1, 1}, {2}},
1271
+ {{-2, -1, 2}, {1}},
1272
+ {{-2, -1, 1, 2}}]
1207
1273
1208
1274
sage: list(da.IdealDiagrams(3/2))
1209
1275
[{{-2, -1, 1, 2}},
@@ -1654,11 +1720,11 @@ class PlanarDiagrams(AbstractPartitionDiagrams):
1654
1720
sage: pld = da.PlanarDiagrams(3/2); pld
1655
1721
Planar diagrams of order 3/2
1656
1722
sage: pld.list()
1657
- [{{-2, - 1, 1, 2 }},
1658
- {{-2, 1, 2}, {-1}},
1723
+ [{{-2, 1, 2}, {-1 }},
1724
+ {{-2, 2}, {-1}, { 1}},
1659
1725
{{-2, 2}, {-1, 1}},
1660
1726
{{-2, -1, 2}, {1}},
1661
- {{-2, 2}, {-1}, {1 }}]
1727
+ {{-2, -1, 1, 2 }}]
1662
1728
1663
1729
TESTS::
1664
1730
@@ -3967,20 +4033,20 @@ class PlanarAlgebra(SubPartitionAlgebra, UnitDiagramMixin):
3967
4033
sage: Pl.basis().keys()([[-1, 1], [2, -2]])
3968
4034
{{-2, 2}, {-1, 1}}
3969
4035
sage: Pl.basis().list()
3970
- [Pl{{-2, -1, 1, 2}},
3971
- Pl{{-2, 1, 2}, {-1}},
3972
- Pl{{-2}, {-1, 1, 2}},
3973
- Pl{{-2, -1}, {1, 2}},
3974
- Pl{{-2}, {-1}, {1, 2}},
3975
- Pl{{-2, -1, 1}, {2}},
4036
+ [Pl{{-2}, {-1}, {1, 2}},
4037
+ Pl{{-2}, {-1}, {1}, {2}},
3976
4038
Pl{{-2, 1}, {-1}, {2}},
3977
- Pl{{-2, 2}, {-1, 1}},
3978
- Pl{{-2, -1, 2}, {1}},
3979
4039
Pl{{-2, 2}, {-1}, {1}},
4040
+ Pl{{-2, 1, 2}, {-1}},
4041
+ Pl{{-2, 2}, {-1, 1}},
3980
4042
Pl{{-2}, {-1, 1}, {2}},
3981
4043
Pl{{-2}, {-1, 2}, {1}},
4044
+ Pl{{-2}, {-1, 1, 2}},
4045
+ Pl{{-2, -1}, {1, 2}},
3982
4046
Pl{{-2, -1}, {1}, {2}},
3983
- Pl{{-2}, {-1}, {1}, {2}}]
4047
+ Pl{{-2, -1, 1}, {2}},
4048
+ Pl{{-2, -1, 2}, {1}},
4049
+ Pl{{-2, -1, 1, 2}}]
3984
4050
sage: E = Pl([[1,2],[-1,-2]])
3985
4051
sage: E^2 == x*E
3986
4052
True
0 commit comments