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 <: FieldElem
Return 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^6
Projective 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*z
A 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 <: FieldElem
Return 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 <: FieldElem
Return 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 <: FieldElem
Return 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 <: FieldElem
Return 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 => 1
reduction
— Methodreduction(C::AffinePlaneCurve{S}) where S <: FieldElem
reduction(C::ProjPlaneCurve{S}) where S <: FieldElem
Return 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^4
is_irreducible
— Methodis_irreducible(C::PlaneCurve{S}) where S <: FieldElem
Return 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)
false
is_reduced
— Methodis_reduced(C::PlaneCurve{S}) where S <: FieldElem
Return 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)
false
union
— Methodunion(C::T, D::T) where T <: PlaneCurve
Return 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^8
arithmetic_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)
1
arithmetic_genus
— Methodarithmetic_genus(C::AffinePlaneCurve)
Return the arithmetic genus of the projective closure of C
.
geometric_genus
— Methodgeometric_genus(C::ProjectivePlaneCurve{T}) where T <: FieldElem
Return 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)
0
geometric_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)
0
Smoothness, 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 <: FieldElem
Throw 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)
false
is_smooth
— Methodis_smooth(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem
Throw 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)
false
tangent
— Methodtangent(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElem
Return 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*y
tangent
— Methodtangent(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem
Return 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*y
curve_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 <: FieldElem
Return 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 <: FieldElem
Return 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)
1
multiplicity
— Method multiplicity(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem
Return the multiplicity of C
at P
.
tangent_lines
— Methodtangent_lines(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElem
Return 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 => 1
tangent_lines
— Method tangent_lines(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem
Return 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)
false
is_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 <: FieldElem
Return 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*y
common_components
— Methodcommon_components(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}) where S <: FieldElem
Return 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 <: FieldElem
Return 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 <: FieldElem
Return 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 <: FieldElem
Return 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)
2
intersection_multiplicity
— Method intersection_multiplicity(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem
Return the intersection multiplicity of C
and D
at P
.
aretransverse
— Methodaretransverse(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}, P::Point{S}) where S<:FieldElem
Return 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)
true
aretransverse
— Method aretransverse(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S<:FieldElem
Return true
if C
and D
intersect transversally at P
and false
otherwise.