On 07/13/2011 04:29 PM, robin wrote:
> Hello Michael
>
> thanks for this.
>
> Mathematica allows you to specify the metric by which you measure
> simplicity (actually, it's called "ComplexityFunction" and IIRC there
> are five or six builtins).
>
> As for sage, how about just counting
> the number of calls to psi()? This would just be an integer, with
> "small" being Good. This would make sense because the psi
> function is difficult to evaluate.
>
> Is this crazy enough for you? ;-)
>
> best wishes; keep me posted!
So, this code is crap, probably reinvents several wheels, doesn't check
that the variables are complex, fails on some inputs, might disengage
the locks on the dynamite cages, etc. But, it simplifies the expression
you gave as an example, and might not be a bad start with some tests and
the appropriate safeguards thrown in.
Watch out for word wrap.
from sage.all import *
from types import ListType
def is_list(obj):
if isinstance(obj, ListType):
return True
def flatten_list(l):
result = []
for item in l:
if is_list(item):
result += flatten_list(item)
else:
result += [item]
return result
def flatten_operands(operands):
return operands + [flatten_operands(g.operands()) for g in operands]
def count_psis(expr):
count = 0
operands = flatten_list(flatten_operands(expr.operands()))
for o in operands:
if "psi" in str(o):
count += 1
return count
def simplify_psi(expr):
simple_expr = expr
for v in expr.variables():
simple_expr = simple_expr.subs({psi(1-v): pi/tan(pi*v) + psi(v)})
simple_expr = simple_expr.full_simplify()
if count_psis(simple_expr) < count_psis(expr):
return simple_expr
else:
return expr
z = var('z')
f = (psi(1-z)- psi(z)-pi/tan(pi*z))
print simplify_psi(f)
--
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sage-support
URL: http://www.sagemath.org