# Cyclic cover curve constructor#

sage.schemes.cyclic_covers.constructor.CyclicCover(r, f, names=None, check_smooth=True)[source]#

Return the cyclic cover of the projective line given by $$y^r = f$$, for a univariate polynomial $$f$$.

INPUT:

• r – the order of the cover

• f – univariate polynomial if not given, then it defaults to 0.

• names (default: ["x","y"]) – names for the coordinate functions

• check_squarefree (default: True) – test if the input defines a unramified cover of the projective line.

Warning

When setting check_smooth=False or using a base ring that is not a field, the output curves are not to be trusted. For example, the output of is_singular or is_smooth only tests smoothness over the field of fractions.

Note

The words “cyclic cover” are usually used for covers of degree greater than two. We usually refer to smooth double covers of the projective line as “hyperelliptic curves” or “elliptic curves” if the genus is one. We allow such cases in this implementation, but we highly recommend to use the more specific constructors/classes HyperellipticCurve and EllipticCurve for a wider range of tools.

EXAMPLES:

Basic examples:

sage: R.<x> = QQ[]
sage: CyclicCover(2, x^5 + x + 1)
Cyclic Cover of P^1 over Rational Field defined by y^2 = x^5 + x + 1
sage: CyclicCover(3, x^5 + x + 1)
Cyclic Cover of P^1 over Rational Field defined by y^3 = x^5 + x + 1
sage: CyclicCover(5, x^5 + x + 1)
Cyclic Cover of P^1 over Rational Field defined by y^5 = x^5 + x + 1
sage: CyclicCover(15, x^9 + x + 1)
Cyclic Cover of P^1 over Rational Field defined by y^15 = x^9 + x + 1

sage: k.<a> = GF(9); R.<x> = k[]                                                # needs sage.rings.finite_rings
sage: CyclicCover(5, x^9 + x + 1)                                               # needs sage.rings.finite_rings
Cyclic Cover of P^1 over Finite Field in a of size 3^2
defined by y^5 = x^9 + x + 1
sage: CyclicCover(15, x^9 + x + 1)                                              # needs sage.rings.finite_rings
Traceback (most recent call last):
...
ValueError: As the characteristic divides the order of the cover,
this model is not smooth.

>>> from sage.all import *
>>> R = QQ['x']; (x,) = R._first_ngens(1)
>>> CyclicCover(Integer(2), x**Integer(5) + x + Integer(1))
Cyclic Cover of P^1 over Rational Field defined by y^2 = x^5 + x + 1
>>> CyclicCover(Integer(3), x**Integer(5) + x + Integer(1))
Cyclic Cover of P^1 over Rational Field defined by y^3 = x^5 + x + 1
>>> CyclicCover(Integer(5), x**Integer(5) + x + Integer(1))
Cyclic Cover of P^1 over Rational Field defined by y^5 = x^5 + x + 1
>>> CyclicCover(Integer(15), x**Integer(9) + x + Integer(1))
Cyclic Cover of P^1 over Rational Field defined by y^15 = x^9 + x + 1

>>> k = GF(Integer(9), names=('a',)); (a,) = k._first_ngens(1); R = k['x']; (x,) = R._first_ngens(1)# needs sage.rings.finite_rings
>>> CyclicCover(Integer(5), x**Integer(9) + x + Integer(1))                                               # needs sage.rings.finite_rings
Cyclic Cover of P^1 over Finite Field in a of size 3^2
defined by y^5 = x^9 + x + 1
>>> CyclicCover(Integer(15), x**Integer(9) + x + Integer(1))                                              # needs sage.rings.finite_rings
Traceback (most recent call last):
...
ValueError: As the characteristic divides the order of the cover,
this model is not smooth.


We can change the names of the variables in the output:

sage: k.<a> = GF(9); R.<x> = k[]                                                # needs sage.rings.finite_rings
sage: CyclicCover(5, x^9 + x + 1, names=["A","B"])                              # needs sage.rings.finite_rings
Cyclic Cover of P^1 over Finite Field in a of size 3^2
defined by B^5 = A^9 + A + 1

>>> from sage.all import *
>>> k = GF(Integer(9), names=('a',)); (a,) = k._first_ngens(1); R = k['x']; (x,) = R._first_ngens(1)# needs sage.rings.finite_rings
>>> CyclicCover(Integer(5), x**Integer(9) + x + Integer(1), names=["A","B"])                              # needs sage.rings.finite_rings
Cyclic Cover of P^1 over Finite Field in a of size 3^2
defined by B^5 = A^9 + A + 1


Double roots:

sage: P.<x> = GF(7)[]
sage: CyclicCover(2, (x^3-x+2)^2*(x^6-1))
Traceback (most recent call last):
...
ValueError: Not a smooth Cyclic Cover of P^1: singularity in the provided affine patch.

sage: CyclicCover(2, (x^3-x+2)^2*(x^6-1), check_smooth=False)                   # needs sage.rings.finite_rings
Cyclic Cover of P^1 over Finite Field of size 7
defined by y^2 = x^12 - 2*x^10 - 3*x^9 + x^8 + 3*x^7 + 3*x^6
+ 2*x^4 + 3*x^3 - x^2 - 3*x + 3

>>> from sage.all import *
>>> P = GF(Integer(7))['x']; (x,) = P._first_ngens(1)
>>> CyclicCover(Integer(2), (x**Integer(3)-x+Integer(2))**Integer(2)*(x**Integer(6)-Integer(1)))
Traceback (most recent call last):
...
ValueError: Not a smooth Cyclic Cover of P^1: singularity in the provided affine patch.

>>> CyclicCover(Integer(2), (x**Integer(3)-x+Integer(2))**Integer(2)*(x**Integer(6)-Integer(1)), check_smooth=False)                   # needs sage.rings.finite_rings
Cyclic Cover of P^1 over Finite Field of size 7
defined by y^2 = x^12 - 2*x^10 - 3*x^9 + x^8 + 3*x^7 + 3*x^6
+ 2*x^4 + 3*x^3 - x^2 - 3*x + 3


Input with integer coefficients creates objects with the integers as base ring, but only checks smoothness over $$\QQ$$, not over Spec($$\ZZ$$). In other words, it is checked that the discriminant is non-zero, but it is not checked whether the discriminant is a unit in $$\ZZ^*$$:

sage: R.<x> = ZZ[]
sage: CyclicCover(5, (x^3-x+2)*(x^6-1))
Cyclic Cover of P^1 over Integer Ring defined by y^5 = x^9 - x^7 + 2*x^6 - x^3 + x - 2

>>> from sage.all import *
>>> R = ZZ['x']; (x,) = R._first_ngens(1)
>>> CyclicCover(Integer(5), (x**Integer(3)-x+Integer(2))*(x**Integer(6)-Integer(1)))
Cyclic Cover of P^1 over Integer Ring defined by y^5 = x^9 - x^7 + 2*x^6 - x^3 + x - 2