Path: blob/master/sage/schemes/hyperelliptic_curves/hyperelliptic_g2_generic.py
4128 views
#*****************************************************************************1# Copyright (C) 2006 David Kohel <[email protected]>2# Distributed under the terms of the GNU General Public License (GPL)3# http://www.gnu.org/licenses/4#*****************************************************************************56import hyperelliptic_generic7import jacobian_g289import invariants101112class HyperellipticCurve_g2_generic(hyperelliptic_generic.HyperellipticCurve_generic):13def is_odd_degree(self):14"""15Returns True if the curve is an odd degree model.16"""17f, h = self.hyperelliptic_polynomials()18df = f.degree()19if h.degree() < 3:20return df%2 == 121elif df < 6:22return False23else:24a0 = f.leading_coefficient()25c0 = h.leading_coefficient()26return (c0**2 + 4*a0) == 02728def jacobian(self):29return jacobian_g2.HyperellipticJacobian_g2(self)3031def kummer_morphism(self):32"""33Returns the morphism of an odd degree hyperelliptic curve to the Kummer34surface of its Jacobian. (This could be extended to an even degree model35if a prescribed embedding in its Jacobian is fixed.)36"""37try:38return self._kummer_morphism39except AttributeError:40pass41if not self.is_odd_degree():42raise TypeError, \43"Kummer embedding not determined for even degree model curves."44J = self.jacobian()45K = J.kummer_surface()46return self._kummer_morphism4748def clebsch_invariants(self):49r"""50Return the Clebsch invariants `(A, B, C, D)` of Mestre, p 317, [M]_.5152SEEALSO::5354.. sage.schemes.hyperelliptic_curves.invariants5556EXAMPLES::5758sage: R.<x> = QQ[]59sage: f = x^5 - x^4 + 360sage: HyperellipticCurve(f).clebsch_invariants()61(0, -2048/375, -4096/25, -4881645568/84375)62sage: HyperellipticCurve(f(2*x)).clebsch_invariants()63(0, -8388608/375, -1073741824/25, -5241627016305836032/84375)6465sage: HyperellipticCurve(f, x).clebsch_invariants()66(-8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625)67sage: HyperellipticCurve(f(2*x), 2*x).clebsch_invariants()68(-512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625)6970TESTS::7172sage: magma(HyperellipticCurve(f)).ClebschInvariants() # optional - magma73[ 0, -2048/375, -4096/25, -4881645568/84375 ]74sage: magma(HyperellipticCurve(f(2*x))).ClebschInvariants() # optional - magma75[ 0, -8388608/375, -1073741824/25, -5241627016305836032/84375 ]76sage: magma(HyperellipticCurve(f, x)).ClebschInvariants() # optional - magma77[ -8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625 ]78sage: magma(HyperellipticCurve(f(2*x), 2*x)).ClebschInvariants() # optional - magma79[ -512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625 ]80"""81f, h = self.hyperelliptic_polynomials()82return invariants.clebsch_invariants(4*f + h**2)8384def igusa_clebsch_invariants(self):85r"""86Return the Igusa-Clebsch invariants `I_2, I_4, I_6, I_{10}` of Igusa and Clebsch [I]_.8788SEEALSO::8990.. sage.schemes.hyperelliptic_curves.invariants9192EXAMPLES::9394sage: R.<x> = QQ[]95sage: f = x^5 - x + 296sage: HyperellipticCurve(f).igusa_clebsch_invariants()97(-640, -20480, 1310720, 52160364544)98sage: HyperellipticCurve(f(2*x)).igusa_clebsch_invariants()99(-40960, -83886080, 343597383680, 56006764965979488256)100101sage: HyperellipticCurve(f, x).igusa_clebsch_invariants()102(-640, 17920, -1966656, 52409511936)103sage: HyperellipticCurve(f(2*x), 2*x).igusa_clebsch_invariants()104(-40960, 73400320, -515547070464, 56274284941110411264)105106TESTS::107108sage: magma(HyperellipticCurve(f)).IgusaClebschInvariants() # optional - magma109[ -640, -20480, 1310720, 52160364544 ]110sage: magma(HyperellipticCurve(f(2*x))).IgusaClebschInvariants() # optional - magma111[ -40960, -83886080, 343597383680, 56006764965979488256 ]112sage: magma(HyperellipticCurve(f, x)).IgusaClebschInvariants() # optional - magma113[ -640, 17920, -1966656, 52409511936 ]114sage: magma(HyperellipticCurve(f(2*x), 2*x)).IgusaClebschInvariants() # optional - magma115[ -40960, 73400320, -515547070464, 56274284941110411264 ]116"""117f, h = self.hyperelliptic_polynomials()118return invariants.igusa_clebsch_invariants(4*f + h**2)119120def absolute_igusa_invariants_wamelen(self):121r"""122Return the three absolute Igusa invariants used by van Wamelen [W]_.123124EXAMPLES::125126sage: R.<x> = QQ[]127sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_wamelen()128(0, 0, 0)129sage: HyperellipticCurve((x^5 - 1)(x - 2), (x^2)(x - 2)).absolute_igusa_invariants_wamelen()130(0, 0, 0)131"""132f, h = self.hyperelliptic_polynomials()133return invariants.absolute_igusa_invariants_wamelen(4*f + h**2)134135def absolute_igusa_invariants_kohel(self):136r"""137Return the three absolute Igusa invariants used by Kohel [K]_.138139SEEALSO::140141.. sage.schemes.hyperelliptic_curves.invariants142143EXAMPLES::144145sage: R.<x> = QQ[]146sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_kohel()147(0, 0, 0)148sage: HyperellipticCurve(x^5 - x + 1, x^2).absolute_igusa_invariants_kohel()149(-1030567/178769, 259686400/178769, 20806400/178769)150sage: HyperellipticCurve((x^5 - x + 1)(3*x + 1), (x^2)(3*x + 1)).absolute_igusa_invariants_kohel()151(-1030567/178769, 259686400/178769, 20806400/178769)152"""153f, h = self.hyperelliptic_polynomials()154return invariants.absolute_igusa_invariants_kohel(4*f + h**2)155156def clebsch_invariants(self):157r"""158Return the Clebsch invariants `(A, B, C, D)` of Mestre, p 317, [M]_.159160SEEALSO::161162.. sage.schemes.hyperelliptic_curves.invariants163164EXAMPLES::165166sage: R.<x> = QQ[]167sage: f = x^5 - x^4 + 3168sage: HyperellipticCurve(f).clebsch_invariants()169(0, -2048/375, -4096/25, -4881645568/84375)170sage: HyperellipticCurve(f(2*x)).clebsch_invariants()171(0, -8388608/375, -1073741824/25, -5241627016305836032/84375)172173sage: HyperellipticCurve(f, x).clebsch_invariants()174(-8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625)175sage: HyperellipticCurve(f(2*x), 2*x).clebsch_invariants()176(-512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625)177178TESTS::179180sage: magma(HyperellipticCurve(f)).ClebschInvariants() # optional - magma181[ 0, -2048/375, -4096/25, -4881645568/84375 ]182sage: magma(HyperellipticCurve(f(2*x))).ClebschInvariants() # optional - magma183[ 0, -8388608/375, -1073741824/25, -5241627016305836032/84375 ]184sage: magma(HyperellipticCurve(f, x)).ClebschInvariants() # optional - magma185[ -8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625 ]186sage: magma(HyperellipticCurve(f(2*x), 2*x)).ClebschInvariants() # optional - magma187[ -512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625 ]188"""189f, h = self.hyperelliptic_polynomials()190return invariants.clebsch_invariants(4*f + h**2)191192def igusa_clebsch_invariants(self):193r"""194Return the Igusa-Clebsch invariants `I_2, I_4, I_6, I_{10}` of Igusa and Clebsch [I]_.195196SEEALSO::197198.. sage.schemes.hyperelliptic_curves.invariants199200EXAMPLES::201202sage: R.<x> = QQ[]203sage: f = x^5 - x + 2204sage: HyperellipticCurve(f).igusa_clebsch_invariants()205(-640, -20480, 1310720, 52160364544)206sage: HyperellipticCurve(f(2*x)).igusa_clebsch_invariants()207(-40960, -83886080, 343597383680, 56006764965979488256)208209sage: HyperellipticCurve(f, x).igusa_clebsch_invariants()210(-640, 17920, -1966656, 52409511936)211sage: HyperellipticCurve(f(2*x), 2*x).igusa_clebsch_invariants()212(-40960, 73400320, -515547070464, 56274284941110411264)213214TESTS::215216sage: magma(HyperellipticCurve(f)).IgusaClebschInvariants() # optional - magma217[ -640, -20480, 1310720, 52160364544 ]218sage: magma(HyperellipticCurve(f(2*x))).IgusaClebschInvariants() # optional - magma219[ -40960, -83886080, 343597383680, 56006764965979488256 ]220221sage: magma(HyperellipticCurve(f, x)).IgusaClebschInvariants() # optional - magma222[ -640, 17920, -1966656, 52409511936 ]223sage: magma(HyperellipticCurve(f(2*x), 2*x)).IgusaClebschInvariants() # optional - magma224[ -40960, 73400320, -515547070464, 56274284941110411264 ]225"""226f, h = self.hyperelliptic_polynomials()227return invariants.igusa_clebsch_invariants(4*f + h**2)228229def absolute_igusa_invariants_wamelen(self):230r"""231Return the three absolute Igusa invariants used by van Wamelen [W]_.232233EXAMPLES::234235sage: R.<x> = QQ[]236sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_wamelen()237(0, 0, 0)238sage: HyperellipticCurve((x^5 - 1)(x - 2), (x^2)(x - 2)).absolute_igusa_invariants_wamelen()239(0, 0, 0)240"""241f, h = self.hyperelliptic_polynomials()242return invariants.absolute_igusa_invariants_wamelen(4*f + h**2)243244def absolute_igusa_invariants_kohel(self):245r"""246Return the three absolute Igusa invariants used by Kohel [K]_.247248SEEALSO::249250.. sage.schemes.hyperelliptic_curves.invariants251252EXAMPLES::253254sage: R.<x> = QQ[]255sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_kohel()256(0, 0, 0)257sage: HyperellipticCurve(x^5 - x + 1, x^2).absolute_igusa_invariants_kohel()258(-1030567/178769, 259686400/178769, 20806400/178769)259sage: HyperellipticCurve((x^5 - x + 1)(3*x + 1), (x^2)(3*x + 1)).absolute_igusa_invariants_kohel()260(-1030567/178769, 259686400/178769, 20806400/178769)261"""262f, h = self.hyperelliptic_polynomials()263return invariants.absolute_igusa_invariants_kohel(4*f + h**2)264265266