Ticket #4982: trac_4982.patch

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

    # HG changeset patch
    # User Alexandru Ghitza <aghitza@alum.mit.edu>
    # Date 1258349244 -39600
    # Node ID d9ceda5095dc1cc1e576b9154c2c41fd50e49580
    # Parent  e4812c5582dd1bd18cb33a852b5af0109f023aba
    trac 4982: consolidate shifts in polynomial_template
    
    diff -r e4812c5582dd -r d9ceda5095dc sage/rings/polynomial/polynomial_template.pxi
    a b  
    624624            sage: f.shift(-1)
    625625            x^2 + x
    626626        """
     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
    627635        cdef Polynomial_template r
    628636        if n == 0:
    629637            return self
    630638
    631639        parent = (<Polynomial_template>self)._parent
    632640        cdef cparent _parent = get_cparent(parent)
    633         cdef celement *gen = celement_new(_parent)
     641        gen = celement_new(_parent)
    634642        celement_gen(gen, 0, _parent)
    635643        celement_pow(gen, gen, abs(n), NULL, _parent)
    636644        r = <Polynomial_template>PY_NEW(self.__class__)
     
    638646        r._parent = parent
    639647       
    640648        if n > 0:
    641             celement_mul(&r.x, &self.x, gen, _parent)
     649            celement_mul(&r.x, &(<Polynomial_template>self).x, gen, _parent)
    642650        else:
    643             celement_floordiv(&r.x, &self.x, gen, _parent)
     651            celement_floordiv(&r.x, &(<Polynomial_template>self).x, gen, _parent)
     652
    644653        celement_delete(gen, _parent)
    645654        return r
    646655
     
    652661            sage: f = x^3 + x^2 + 1
    653662            sage: f << 1
    654663            x^4 + x^3 + x
     664            sage: f << -1
     665            x^2 + x
    655666        """
    656         if not PY_TYPE_CHECK(self, Polynomial_template):
    657             raise TypeError("Cannot %s << %n."%(self, n))
    658         cdef celement *gen, *tmp
    659         cdef Polynomial_template r
    660         if n == 0:
    661             return self
    662         elif n < 0:
    663             return self >> -n
    664 
    665         parent = (<Polynomial_template>self)._parent
    666         cdef cparent _parent = get_cparent(parent)
    667         gen = celement_new(_parent)
    668         celement_gen(gen, 0, _parent)
    669         celement_pow(gen, gen, n, NULL, _parent)
    670         r = <Polynomial_template>PY_NEW(self.__class__)
    671         celement_construct(&r.x, _parent)
    672         r._parent = parent
    673         celement_mul(&r.x, &(<Polynomial_template>self).x, gen, _parent)
    674         celement_delete(gen, _parent)
    675         return r
     667        return self.shift(n)
    676668
    677669    def __rshift__(self, int n):
    678670        """
     
    686678            sage: (x^2 + x) >> -1
    687679            x^3 + x^2
    688680        """
    689         if not PY_TYPE_CHECK(self, Polynomial_template):
    690             raise TypeError("Cannot %s >> %n."%(self, n))
    691         cdef celement *gen
    692         cdef Polynomial_template r
    693         if n == 0:
    694             return self
    695         elif n < 0:
    696             return self << -n
    697 
    698         parent = (<Polynomial_template>self)._parent
    699         cdef cparent _parent = get_cparent(parent)
    700         gen = celement_new(_parent)
    701         celement_gen(gen, 0, _parent)
    702         celement_pow(gen, gen, n, NULL, _parent)
    703         r = <Polynomial_template>PY_NEW(self.__class__)
    704         celement_construct(&r.x, _parent)
    705         r._parent = parent
    706        
    707         celement_floordiv(&r.x, &(<Polynomial_template>self).x, gen, _parent)
    708         celement_delete(gen, _parent)
    709         return r
     681        return self.shift(-n)
    710682
    711683    def is_zero(self):
    712684        """