First, the * I(x*i^(-1))
part in your Moebius
function will only add some useless computation since it is a multiplication by 1
.
Then, you can define the composition of your Moebius
function by itself as follows:
M2 = lambda x : Moebius(Moebius(x))
If you want the ^2
notation to work, you have to define a Python class since ^2
calls the __pow__
method of your object, this will require some more work around the following lines:
class MyOperator():
def __init__(self, func):
self.func = func
def __pow__(self, exponent):
def iterfunc(x):
result = x
for i in range(exponent):
result = self.func(result)
return result
return MyOperator(iterfunc)
def __call__(self, x):
return self.func(x)
Then you can do:
sage: f = MyOperator(Moebius)
sage: f(10)
-1
sage: g = f^2
sage: g(10)
0
sage: f(f(10))
0
Or similarly:
sage: inc = lambda x : x+1
sage: f = MyOperator(inc)
sage: f(14)
15
sage: g = f^12
sage: g(14)
26
sage: h = f^0
sage: h(100)
100