def native_two_isogeny_descent_work(E, two_tor_rk): """ Prepares the output from two-descent by two-isogeny. INPUT: - ``E`` - an elliptic curve - ``two_tor_rk`` - its two-torsion rank OUTPUT: - a lower bound on the rank - an upper bound on the rank - a lower bound on the rank of Sha[2] - an upper bound on the rank of Sha[2] - a list of the generators found (currently None, since we don't store them) EXAMPLES:: sage: from sage.schemes.elliptic_curves.BSD import native_two_isogeny_descent_work sage: E = EllipticCurve('14a') sage: native_two_isogeny_descent_work(E, E.two_torsion_rank()) (0, 0, 0, 0, None) sage: E = EllipticCurve('65a') sage: native_two_isogeny_descent_work(E, E.two_torsion_rank()) (1, 1, 0, 0, None) """ from sage.schemes.elliptic_curves.descent_two_isogeny import two_descent_by_two_isogeny n1, n2, n1p, n2p = two_descent_by_two_isogeny(E) # bring n1 and n1p up to the nearest power of two two = ZZ(2) # otherwise "log" is symbolic >.< e1 = ceil(ZZ(n1).log(two)) e1p = ceil(ZZ(n1p).log(two)) e2 = ZZ(n2).log(two) e2p = ZZ(n2p).log(two) rank_lower_bd = e1 + e1p - 2 rank_upper_bd = e2 + e2p - 2 sha_upper_bd = e2 + e2p - e1 - e1p gens = None # right now, we are not keeping track of them return rank_lower_bd, rank_upper_bd, 0, sha_upper_bd, gens
def native_two_isogeny_descent_work(E, two_tor_rk): """ Prepares the output from two-descent by two-isogeny. INPUT: - ``E`` - an elliptic curve - ``two_tor_rk`` - its two-torsion rank OUTPUT: - a lower bound on the rank - an upper bound on the rank - a lower bound on the rank of Sha[2] - an upper bound on the rank of Sha[2] - a list of the generators found (currently None, since we don't store them) EXAMPLES:: sage: from sage.schemes.elliptic_curves.BSD import native_two_isogeny_descent_work sage: E = EllipticCurve('14a') sage: native_two_isogeny_descent_work(E, E.two_torsion_rank()) (0, 0, 0, 0, None) sage: E = EllipticCurve('65a') sage: native_two_isogeny_descent_work(E, E.two_torsion_rank()) (1, 1, 0, 0, None) """ from sage.schemes.elliptic_curves.descent_two_isogeny import two_descent_by_two_isogeny n1, n2, n1p, n2p = two_descent_by_two_isogeny(E) # bring n1 and n1p up to the nearest power of two two = ZZ(2) # otherwise "log" is symbolic >.< e1 = ceil(ZZ(n1).log(two)) e1p = ceil(ZZ(n1p).log(two)) e2 = ZZ(n2).log(two) e2p = ZZ(n2p).log(two) rank_lower_bd = e1 + e1p - 2 rank_upper_bd = e2 + e2p - 2 sha_upper_bd = e2 + e2p - e1 - e1p gens = None # right now, we are not keeping track of them return rank_lower_bd, rank_upper_bd, 0, sha_upper_bd, gens