Changeset 8192:e38e0ef637cb
Legend:
- Unmodified
- Added
- Removed
-
sage/schemes/elliptic_curves/ell_rational_field.py
r8176 r8192 2579 2579 2580 2580 IR = rings.RealIntervalField(20) 2581 MIN_ERR = R('1e-6') # we assume that regulator and2582 # discriminant, etc., computed to this accuracy.2583 # this should be made more intelligent / rigorous relative2581 MIN_ERR = R('1e-6') # we assume that regulator and 2582 # discriminant, etc., computed to this accuracy (which is easily the case). 2583 # this should be made more intelligent / rigorous relative 2584 2584 # to the rest of the system. 2585 2585 if eps == 1: # E has even rank … … 2598 2598 2599 2599 2600 def heegner_index(self, D, min_p=3, prec=5, verbose=False): 2601 """ 2602 Return an interval that contains the SQUARE of the index of 2603 the Heegner point in the group of K-rational points *modulo 2604 torsion* on the twist of the elliptic curve by D, computed 2605 using the Gross-Zagier formula and/or a point search. 2606 2607 WARNING: This function uses the Gross-Zagier formula. 2608 When E is 681b and D=-8 for some reason the returned index 2609 is 9/4 which is off by a factor of 4. Evidently the 2610 GZ formula must be modified when D=-8. 2611 2612 If 0 is in the interval of the height of the Heegner point 2613 computed to the given prec, then this function returns 0. 2600 def heegner_index(self, D, min_p=2, prec=5, verbose=False): 2601 r""" 2602 Return an interval that contains the index of the Heegner 2603 point $y_K$ in the group of K-rational points modulo torsion 2604 on this elliptic curve, computed using the Gross-Zagier 2605 formula and/or a point search, or the index divided by $2$. 2606 2607 NOTES: If \code{min_p} is bigger than 2 then the index can be 2608 off by any prime less than \code{min_p}. This function 2609 returns the index divided by $2$ exactly when $E(\Q)_{/tor}$ 2610 has index $2$ in $E(K)_{/tor}$. 2614 2611 2615 2612 INPUT: 2616 2613 D (int) -- Heegner discriminant 2617 min_p (int) -- (default: 3) only rule out primes >= min_p2614 min_p (int) -- (default: 2) only rule out primes >= min_p 2618 2615 dividing the index. 2619 2616 verbose (bool) -- (default: False); print lots of mwrank search status … … 2624 2621 2625 2622 OUTPUT: 2626 an interval that contains the index2623 an Integer 2627 2624 2628 2625 EXAMPLES: … … 2631 2628 [-7, -8, -19, -24, -35, -39, -40, -43] 2632 2629 sage: E.heegner_index(-7) 2633 [0.9999 8760 ... 1.0000134]2630 [0.99999332 .. 1.0000077] 2634 2631 2635 2632 sage: E = EllipticCurve('37b') … … 2637 2634 [-3, -4, -7, -11, -40, -47, -67, -71, -83, -84, -95] 2638 2635 sage: E.heegner_index(-95) # long time (1 second) 2639 [ 3.9999771 ... 4.0000229]2636 [1.9999923 .. 2.0000077] 2640 2637 2641 2638 Current discriminants -3 and -4 are not supported: … … 2644 2641 ... 2645 2642 ArithmeticError: Discriminant (=-3) must not be -3 or -4. 2643 2644 The curve 681b returns an interval that contains $3/2$. 2645 This is because $E(\Q) is not saturated in $E(K)$. The 2646 true index is $3$: 2647 sage: E = EllipticCurve('681b') 2648 sage: I = E.heegner_index(-8); I 2649 [1.4999942 .. 1.5000058] 2650 sage: 2*I 2651 [2.9999885 .. 3.0000115] 2652 2653 In fact, whenever the returned index has a denominator 2654 of $2$, the true index is got by multiplying the returned 2655 index by $2$. Unfortunately, this is not an if and only 2656 if condition, i.e., sometimes the index must be multiplied 2657 by $2$ even though the denominator is not $2$. 2646 2658 """ 2647 2659 # First compute upper bound on height of Heegner point. … … 2651 2663 # We divide by 2 to get the height **over Q** of the 2652 2664 # Heegner point on the twist. 2653 2665 2654 2666 ht = h0/2 2655 2667 misc.verbose('Height of heegner point = %s'%ht, tm) … … 2669 2681 misc.verbose("Doing direct computation of MW group.") 2670 2682 reg = F.regulator(verbose=verbose) 2671 return ht/IR(reg)2672 2683 return self.__adjust_heegner_index(ht/IR(reg)) 2684 2673 2685 # Do naive search to eliminate possibility that Heegner point 2674 2686 # is divisible by p<min_p, without finding Heegner point. … … 2679 2691 if len(P) == 0: 2680 2692 return IR(1) 2693 2681 2694 misc.verbose("saturating") 2682 2695 S, I, reg = F.saturation(P, verbose=verbose) 2683 2696 misc.verbose("done saturating") 2684 return ht/IR(reg) 2697 return self.__adjust_heegner_index(ht/IR(reg)) 2698 2699 def __adjust_heegner_index(self, a): 2700 r""" 2701 Take the square root of the interval that contains the Heegner 2702 index. 2703 """ 2704 if a.lower() < 0: 2705 a = IR((0, a.upper())) 2706 return a.sqrt() 2685 2707 2686 2708
Note: See TracChangeset
for help on using the changeset viewer.
