08/16/2007, 01:28 AM

Hi, this is actuallly in reference to jaydfox's posts about Sage and the like. I rewrote the Mathematica code for the custom IDM method, and it works better than what you would usually do in Sage to get the same result, but it still not as fast as Mathematica (which doesn't surprise me, given that most of the work is being done behind the scenes by Maxima, which Sage gives a front-end to). So jaydfox, I would also like to correct you on your PARI vs. Sage question. Sage provides a front-end for PARI as well, so it's not a question of which is better. Its like saying "ROM vs. Computer" which is better? obviously they're not quite comparable.

Anyways, without further delay I suppose I should give you the Sage code:

The only way I can see making this even faster is to implement it in Maxima directly, since thats the CAS that Sage uses behind the scenes to calculate this kind of thing. Maybe my next post will include a Maxima version. For more information on the CASs that Sage uses, see http://sagemath.org.

Andrew Robbins

Anyways, without further delay I suppose I should give you the Sage code:

Code:

`# Define the custom IDM:`

def parabolic_idm(expr, x, size):

ret = []

ser = x

for i in xrange(size):

ser = taylor(ser(expr), x, 0, size)

cof = ser.coeffs(x)

ret.append([0] + [cof[int(k)][0] for k in xrange(len(cof))])

top = [0, 1] + [0 for i in xrange(size-1)]

return [top] + ret

# Get the flow from custom IDM:

def parabolic_flow_coeff(idm_matrix, t):

size = len(idm_matrix) - 1

ret = [sum([(-1)^(n-k-1)*idm_matrix[k][n]*

binomial(t, k)*binomial(t-k-1, n-k-1)

for k in xrange(n)]) for n in xrange(size)]

return ret

# Get just the coefficients of (x,t):

def parabolic_flow_matrix(flow_coeff, t):

size = len(flow_coeff)

ret = []

for i in xrange(size):

if (i < 2):

ret.append([flow_coeff[i]])

else:

cof = flow_coeff[i].expand().coeffs(t)

ret.append([0] + [cof[int(k)][0] for k in xrange(len(cof))])

return ret

# Use the custom IDM:

from sage.calculus.calculus import SymbolicVariable

x = SymbolicVariable('x')

t = SymbolicVariable('t')

size = 20

mtx = parabolic_idm(exp(x)-1, x, size)

fco = parabolic_flow_coeff(mtx, t)

fma = parabolic_flow_matrix(fco, t)

The only way I can see making this even faster is to implement it in Maxima directly, since thats the CAS that Sage uses behind the scenes to calculate this kind of thing. Maybe my next post will include a Maxima version. For more information on the CASs that Sage uses, see http://sagemath.org.

Andrew Robbins