Ticket #3111: sage-3111.patch

File sage-3111.patch, 5.8 KB (added by cremona, 12 years ago)
  • sage/schemes/elliptic_curves/ell_finite_field.py

    # HG changeset patch
    # User John Cremona <john.cremona@gmail.com>
    # Date 1210153923 -3600
    # Node ID 6be71336769080d20026f30bbbc803bb481ba9b0
    # Parent  9f576faa0dca242727807fda6fae98c7cfc513b6
    #3111: 2 bug fixes -- Hasse_bounds() and abelian_group()
    
    diff -r 9f576faa0dca -r 6be713367690 sage/schemes/elliptic_curves/ell_finite_field.py
    a b class EllipticCurve_finite_field(Ellipti 
    10931093            if debug:
    10941094                "Getting a new random point"
    10951095            Q = self.random_point()
     1096            while Q.is_zero(): Q = self.random_point()
    10961097            npts += 1
    10971098            if debug:
    10981099                print "Q = ",Q,":",
    class EllipticCurve_finite_field(Ellipti 
    11021103
    11031104            if Q1.is_zero() and npts>=10: # then P1,n1 will not change but we may increase n2
    11041105                if debug: print "Case 2: n2 may increase"
     1106                n1a = 1; n1b = n1
     1107                P1a = P1
    11051108                if group_order_known:
    1106                     n1a=n1.prime_to_m_part(N//n1)
    1107                     Q = n1a*Q
    1108                 a,m = generic.linear_relation(n1a*P1,Q,operation='+')
     1109                    n1a = n1.prime_to_m_part(N//n1)
     1110                    n1b = n1//n1a
     1111                    Q = n1a*Q       # has order | n1b
     1112                    P1a = n1a*P1    # has order = n1b
     1113                if debug: print "n1a=",n1a
     1114                a = None
     1115                for m in (N//n1).divisors():
     1116                    try:
     1117                        a = generic.bsgs(m*P1a,m*Q,(0,(n1b//m)-1),operation='+')
     1118                        break
     1119                    except ValueError:
     1120                        pass
     1121                assert a != None
     1122                a *= (m*n1a)
    11091123                if debug: print "linear relation gives m=",m,", a=",a
     1124                assert m*Q==a*P1
    11101125                if m>1: # else Q is in <P1>
    11111126                    Q=Q-(a//m)*P1; # has order m and is disjoint from P1
     1127                    if debug: assert Q.order()==m
    11121128                    Q._order=m
    11131129                    if n2==1: # this is our first nontrivial P2
    11141130                        P2=Q
    class EllipticCurve_finite_field(Ellipti 
    11191135                    else:     # we must merge P2 and Q:
    11201136                        oldn2=n2 # holds old value
    11211137                        P2,n2=generic.merge_points((P2,n2),(Q,m),operation='+');
     1138                        if debug: assert P2.order()==n2
    11221139                        P2._order=n2
    11231140                        if debug:
    11241141                            if n2>oldn2:
    11251142                                print "Replacing second generator by ",P2,
    1126                                 print " of order ",n2, "  gaining index ",n2//a
     1143                                print " of order ",n2, "  gaining index ",n2//oldn2
    11271144                                print "Group order now ",n1*n2,"=",n1,"*",n2
    11281145            elif not Q1.is_zero(): # Q1 nonzero: n1 will increase
    11291146                if debug:  print "Case 1: n1 may increase"
    11301147                oldn1=n1
    11311148                if n2>1:
    11321149                    P3=(n1//n2)*P1  # so P2,P3 are a basis for n2-torsion
     1150                    if debug: assert P3.order()==n2
    11331151                    P3._order=n2
    11341152                    if debug: print "storing generator ",P3," of ",n2,"-torsion"
    11351153                m = generic.order_from_bounds(Q,bounds,n1,operation='+')
    11361154                P1,n1=generic.merge_points((P1,n1),(Q,m))
     1155                if debug: assert P1.order()==n1
    11371156                P1._order=n1
    11381157                if debug:
    11391158                    print "Replacing first  generator by ",P1," of order ",
    class EllipticCurve_finite_field(Ellipti 
    11451164                    a,m = generic.linear_relation(P1,P3,operation='+')
    11461165                    if debug: print "linear relation gives m=",m,", a=",a
    11471166                    P3=P3-(a//m)*P1
     1167                    if debug: assert P3.order()==m
    11481168                    P3._order=m
    11491169                    if debug: print "First  P2 component =",P3
    11501170                    if m==n2:
    class EllipticCurve_finite_field(Ellipti 
    11531173                        a,m = generic.linear_relation(P1,P2,operation='+')
    11541174                        if debug: print "linear relation gives m=",m,", a=",a
    11551175                        P2=P2-(a//m)*P1;
     1176                        if debug: assert P2.order()==m
    11561177                        P2._order=m
    11571178                        if debug: print "Second  P2 component =",P2
    11581179                        P2,n2=generic.merge_points((P2,n2),(P3,m))
     1180                        if debug: assert P2.order()==n2
    11591181                        P2._order=n2
    11601182                        if debug: print "Combined P2 component =",P2
    11611183                   
    class EllipticCurve_finite_field(Ellipti 
    11691191                    print " and not ",n2
    11701192                    raise ValueError
    11711193                if n2>1:
     1194                    print "P1=",P1," of order ",P1.order(),"=",n1
     1195                    print "P2=",P2," of order ",P2.order(),"=",n2
    11721196                    if generic.linear_relation(P1,P2,operation='+')[1]!=n2:
    11731197                        print "Generators not independent!"
    11741198                        raise ValueError
  • sage/schemes/elliptic_curves/ell_generic.py

    diff -r 9f576faa0dca -r 6be713367690 sage/schemes/elliptic_curves/ell_generic.py
    a b def Hasse_bounds(q, genus=1): 
    19321932       sage: Hasse_bounds(next_prime(10^30))
    19331933       (999999999999998000000000000058, 1000000000000002000000000000058)
    19341934    """
    1935     rq = 2*genus*q.isqrt()
     1935    if genus==1:
     1936        rq = (4*q).isqrt()
     1937    else:
     1938        rq = (4*(genus**2)*q).isqrt()
    19361939    return (q+1-rq,q+1+rq)
    19371940