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 coverf
– univariate polynomial if not given, then it defaults to 0.names
(default:["x","y"]
) – names for the coordinate functionscheck_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 ofis_singular
oris_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