Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

max_symbolic and distributive law with multiplication

Minimum and maximum are distributive over multiplication of non-negative numbers, i.e., if a,b,c >= 0 then

a * max{ b, c } = max { ab, ac }

and the same works for min{}. How can I exploit this in sagemath? Consider the followiing:

n=5
x=var(['x_'+str(i+1) for i in range(n)])
# (x_1, x_2, x_3, x_4, x_5)

This does not work as expected:

y = max_symbolic( x[4] * max_symbolic(x[0],x[1]), x[0] * max_symbolic(x[2],x[3]) )
# y == max(x_5*max(x_1, x_2), x_1*max(x_3, x_4))

simplify(y)
# max(x_1*max(x_3, x_4), x_5*max(x_1, x_2))

Simplify does not do the simplification I want it to do, which should yield

## max(max(x_1*x_3, x_1*x_4), max(x_5*x_1, x_5*x_2))

or even better

## max(x_1*x_3, x_1*x_4, x_5*x_1, x_5*x_2)

Needless to say, I have also tried expand and full_simplify. None of them does the trick.

So, I wonder, am I missing out on some other fancy function here, or is there a (hopefully easy) way to add a distributive law-feature to the max_symbolic function?

max_symbolic and distributive law with multiplication

Minimum and maximum are distributive over multiplication of non-negative numbers, i.e., if a,b,c >= 0 then

a * max{ b, c } = max { ab, ac }

and the same works for min{}. How can I exploit this in sagemath? Consider the followiing:

n=5
x=var(['x_'+str(i+1) for i in range(n)])
# (x_1, x_2, x_3, x_4, x_5)

assume([x[i] >= 0 for i in range(n)])
assumptions()
# [x_1 >= 0, x_2 >= 0, x_3 >= 0, x_4 >= 0, x_5 >= 0]

This does not work as expected:

y = max_symbolic( x[4] * max_symbolic(x[0],x[1]), x[0] * max_symbolic(x[2],x[3]) )
# y == max(x_5*max(x_1, x_2), x_1*max(x_3, x_4))

simplify(y)
# max(x_1*max(x_3, x_4), x_5*max(x_1, x_2))

Simplify does not do the simplification I want it to do, which should yield

## max(max(x_1*x_3, x_1*x_4), max(x_5*x_1, x_5*x_2))

or even better

## max(x_1*x_3, x_1*x_4, x_5*x_1, x_5*x_2)

Needless to say, I have also tried expand and full_simplify. None of them does the trick.

So, I wonder, am I missing out on some other fancy function here, or is there a (hopefully easy) way to add a distributive law-feature to the max_symbolic function?