Ticket #4982: trac_4982_speedup.patch

File trac_4982_speedup.patch, 3.6 KB (added by malb, 13 years ago)
  • sage/rings/polynomial/polynomial_template.pxi

    # HG changeset patch
    # User Martin Albrecht <malb@informatik.uni-bremen.de>
    # Date 1258713926 0
    # Node ID 71db5a2969ee60b44a8c6261b54b771e4eb339cf
    # Parent  5b876e61bd85f8ecb7093484a689afe9fe407114
    avoid a Python call when outsourcing shift
    
    diff -r 5b876e61bd85 -r 71db5a2969ee sage/rings/polynomial/polynomial_template.pxi
    a b  
    2323def make_element(parent, args):
    2424    return parent(*args)
    2525
     26cdef inline Polynomial_template element_shift(self, int n):
     27     if not PY_TYPE_CHECK(self, Polynomial_template):
     28         if n > 0:
     29             error_msg = "Cannot shift %s << %n."%(self, n)
     30         else:
     31             error_msg = "Cannot shift %s >> %n."%(self, n)
     32         raise TypeError(error_msg)
     33
     34     if n == 0:
     35         return self
     36
     37     cdef cparent _parent = get_cparent((<Polynomial_template>self)._parent)
     38     cdef celement *gen = celement_new(_parent)
     39     celement_gen(gen, 0, _parent)
     40     celement_pow(gen, gen, abs(n), NULL, _parent)
     41     cdef Polynomial_template r = <Polynomial_template>PY_NEW(self.__class__)
     42     celement_construct(&r.x, _parent)
     43     r._parent = (<Polynomial_template>self)._parent
     44     
     45     if n > 0:
     46         celement_mul(&r.x, &(<Polynomial_template>self).x, gen, _parent)
     47     else:
     48         celement_floordiv(&r.x, &(<Polynomial_template>self).x, gen, _parent)
     49
     50     celement_delete(gen, _parent)
     51     return r
     52
    2653cdef class Polynomial_template(Polynomial):
    2754    r"""
    2855    Template for interfacing to external C / C++ libraries for implementations of polynomials.
     
    624651            sage: f.shift(-1)
    625652            x^2 + x
    626653        """
    627         if not PY_TYPE_CHECK(self, Polynomial_template):
    628             if n > 0:
    629                 error_msg = "Cannot shift %s << %n."%(self, n)
    630             else:
    631                 error_msg = "Cannot shift %s >> %n."%(self, n)
    632             raise TypeError(error_msg)
    633 
    634         cdef celement *gen
    635         cdef Polynomial_template r
    636         if n == 0:
    637             return self
    638 
    639         parent = (<Polynomial_template>self)._parent
    640         cdef cparent _parent = get_cparent(parent)
    641         gen = celement_new(_parent)
    642         celement_gen(gen, 0, _parent)
    643         celement_pow(gen, gen, abs(n), NULL, _parent)
    644         r = <Polynomial_template>PY_NEW(self.__class__)
    645         celement_construct(&r.x, _parent)
    646         r._parent = parent
    647        
    648         if n > 0:
    649             celement_mul(&r.x, &(<Polynomial_template>self).x, gen, _parent)
    650         else:
    651             celement_floordiv(&r.x, &(<Polynomial_template>self).x, gen, _parent)
    652 
    653         celement_delete(gen, _parent)
    654         return r
     654        return element_shift(self, n)
    655655
    656656    def __lshift__(self, int n):
    657657        """
     
    664664            sage: f << -1
    665665            x^2 + x
    666666        """
    667         return self.shift(n)
     667        return element_shift(self, n)
    668668
    669669    def __rshift__(self, int n):
    670670        """
     
    678678            sage: (x^2 + x) >> -1
    679679            x^3 + x^2
    680680        """
    681         return self.shift(-n)
     681        return element_shift(self, -n)
    682682
    683683    def is_zero(self):
    684684        """
  • sage/rings/polynomial/polynomial_template_header.pxi

    diff -r 5b876e61bd85 -r 71db5a2969ee sage/rings/polynomial/polynomial_template_header.pxi
    a b  
    77cdef class Polynomial_template(Polynomial):
    88    cdef celement x
    99
     10