On Sat, Dec 19, 2009 at 11:53 AM, Robert Bradshaw
<[email protected]> wrote:
> On Dec 19, 2009, at 11:14 AM, Christopher Olah wrote:
>
>> Greetings!
>>
>> I can't seem to figure out how (elegantly) to make a function that is
>> the repeated composite of another. eg. Suppose I have a function f,
>> how do I get f*f*f*f...
>>
>> In math, I could just f^n,
>
> One difficulty with supporting that would be that it's bit ambiguous
> as powering is also often used for powering after application, not
> only repeated application (e.g. sin^2(x) is usually interpreted as
> (sin(x))^2) and it would make the gulf between functions and
> expressions even bigger.
>
> sage: f(x) = sin(x)
> sage: f^2
> x |--> sin(x)^2
> sage: f = sin(x)
> sage: f^2
> sin(x)^2
>
>> in normal lambda calculus, I'd just use n.f
>> (church numeral), but in sage the only way I could come up with was
>> using a loop to generate "f(f(...(x)))" and then printing it and copy
>> pasting it to the end of "g=lambda x: " and using that (and even then,
>> when I used ~100 iterations, sage crashed). There's got to be a more
>> elegant way...
>
> Though it's not perfect, you could do
>
> sage: def compose(f, n, x): return x if n == 0 else compose(f, n-1,
> f(x))
> ....:
The following is better. It is longer, but it will work even if n >=
1000, whereas the above will fail spectacularly due to Python's stack
limit. Also, the following is a bit faster than the above:
def compose(f, n, a):
"""
Return f(f(...f(a)...)), where the composition occurs n times.
INPUT:
- `f` -- anything that is callable
- `n` -- a nonnegative integer
- `a` -- any input for `f`
OUTPUT:
result of composing `f` with itself `n` times and applying to `a`.
EXAMPLES::
sage: def f(x): return x^2 + 1
sage: x = var('x')
sage: compose(f, 3, x)
((x^2 + 1)^2 + 1)^2 + 1
"""
n = Integer(n)
if n <= 0: return a
a = f(a)
for i in range(n-1): a = f(a)
return a
I independently called mine "compose" too, so that must be the right name!
I've made adding this to the library:
http://trac.sagemath.org/sage_trac/ticket/7742
I hope somebody will make a patch, etc. (since this would be good
practice for somebody, and I have other things to do).
William
--
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