# How to apply a function (like the sum) among all elements of a list?

In magma you have the possibility of invoking

&+[x0, x1, x2]

and that will return the sum of the elements in the array. You can also replace the sum operator by another binary operator that is associative. I'm wondering if SageMath has a similar feature, I've been looking in the documentation and apparently the best option is to use the built-in function sum(), but this doesn't generalize to any other binary operation.

Thanks for the help!

edit retag close merge delete

Hey descudero, I'm having the "inverse" problem. How do you replace the sum for a associative binary operator in MAGMA? My question in fact is "how do you create an operator with MAGMA"? Thanks!

Sort by » oldest newest most voted

The easiest are sum and product (corresponding to + and *): if a is a list (or a tuple, or any iterable) of numbers or symbolic expressions, sum(a) gets you the sum of its elements, prod(a) their product.

Here is an example with numbers.

sage: sum([1, 2, 3, 4, 5])
15
sage: prod([1, 2, 3, 4, 5])
120


Here is an example with symbolic expressions.

sage: x, y, z = SR.var("x y z")
sage: sum([x, y, z])
x + y + z
sage: prod([x, y, z])
x*y*z


Of course you could mix the two.

sage: sum([x, y, z, 1, 2, 3])
x + y + z + 6
sage: prod([x, y, z, 5, 6])
30*x*y*z


Next are all and any (for the and and or operators).

sage: all(is_prime(k) for k in (3, 5, .. 11))
False
sage: any(is_prime(k) for k in (3, 5, .. 11))
True


For a more general operator, use reduce.

sage: a = [720, 3, 4, 5]
sage: reduce(lambda x, y: x // y, a)
12


Optionally, include a start value outside the list.

sage: a = [3, 4, 5]
sage: reduce(lambda x, y: x // y, a, 720)
12

more

Thanks a lot for the help! All of this makes sense, and it's very useful.

1

In Python3, reduce is no longer a built-in. Instead, use functools.reduce or an explicit for loop.