@@ -453,7 +453,9 @@ def subsequence(self, a, b):
453
453
...
454
454
ValueError: a=-1 is not nonnegative.
455
455
"""
456
+ from itertools import chain
456
457
from sage .rings .integer_ring import ZZ
458
+
457
459
zero = ZZ (0 )
458
460
a = ZZ (a )
459
461
if not isinstance (b , dict ):
@@ -483,11 +485,12 @@ def subsequence(self, a, b):
483
485
# suffices as well.
484
486
kernel = list (b )
485
487
486
- def pad (T , d ):
488
+ def prepend_zeros (T , d , zero ):
487
489
di = kernel .index (d )
488
- return ( di * dim ) * ( 0 ,) + T
490
+ return di * [ zero ] + T
489
491
490
- Z = self .mu [0 ].parent ().zero ()
492
+ zero_M = self .mu [0 ].parent ().zero ()
493
+ zero_L = self .left .parent ().zero ()
491
494
492
495
blocks = {r : [] for r in A }
493
496
ci = 0
@@ -497,22 +500,22 @@ def pad(T, d):
497
500
d , f = (a * r + c ).quo_rem (k )
498
501
if d not in kernel :
499
502
kernel .append (d )
500
- di = kernel .index (d )
501
- blocks [r ].append (di * [Z ] + [self .mu [f ]])
503
+ blocks [r ].append (prepend_zeros ([self .mu [f ]], d , zero_M ))
502
504
ci += 1
503
505
504
- ndim = len (kernel ) * dim
505
506
result = P .element_class (
506
507
P ,
507
- {r : Matrix .block ([pad_right (row , len (kernel ), zero = Z )
508
+ {r : Matrix .block ([pad_right (row , len (kernel ), zero = zero_M )
508
509
for row in blocks [r ]])
509
510
for r in A },
510
- sum (c_j * vector (
511
- pad_right (pad (tuple (self .left ), b_j ), ndim , zero = zero ))
511
+ sum (c_j * vector (chain .from_iterable (
512
+ pad_right (prepend_zeros ([self .left ], b_j , zero_L ),
513
+ len (kernel ), zero = zero_L )))
512
514
for b_j , c_j in b .items ()),
513
- vector (sum ((tuple (self .__getitem__ (c , multiply_left = False ))
514
- if c >= 0 else dim * (zero ,)
515
- for c in kernel ), tuple ())))
515
+ vector (chain .from_iterable (
516
+ (self .__getitem__ (c , multiply_left = False )
517
+ if c >= 0 else dim * (zero ,))
518
+ for c in kernel )))
516
519
517
520
return result
518
521
0 commit comments