# HG changeset patch
# User Nick Alexander <ncalexander@gmail.com>
# Date 1242107581 25200
# Node ID 87edc42e682b66e1236459ad8a76b375862c855a
# Parent  268d1efbf60f6c24ad9c49cb9c91ff0437e42340
[mq]: take2.patch

diff -r 268d1efbf60f -r 87edc42e682b sage/schemes/hyperelliptic_curves/all.py
--- a/sage/schemes/hyperelliptic_curves/all.py	Tue May 05 23:19:43 2009 -0700
+++ b/sage/schemes/hyperelliptic_curves/all.py	Mon May 11 22:53:01 2009 -0700
@@ -1,4 +1,7 @@
 from constructor import HyperellipticCurve
 from hyperelliptic_generic import is_HyperellipticCurve
 from kummer_surface import KummerSurface
-
+from invariants import (igusa_clebsch_invariants,
+                        absolute_igusa_invariants_kohel,
+                        absolute_igusa_invariants_wamelen,
+                        clebsch_invariants)
diff -r 268d1efbf60f -r 87edc42e682b sage/schemes/hyperelliptic_curves/hyperelliptic_g2_generic.py
--- a/sage/schemes/hyperelliptic_curves/hyperelliptic_g2_generic.py	Tue May 05 23:19:43 2009 -0700
+++ b/sage/schemes/hyperelliptic_curves/hyperelliptic_g2_generic.py	Mon May 11 22:53:01 2009 -0700
@@ -7,12 +7,11 @@
 import hyperelliptic_generic
 import jacobian_g2
 
+import invariants
+
 from sage.schemes.generic.projective_space import ProjectiveSpace
 
 class HyperellipticCurve_g2_generic(hyperelliptic_generic.HyperellipticCurve_generic):
-    def igusa_invariants(self):
-        raise NotImplementedError
-
     def is_odd_degree(self):
         """
         Returns True if the curve is an odd degree model.
@@ -26,7 +25,7 @@
         else:
             a0 = f.leading_coefficient()
             c0 = h.leading_coefficient()
-            return (c0^2 + 4*a0) == 0
+            return (c0**2 + 4*a0) == 0
 
     def jacobian(self):
         return jacobian_g2.HyperellipticJacobian_g2(self)
@@ -47,3 +46,111 @@
         J = self.jacobian()
         K = J.kummer_surface()
         return self._kummer_morphism
+
+    def clebsch_invariants(self):
+        r"""
+        Return the Clebsch invariants `(A, B, C, D)` of Mestre, p 317, [M]_.
+
+        SEEALSO::
+
+        .. sage.schemes.hyperelliptic_curves.invariants
+
+        EXAMPLES::
+
+            sage: R.<x> = QQ[]
+            sage: f = x^5 - x^4 + 3
+            sage: HyperellipticCurve(f).clebsch_invariants()
+            (0, -2048/375, -4096/25, -4881645568/84375)
+            sage: HyperellipticCurve(f(2*x)).clebsch_invariants()
+            (0, -8388608/375, -1073741824/25, -5241627016305836032/84375)
+
+            sage: HyperellipticCurve(f, x).clebsch_invariants()
+            (-8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625)
+            sage: HyperellipticCurve(f(2*x), 2*x).clebsch_invariants()
+            (-512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625)
+
+        TESTS::
+
+            sage: magma(HyperellipticCurve(f)).ClebschInvariants() # optional - magma
+            [ 0, -2048/375, -4096/25, -4881645568/84375 ]
+            sage: magma(HyperellipticCurve(f(2*x))).ClebschInvariants() # optional - magma
+            [ 0, -8388608/375, -1073741824/25, -5241627016305836032/84375 ]
+            sage: magma(HyperellipticCurve(f, x)).ClebschInvariants() # optional - magma
+            [ -8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625 ]
+            sage: magma(HyperellipticCurve(f(2*x), 2*x)).ClebschInvariants() # optional - magma
+            [ -512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625 ]
+        """
+        f, h = self.hyperelliptic_polynomials()
+        return invariants.clebsch_invariants(4*f + h**2)
+
+    def igusa_clebsch_invariants(self):
+        r"""
+        Return the Igusa-Clebsch invariants `I_2, I_4, I_6, I_{10}` of Igusa and Clebsch [I]_.
+
+        SEEALSO::
+
+        .. sage.schemes.hyperelliptic_curves.invariants
+
+        EXAMPLES::
+
+            sage: R.<x> = QQ[]
+            sage: f = x^5 - x + 2
+            sage: HyperellipticCurve(f).igusa_clebsch_invariants()
+            (-640, -20480, 1310720, 52160364544)
+            sage: HyperellipticCurve(f(2*x)).igusa_clebsch_invariants()
+            (-40960, -83886080, 343597383680, 56006764965979488256)
+
+            sage: HyperellipticCurve(f, x).igusa_clebsch_invariants()
+            (-640, 17920, -1966656, 52409511936)
+            sage: HyperellipticCurve(f(2*x), 2*x).igusa_clebsch_invariants()
+            (-40960, 73400320, -515547070464, 56274284941110411264)
+
+        TESTS::
+
+            sage: magma(HyperellipticCurve(f)).IgusaClebschInvariants() # optional - magma
+            [ 0, -2048/375, -4096/25, -4881645568/84375 ]
+            sage: magma(HyperellipticCurve(f(2*x))).IgusaClebschInvariants() # optional - magma
+            [ 0, -8388608/375, -1073741824/25, -5241627016305836032/84375 ]
+            sage: magma(HyperellipticCurve(f, x)).IgusaClebschInvariants() # optional - magma
+            [ -8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625 ]
+            sage: magma(HyperellipticCurve(f(2*x), 2*x)).IgusaClebschInvariants() # optional - magma
+            [ -512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625 ]
+        """
+        f, h = self.hyperelliptic_polynomials()
+        return invariants.igusa_clebsch_invariants(4*f + h**2)
+
+    def absolute_igusa_invariants_wamelen(self):
+        r"""
+        Return the three absolute Igusa invariants used by van Wamelen [W]_.
+
+        EXAMPLES::
+
+            sage: R.<x> = QQ[]
+            sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_wamelen()
+            (0, 0, 0)
+            sage: HyperellipticCurve((x^5 - 1)(x - 2), (x^2)(x - 2)).absolute_igusa_invariants_wamelen()
+            (0, 0, 0)
+        """
+        f, h = self.hyperelliptic_polynomials()
+        return invariants.absolute_igusa_invariants_wamelen(4*f + h**2)
+
+    def absolute_igusa_invariants_kohel(self):
+        r"""
+        Return the three absolute Igusa invariants used by Kohel [K]_.
+
+        SEEALSO::
+
+        .. sage.schemes.hyperelliptic_curves.invariants
+
+        EXAMPLES::
+
+            sage: R.<x> = QQ[]
+            sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_kohel()
+            (0, 0, 0)
+            sage: HyperellipticCurve(x^5 - x + 1, x^2).absolute_igusa_invariants_kohel()
+            (-1030567/178769, 259686400/178769, 20806400/178769)
+            sage: HyperellipticCurve((x^5 - x + 1)(3*x + 1), (x^2)(3*x + 1)).absolute_igusa_invariants_kohel()
+            (-1030567/178769, 259686400/178769, 20806400/178769)
+        """
+        f, h = self.hyperelliptic_polynomials()
+        return invariants.absolute_igusa_invariants_kohel(4*f + h**2)
diff -r 268d1efbf60f -r 87edc42e682b sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py
--- a/sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py	Tue May 05 23:19:43 2009 -0700
+++ b/sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py	Mon May 11 22:53:01 2009 -0700
@@ -63,8 +63,10 @@
             names = ["x","y"]
         elif isinstance(names,str):
             names = names.split(",")
+        self._names = names
         P1 = PolynomialRing(R,name=names[0])
         P2 = PolynomialRing(P1,name=names[1])
+        self._PP = PP
         self._printing_ring = P2
         self._hyperelliptic_polynomials = (f,h)
         self._genus = genus
