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 9 9 x^2 + 2*x*y + 3*y^2 10 10 sage: Q.discriminant() 11 11 -8 12 sage: Q.reduce ()12 sage: Q.reduced_form() 13 13 x^2 + 2*y^2 14 14 sage: Q(1, 1) 15 15 6 … … 81 81 self.a = ZZ(abc_triple[0]) 82 82 self.b = ZZ(abc_triple[1]) 83 83 self.c = ZZ(abc_triple[2]) 84 self._reduced_form = None85 84 86 85 def __getitem__(self, n): 87 86 """ … … 269 268 """ 270 269 return is_fundamental_discriminant(self.discriminant()) 271 270 272 273 271 def is_weakly_reduced(self): 274 272 """ 275 273 Checks if the form $ax^2 + bxy + cy^2$ satisfies … … 289 287 True 290 288 """ 291 289 if self.discriminant() >= 0: 292 raise NotImplementedError, "only implemented for n egative discriminant"290 raise NotImplementedError, "only implemented for nagative discriminants" 293 291 return (abs(self.b) <= self.a) and (self.a <= self.c) 294 292 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 295 320 def reduce(self): 296 321 """ 297 322 EXAMPLES: 298 323 sage: a = BinaryQF([37,17,2]) 299 324 sage: a.is_reduced() 300 325 False 301 sage: b = a.reduce(); b326 sage: a.reduce(); a 302 327 x^2 + x*y + 2*y^2 303 sage: b.is_reduced()328 sage: a.is_reduced() 304 329 True 305 330 """ 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 310 334 311 335 def is_reduced(self): 312 336 """ … … 331 355 sage: Q.is_reduced() 332 356 True 333 357 """ 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) 335 360 336 361 def complex_point(self): 337 362 """