Wow, thanks! I'll make up a patch right now.

On Mon, Jul 14, 2008 at 3:25 PM, cgb <[EMAIL PROTECTED]> wrote:
>
> I think the solution is just to define __rmul__ :
>
> sage: x = PolynomialRing(QQ,'x').gen()
> sage: f = Piecewise([[(0,1),1*x^0]])
> sage: r = f*2
> sage: r = 2*f
> ---------------------------------------------------------------------------
> TypeError                                 Traceback (most recent call
> last)
> /Users/boncelet/<ipython console> in <module>()
> /Users/boncelet/element.pyx in
> sage.structure.element.RingElement.__mul__ (sage/structure/element.c:
> 8545)()
> /Users/boncelet/coerce.pyx in
> sage.structure.coerce.CoercionModel_cache_maps.bin_op_c (sage/
> structure/coerce.c:5338)()
> TypeError: unsupported operand parent(s) for '*': 'Integer Ring' and
> '<type 'instance'>'
>
> sage: f.__rmul__ = f.__mul__
> sage: r = f*2
> sage: r = 2*f
> sage: r
> Piecewise defined function with 1 parts, [[(0, 1), 2]]
>
> Hope this helps,
>
> --CGB
>
>
>
> On Jul 12, 4:17 am, "David Joyner" <[EMAIL PROTECTED]> wrote:
>> Possibly, this is not a bug in Ring. For the class of Piecewise functions,
>> __mul__ is implemented in a way that allows you to multiply
>> two elements in that class. If you try to multiply a piecewise times a 
>> rational
>> (in that order) then it detects this and creats on the fly a piecewise 
>> function
>> equal to the rational on the range of the first function, then multiplies 
>> them.
>> However, if you multiply a rational c times a piecewise f (in that order),
>> then Python applies __mul__ from QQ and tries to carry out the 
>> multiplication.
>> When writing piecewise.py, could not figure out how to implement that.
>>
>> sage: x = PolynomialRing(QQ, 'x').gen()
>> sage: f = Piecewise([[(0,1),1*x^0]])
>> sage: r = f*2
>> sage: P1 = f.plot()
>> sage: P2 = r.plot()
>> sage: show(P1+P2)
>> sage: two = Piecewise([[(0,1),2*x^0]])
>> sage: f*two
>> Piecewise defined function with 1 parts, [[(0, 1), 2]]
>> sage: two*f
>> Piecewise defined function with 1 parts, [[(0, 1), 2]]
>> sage: f*two == f*2
>> True
>>
>> Worst, if a piecewise is defined using lambda functions then
>> either 2*f nor f*2 works!
>>
>> sage: one = lambda x:1
>> sage: f = Piecewise([[(0,1),one]])
>> sage: f*2
>> ---------------------------------------------------------------------------
>> TypeError                                 Traceback (most recent call last)
>>
>> /home/wdj/sagefiles/sage-3.0.4.rc0/<ipython console> in <module>()
>>
>> /home/wdj/sagefiles/sage-3.0.4.rc0/local/lib/python2.5/site-packages/sage/f 
>> unctions/piecewise.py
>> in __mul__(self, other)
>>    1403             for j in range(N-1):
>>    1404                 x0 = endpts[j+1]
>> -> 1405
>> fcn.append([(endpts[j],endpts[j+1]),R(other)*self.which_function(x0)])
>>    1406             return Piecewise(fcn)
>>    1407         self_endpts = self.end_points()     ## we assume these start
>>
>> /home/wdj/sagefiles/sage-3.0.4.rc0/element.pyx in
>> sage.structure.element.RingElement.__mul__
>> (sage/structure/element.c:8814)()
>>
>> /home/wdj/sagefiles/sage-3.0.4.rc0/coerce.pyx in
>> sage.structure.coerce.CoercionModel_cache_maps.bin_op_c
>> (sage/structure/coerce.c:5582)()
>>
>> TypeError: unsupported operand parent(s) for '*': 'Univariate
>> Polynomial Ring in x over Rational Field' and '<type 'function'>'
>>
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>
>> On Fri, Jul 11, 2008 at 9:55 PM, cgb <[EMAIL PROTECTED]> wrote:
>>
>> > Hi, I'm brand new to sage, just installed it on my mac, and was going
>> > through some of the examples and found a bug when I tried to multiply
>> > a piecewise function by a constant:
>>
>> > sage: x = PolynomialRing(QQ, 'x').gen()
>> > sage: f = Piecewise([[(0,1),1*x^0]])
>> > sage: r = f*2
>> > sage: r = 2*f
>> > ---------------------------------------------------------------------------
>> > TypeError                                 Traceback (most recent call
>> > last)
>>
>> > /Users/boncelet/<ipython console> in <module>()
>>
>> > /Users/boncelet/element.pyx in
>> > sage.structure.element.RingElement.__mul__ (sage/structure/element.c:
>> > 8545)()
>>
>> > /Users/boncelet/coerce.pyx in
>> > sage.structure.coerce.CoercionModel_cache_maps.bin_op_c (sage/
>> > structure/coerce.c:5338)()
>>
>> > TypeError: unsupported operand parent(s) for '*': 'Integer Ring' and
>> > '<type 'instance'>'
>> > --------
>>
>> > Multiplication should be communicative.  I suspect the .__mul__ method
>> > is set incorrectly.  (If memory serves, python can have separate
>> > methods for left and right multiplication.)
>>
>> > ---CGB
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to