Affine and Projective Plane Curves
We consider two kinds of plane curves: affine and projective. An affine plane curve is defined by a polynomial in two variables, whereas a projective plane curve is defined by a homogeneous polynomial belonging to a graded polynomial ring in three variables.
Affine Plane Curves
An affine plane curve is defined as the class of a two-variables polynomial $F$ over a field $K$, modulo the equivalence relation $F \sim G \iff \exists \lambda \in K\backslash \{0\}, F = \lambda \cdot G$.
Example
AffinePlaneCurve — TypeAffinePlaneCurve{S}(eq::Oscar.MPolyRingElem{S}) where S <: FieldElemReturn the Affine Plane Curve defined by the polynomial in two variables eq.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> F = y^3*x^6 - y^6*x^2
x^6*y^3 - x^2*y^6
julia> C = Oscar.AffinePlaneCurve(F)
Affine plane curve defined by x^6*y^3 - x^2*y^6Projective Plane Curves
Similarly, a projective plane curve is defined as the class of a three-variables homogeneous polynomial $F$ over a field $K$, modulo the equivalence relation $F\sim G \iff \exists \lambda \in K\backslash \{0\}, F = \lambda \cdot G$. The defining equation is supposed to belong to a graded ring.
ProjPlaneCurve — TypeProjPlaneCurve{S}(eq::Oscar.MPolyDecRingElem{S}) where {S <: FieldElem}Return the Projective Plane Curve defined by the homogeneous polynomial in three variables eq.
Examples
julia> R, (x,y,z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(R)
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> F = T(y^3*x^6 - y^6*x^2*z)
x^6*y^3 - x^2*y^6*z
julia> Oscar.ProjPlaneCurve(F)
Projective plane curve defined by x^6*y^3 - x^2*y^6*zA particular kind of projective curves is the case of elliptic curves, see the corresponding section for more information. The types ProjPlaneCurve and ProjEllipticCurve are subtypes of the abstract type ProjectivePlaneCurve. In addition, the types AffinePlaneCurve and ProjectivePlaneCurve are subtypes of the abstract type PlaneCurve.
Points
When considering curves, it is natural to have a look at points on the curve. We describe in this section how to deal with points, both in the affine and projective settings.
Point in the affine space
A point in the affine space can be defined as follows:
Point — TypePoint(coordinates::Vector{S}) where {S <: FieldElem}Return the point with the given coordinates.
Examples
julia> P = Oscar.Point([QQ(1), QQ(2), QQ(2)])
Point with coordinates QQFieldElem[1, 2, 2]We consider also the following function for points.
ideal_point — Methodideal_point(R::MPolyRing{S}, P::Point{S}) where S <: FieldElemReturn the maximal ideal associated to the point P in the ring R.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> P = Oscar.Point([QQ(2), QQ(1)])
Point with coordinates QQFieldElem[2, 1]
julia> Oscar.ideal_point(R, P)
ideal(x - 2, y - 1)The following function checks if a given point is on a curve:
in — Methodin(P::Point{S}, C::AffinePlaneCurve{S}) where S <: FieldElemReturn true if the point P is on the curve C, and false otherwise.
Point in the projective space
In order to define a point in the projective plane, one needs first to define the projective plane as follows, where K is the base ring:
julia> K = QQ
Rational field
julia> PP = proj_space(K, 2)
(Projective space of dim 2 over Rational field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])
Then, one can define a projective point as follows:
julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(1), QQ(2), QQ(-5)])
(1 : 2 : -5)
The following function checks if a given point is on a curve:
in — Methodin(P::Oscar.Geometry.ProjSpcElem{S}, C::ProjectivePlaneCurve{S}) where S <: FieldElemReturn true if the point P is on the curve C, and false otherwise.
General functions for curves
degree — Methoddegree(C::PlaneCurve)Return the degree of the defining polynomial of C.
ring — Methodring(C::PlaneCurve)Return the coordinate ring of the curve C.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^2+x-x^3)
Affine plane curve defined by -x^3 + x + y^2
julia> Oscar.ring(C)
(Quotient of multivariate polynomial ring by ideal with 1 generator, Map from
Multivariate polynomial ring in 2 variables over QQ to Quotient of multivariate polynomial ring by ideal with 1 generator defined by a julia-function with inverse)curve_components — Methodcurve_components(C::PlaneCurve{S}) where S <: FieldElemReturn a dictionary containing the irreducible components of C and their multiplicity.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6
julia> Oscar.curve_components(C)
Dict{AffinePlaneCurve{QQFieldElem}, Int64} with 3 entries:
y => 3
x => 2
x^4 - y^3 => 1reduction — Methodreduction(C::AffinePlaneCurve{S}) where S <: FieldElem
reduction(C::ProjPlaneCurve{S}) where S <: FieldElemReturn the plane curve defined by the squarefree part of the equation of C.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6
julia> Oscar.reduction(C)
Affine plane curve defined by x^5*y - x*y^4is_irreducible — Methodis_irreducible(C::PlaneCurve{S}) where S <: FieldElemReturn true if C is irreducible, and false otherwise.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^2+x-x^3)
Affine plane curve defined by -x^3 + x + y^2
julia> Oscar.is_irreducible(C)
true
julia> D = Oscar.AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6
julia> Oscar.is_irreducible(D)
falseis_reduced — Methodis_reduced(C::PlaneCurve{S}) where S <: FieldElemReturn true if C is reduced, and false otherwise.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^2+x-x^3)
Affine plane curve defined by -x^3 + x + y^2
julia> Oscar.is_reduced(C)
true
julia> D = Oscar.AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6
julia> Oscar.is_reduced(D)
falseunion — Methodunion(C::T, D::T) where T <: PlaneCurveReturn the union of C and D (with multiplicity).
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^2+x-x^3)
Affine plane curve defined by -x^3 + x + y^2
julia> D = Oscar.AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6
julia> union(C, D)
Affine plane curve defined by -x^9*y^3 + x^7*y^3 + x^6*y^5 + x^5*y^6 - x^3*y^6 - x^2*y^8arithmetic_genus — Methodarithmetic_genus(C::ProjectivePlaneCurve)Return the arithmetic genus of C.
Examples
julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> C = Oscar.ProjPlaneCurve(T(y^2 * z - x^3 - x * z^2))
Projective plane curve defined by -x^3 - x*z^2 + y^2*z
julia> Oscar.PlaneCurveModule.arithmetic_genus(C)
1arithmetic_genus — Methodarithmetic_genus(C::AffinePlaneCurve)Return the arithmetic genus of the projective closure of C.
geometric_genus — Methodgeometric_genus(C::ProjectivePlaneCurve{T}) where T <: FieldElemReturn the geometric genus of C.
Examples
julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> C = ProjPlaneCurve(z*x^2-y^3)
Projective plane curve defined by x^2*z - y^3
julia> geometric_genus(C)
0geometric_genus — Methodgeometric_genus(C::AffinePlaneCurve)Return the geometric genus of the projective closure of C.
Examples
julia> R, (x, y) = polynomial_ring(GF(7), ["x", "y"])
(Multivariate polynomial ring in 2 variables over GF(7), fpMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^9 - x^2*(x-1)^9)
Affine plane curve defined by 6*x^11 + 2*x^10 + 6*x^9 + x^4 + 5*x^3 + x^2 + y^9
julia> Oscar.geometric_genus(C)
0Smoothness, tangents and singularity related functions
jacobi_ideal — Methodjacobi_ideal(C::PlaneCurve)Return the Jacobian ideal of the defining polynomial of C.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6
julia> Oscar.jacobi_ideal(C)
ideal(6*x^5*y^3 - 2*x*y^6, 3*x^6*y^2 - 6*x^2*y^5)is_smooth — Methodis_smooth(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElemThrow an error if P is not a point of C, return false if P is a singular point of C, and true if P is a smooth point of C.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4
julia> P = Oscar.Point([QQ(0), QQ(0)])
Point with coordinates QQFieldElem[0, 0]
julia> Oscar.is_smooth(C, P)
falseis_smooth — Methodis_smooth(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElemThrow an error if P is not a point of C, return false if P is a singular point of C, and true if P is a smooth point of C.
Examples
julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> C = Oscar.ProjPlaneCurve(x^2*(x+y)*(y^3-x^2*z))
Projective plane curve defined by -x^5*z - x^4*y*z + x^3*y^3 + x^2*y^4
julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])
julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(0), QQ(1)])
(0 : 0 : 1)
julia> Oscar.is_smooth(C, P)
falsetangent — Methodtangent(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElemReturn the tangent of C at P when P is a smooth point of C, and throw an error otherwise.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4
julia> P2 = Oscar.Point([QQ(2), QQ(-2)])
Point with coordinates QQFieldElem[2, -2]
julia> Oscar.tangent(C, P2)
Affine plane curve defined by -48*x - 48*ytangent — Methodtangent(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElemReturn the tangent of C at P when P is a smooth point of C, and throw an error otherwise.
Examples
julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y","z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])
julia> C = Oscar.ProjPlaneCurve(x^2*(x+y)*(y^3-x^2*z))
Projective plane curve defined by -x^5*z - x^4*y*z + x^3*y^3 + x^2*y^4
julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(2), QQ(-2), QQ(1)])
(2 : -2 : 1)
julia> Oscar.tangent(C, P)
Projective plane curve defined by -48*x - 48*ycurve_singular_locus — Methodcurve_singular_locus(C::AffinePlaneCurve)Return the reduced singular locus of C as a list whose first element is the affine plane curve consisting of the singular components of C (if any), and the second element is the list of the isolated singular points (which may be contained in the singular component). The singular component might not contain any point over the considered field.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4
julia> Oscar.curve_singular_locus(C)
2-element Vector{Vector}:
AffinePlaneCurve[Affine plane curve defined by x]
Point[Point with coordinates QQFieldElem[-1, 1], Point with coordinates QQFieldElem[0, 0]]curve_singular_locus — Methodcurve_singular_locus([PP::Oscar.Geometry.ProjSpc{S}], C::ProjectivePlaneCurve{S}) where S <: FieldElemReturn the reduced singular locus of C as a list whose first element is the projective plane curve consisting of the singular components of C (if any), and the second element is the list of the singular points of the reduction of C (the points are in PP if specified, or in a new projective space otherwise). The singular component might not contain any point over the considered field.
multiplicity — Methodmultiplicity(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElemReturn the multiplicity of C at P.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4
julia> P = Oscar.Point([QQ(2), QQ(-2)])
Point with coordinates QQFieldElem[2, -2]
julia> Oscar.multiplicity(C, P)
1multiplicity — Method multiplicity(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElemReturn the multiplicity of C at P.
tangent_lines — Methodtangent_lines(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElemReturn the tangent lines at P to C with their multiplicity.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4
julia> P = Oscar.Point([QQ(0), QQ(0)])
Point with coordinates QQFieldElem[0, 0]
julia> Oscar.tangent_lines(C, P)
Dict{AffinePlaneCurve{QQFieldElem}, Int64} with 2 entries:
x => 4
x + y => 1tangent_lines — Method tangent_lines(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElemReturn the tangent lines at P to C with their multiplicity.
is_smooth_curve — Methodis_smooth_curve(C::AffinePlaneCurve)Return true if C has no singular point, and false otherwise.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x*(x+y))
Affine plane curve defined by x^2 + x*y
julia> Oscar.is_smooth_curve(C)
falseis_smooth_curve — Methodis_smooth_curve(C::ProjectivePlaneCurve)Return true if C has no singular point, and false otherwise.
Intersection of curves
common_components — Methodcommon_components(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}) where S <: FieldElemReturn the affine plane curve consisting of the common component of C and D, or an empty vector if they do not have a common component.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x*(x+y)*(x^2 + x + 1))
Affine plane curve defined by x^4 + x^3*y + x^3 + x^2*y + x^2 + x*y
julia> D = Oscar.AffinePlaneCurve(x*(x+y)*(x-y))
Affine plane curve defined by x^3 - x*y^2
julia> Oscar.common_components(C, D)
1-element Vector{AffinePlaneCurve{QQFieldElem}}:
Affine plane curve defined by x^2 + x*ycommon_components — Methodcommon_components(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}) where S <: FieldElemReturn the projective plane curve consisting of the common component of C and D, or an empty vector if they do not have a common component.
curve_intersect — Methodcurve_intersect(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}) where S <: FieldElemReturn a list whose first element is the affine plane curve defined by the gcd of C.eq and D.eq, the second element is the list of the remaining intersection points when the common components are removed from C and D.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x*(x+y))
Affine plane curve defined by x^2 + x*y
julia> D = Oscar.AffinePlaneCurve((x-y)*(x-2))
Affine plane curve defined by x^2 - x*y - 2*x + 2*y
julia> Oscar.curve_intersect(C, D)
2-element Vector{Vector}:
AffinePlaneCurve[]
Point{QQFieldElem}[Point with coordinates QQFieldElem[0, 0], Point with coordinates QQFieldElem[2, -2]]curve_intersect — Methodcurve_intersect([PP::Oscar.Geometry.ProjSpc{S}], C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}) where S <: FieldElemReturn a list whose first element is the projective plane curve defined by the gcd of C.eq and D.eq, the second element is the list of the remaining intersection points when the common components are removed from C and D (the points are in PP if specified, or in a new projective space otherwise).
Examples
julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y","z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])
julia> C = Oscar.ProjPlaneCurve(T(x+y+z))
Projective plane curve defined by x + y + z
julia> D = Oscar.ProjPlaneCurve(T(z))
Projective plane curve defined by z
julia> Oscar.curve_intersect(PP[1], C, D)
2-element Vector{Vector{Any}}:
[]
[(-1 : 1 : 0)]intersection_multiplicity — Methodintersection_multiplicity(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElemReturn the intersection multiplicity of C and D at P.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve((x^2+y^2)*(x^2 + y^2 + 2*y))
Affine plane curve defined by x^4 + 2*x^2*y^2 + 2*x^2*y + y^4 + 2*y^3
julia> D = Oscar.AffinePlaneCurve((x^2+y^2)*(y^3*x^6 - y^6*x^2))
Affine plane curve defined by x^8*y^3 + x^6*y^5 - x^4*y^6 - x^2*y^8
julia> Q = Oscar.Point([QQ(0), QQ(-2)])
Point with coordinates QQFieldElem[0, -2]
julia> Oscar.intersection_multiplicity(C, D, Q)
2intersection_multiplicity — Method intersection_multiplicity(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElemReturn the intersection multiplicity of C and D at P.
aretransverse — Methodaretransverse(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}, P::Point{S}) where S<:FieldElemReturn true if C and D intersect transversally at P and false otherwise.
Examples
julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> C = Oscar.AffinePlaneCurve(x*(x+y))
Affine plane curve defined by x^2 + x*y
julia> D = Oscar.AffinePlaneCurve((x-y)*(x-2))
Affine plane curve defined by x^2 - x*y - 2*x + 2*y
julia> P = Oscar.Point([QQ(0), QQ(0)])
Point with coordinates QQFieldElem[0, 0]
julia> Q = Oscar.Point([QQ(2), QQ(-2)])
Point with coordinates QQFieldElem[2, -2]
julia> Oscar.aretransverse(C, D, P)
false
julia> Oscar.aretransverse(C, D, Q)
truearetransverse — Method aretransverse(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S<:FieldElemReturn true if C and D intersect transversally at P and false otherwise.