Changeset 8192:e38e0ef637cb


Ignore:
Timestamp:
01/24/08 07:17:29 (5 years ago)
Author:
William Stein <wstein@…>
Branch:
default
Message:

Trac #1911 -- elliptic curves -- make heegner_index command return index instead of square of index; clarify why sometimes results is not an integer (it's not a bug, it's part of the algorithm)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sage/schemes/elliptic_curves/ell_rational_field.py

    r8176 r8192  
    25792579 
    25802580        IR = rings.RealIntervalField(20)   
    2581         MIN_ERR = R('1e-6')   # we assume that regulator and 
    2582                             # discriminant, etc., computed to this accuracy. 
    2583                             # this should be made more intelligent / rigorous relative 
     2581        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 
    25842584                             # to the rest of the system. 
    25852585        if eps == 1:   # E has even rank 
     
    25982598         
    25992599 
    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}$. 
    26142611 
    26152612        INPUT: 
    26162613            D (int) -- Heegner discriminant 
    2617             min_p (int) -- (default: 3) only rule out primes >= min_p 
     2614            min_p (int) -- (default: 2) only rule out primes >= min_p 
    26182615                           dividing the index.   
    26192616            verbose (bool) -- (default: False); print lots of mwrank search status 
     
    26242621                           
    26252622        OUTPUT: 
    2626             an interval that contains the index 
     2623            an Integer 
    26272624 
    26282625        EXAMPLES: 
     
    26312628            [-7, -8, -19, -24, -35, -39, -40, -43] 
    26322629            sage: E.heegner_index(-7) 
    2633             [0.99998760 ... 1.0000134] 
     2630            [0.99999332 .. 1.0000077] 
    26342631 
    26352632            sage: E = EllipticCurve('37b') 
     
    26372634            [-3, -4, -7, -11, -40, -47, -67, -71, -83, -84, -95] 
    26382635            sage: E.heegner_index(-95)          # long time (1 second) 
    2639             [3.9999771 ... 4.0000229] 
     2636            [1.9999923 .. 2.0000077] 
    26402637 
    26412638        Current discriminants -3 and -4 are not supported: 
     
    26442641            ... 
    26452642            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$. 
    26462658        """ 
    26472659        # First compute upper bound on height of Heegner point. 
     
    26512663        # We divide by 2 to get the height **over Q** of the 
    26522664        # Heegner point on the twist. 
    2653          
     2665 
    26542666        ht = h0/2 
    26552667        misc.verbose('Height of heegner point = %s'%ht, tm) 
     
    26692681            misc.verbose("Doing direct computation of MW group.") 
    26702682            reg = F.regulator(verbose=verbose) 
    2671             return ht/IR(reg) 
    2672  
     2683            return self.__adjust_heegner_index(ht/IR(reg)) 
     2684         
    26732685        # Do naive search to eliminate possibility that Heegner point 
    26742686        # is divisible by p<min_p, without finding Heegner point. 
     
    26792691        if len(P) == 0: 
    26802692            return IR(1) 
     2693 
    26812694        misc.verbose("saturating") 
    26822695        S, I, reg = F.saturation(P, verbose=verbose) 
    26832696        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() 
    26852707         
    26862708 
Note: See TracChangeset for help on using the changeset viewer.