| 1 | initial version |
I tried:
a = var(','.join(f'a{k}' for k in range(10)))
def Z(n):
if n == 0:
return 1
return 1/n * sum([ a[k-1] * Z(n-k) for k in [1..n] ]).expand()
Then:
for n in [0..5]:
print(f'Z({n}) = {Z(n)}')
delivers:
Z(0) = 1
Z(1) = a0
Z(2) = 1/2*a0^2 + 1/2*a1
Z(3) = 1/6*a0^3 + 1/2*a0*a1 + 1/3*a2
Z(4) = 1/24*a0^4 + 1/4*a0^2*a1 + 1/8*a1^2 + 1/3*a0*a2 + 1/4*a3
Z(5) = 1/120*a0^5 + 1/12*a0^3*a1 + 1/8*a0*a1^2 + 1/6*a0^2*a2 + 1/6*a1*a2 + 1/4*a0*a3 + 1/5*a4
Which are the differences? First, the $a$-variables are a constant w.r.t. the loop, so just put it outside.
Then the used sum method is the sum for the elements of a given list. Please compare:
sage: sum([1, 4, 6, 10, 111])
132
sage: var('k,n');
sage: sum(binomial(n, k), k, 1, n)
2^n - 1
The first sum is the sum of a list, known in the moment of applying sum on it. It is a python-specific function. The second sum is a symbolic sum, an invention of sage & CO - and we need the summation to be done w.r.t. specific variables k,n to be introduced as such in advance, and this sum makes sense only for "known symbolic formulas".
Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.