@@ -10395,6 +10395,8 @@ cdef class Expression(CommutativeRingElement):
10395
10395
10396
10396
- Integral (definite or not) of a sum ==> sum of integrals.
10397
10397
10398
+ _ Symbolic product of a product ==> product of symbolic products.
10399
+
10398
10400
INPUT:
10399
10401
10400
10402
- ``self`` - expression whose operator may be distributed.
@@ -10427,15 +10429,22 @@ cdef class Expression(CommutativeRingElement):
10427
10429
sum(sum(Y(k), k, 1, q) + sum(Z(k), k, 1, q), j, 1, p) + sum(X(j), j, 1, p)
10428
10430
sage: sum(X(j)+sum(Y(k)+Z(k),k,1,q),j,1,p).distribute(recursive=False)
10429
10431
sum(X(j), j, 1, p) + sum(sum(Y(k) + Z(k), k, 1, q), j, 1, p)
10432
+ sage: maxima("product(X(j)*Y(j),j,1,p)").sage()
10433
+ product(X(j)*Y(j), j, 1, p)
10434
+ sage: maxima("product(X(j)*Y(j),j,1,p)").sage().distribute()
10435
+ product(X(j), j, 1, p)*product(Y(j), j, 1, p)
10436
+
10430
10437
10431
10438
AUTHORS:
10432
10439
10433
10440
- Emmanuel Charpentier, Ralf Stephan (05-2017)
10434
10441
"""
10435
- from sage.functions.other import symbolic_sum as opsum
10442
+ from sage.functions.other import symbolic_sum as opsum, \
10443
+ symbolic_product as opprod
10436
10444
from sage.symbolic.integration.integral \
10437
10445
import indefinite_integral as opii, definite_integral as opdi
10438
- from sage.symbolic.operators import add_vararg as opadd
10446
+ from sage.symbolic.operators import add_vararg as opadd, \
10447
+ mul_vararg as opmul
10439
10448
def treat_term (op , term , args ):
10440
10449
l= sage.all.copy(args)
10441
10450
l.insert(0 , term)
@@ -10456,6 +10465,19 @@ cdef class Expression(CommutativeRingElement):
10456
10465
aa))
10457
10466
return sum (map (lambda t :treat_term(op, t, la), aa))
10458
10467
return self
10468
+ if op is opprod:
10469
+ sa = self .operands()[0 ].expand()
10470
+ op1 = sa.operator()
10471
+ if op1 is opmul:
10472
+ la = self .operands()[1 :]
10473
+ aa = sa.operands()
10474
+ if recursive:
10475
+ return sage.all.prod(map (lambda t :treat_term(op,
10476
+ t.distribute(),
10477
+ la),
10478
+ aa))
10479
+ return sage.all.prod(map (lambda t :treat_term(op, t, la), aa))
10480
+ return self
10459
10481
if recursive:
10460
10482
return apply (op, map (lambda t :t.distribute(), self .operands()))
10461
10483
return self
0 commit comments