Ticket #3946: 3946.patch

File 3946.patch, 3.2 kB (added by choldsworth, 4 months ago)
  • a/sage/quadratic_forms/binary_qf.py

    old new  
    99    x^2 + 2*x*y  + 3*y^2 
    1010    sage: Q.discriminant() 
    1111    -8 
    12     sage: Q.reduce() 
     12    sage: Q.reduced_form() 
    1313    x^2 + 2*y^2 
    1414    sage: Q(1, 1) 
    1515    6 
     
    8181        self.a = ZZ(abc_triple[0]) 
    8282        self.b = ZZ(abc_triple[1]) 
    8383        self.c = ZZ(abc_triple[2]) 
    84         self._reduced_form = None 
    8584 
    8685    def __getitem__(self, n): 
    8786        """ 
     
    269268        """ 
    270269        return is_fundamental_discriminant(self.discriminant()) 
    271270 
    272  
    273271    def is_weakly_reduced(self): 
    274272        """ 
    275273        Checks if the form $ax^2 + bxy + cy^2$  satisfies 
     
    289287            True 
    290288        """ 
    291289        if self.discriminant() >= 0: 
    292             raise NotImplementedError, "only implemented for negative discriminant
     290            raise NotImplementedError, "only implemented for nagative discriminants
    293291        return (abs(self.b) <= self.a) and (self.a <= self.c) 
    294292 
     293    def reduced_form(self): 
     294        """ 
     295        EXAMPLES: 
     296            sage: a = BinaryQF([33,11,5]) 
     297            sage: a.is_reduced() 
     298            False 
     299            sage: b = a.reduced_form(); b 
     300            5*x^2 - x*y + 27*y^2 
     301            sage: b.is_reduced() 
     302            True 
     303             
     304            sage: a = BinaryQF([15,0,15]) 
     305            sage: a.is_reduced() 
     306            True 
     307            sage: b = a.reduced_form(); b 
     308            15*x^2 + 15*y^2 
     309            sage: b.is_reduced() 
     310            True 
     311        """ 
     312        if self.discriminant() >= 0 or self.a < 0: 
     313            raise NotImplementedError, "only implemented for positive definite forms" 
     314        if not self.is_reduced(): 
     315            v = list(pari('Vec(qfbred(Qfb(%s,%s,%s)))'%(self.a,self.b,self.c))) 
     316            return BinaryQF(v) 
     317        else: 
     318            return self 
     319     
    295320    def reduce(self): 
    296321        """ 
    297322        EXAMPLES: 
    298323            sage: a = BinaryQF([37,17,2]) 
    299324            sage: a.is_reduced() 
    300325            False 
    301             sage: b = a.reduce(); b 
     326            sage: a.reduce(); a  
    302327            x^2 + x*y + 2*y^2 
    303             sage: b.is_reduced() 
     328            sage: a.is_reduced() 
    304329            True 
    305330        """ 
    306         if self._reduced_form is None: 
    307             v = list(pari('Vec(qfbred(Qfb(%s,%s,%s)))'%(self.a,self.b,self.c))) 
    308             self._reduced_form = BinaryQF(v) 
    309         return self._reduced_form 
     331        if not self.is_reduced(): 
     332            red = self.reduced_form() 
     333            self.a, self.b, self.c = red.a, red.b, red.c 
    310334 
    311335    def is_reduced(self): 
    312336        """ 
     
    331355            sage: Q.is_reduced() 
    332356            True 
    333357        """ 
    334         return self.reduce() == self 
     358        return (-self.a < self.b <= self.a < self.c) or \ 
     359               (ZZ(0) <= self.b <= self.a == self.c) 
    335360 
    336361    def complex_point(self): 
    337362        """