diff --git a/docs/oscar_references.bib b/docs/oscar_references.bib index b6217f884504..25937712cedd 100644 --- a/docs/oscar_references.bib +++ b/docs/oscar_references.bib @@ -185,6 +185,18 @@ @Article{BE23 doi = {10.1090/jag/810} } +@Article{BE91, + author = {Bayer, Dave and Eisenbud, David}, + title = {Graph Curves}, + journal = {Advances in Mathematics}, + volume = {86}, + number = {1}, + pages = {1--40}, + year = {1991}, + month = mar, + doi = {10.1016/0001-8708(91)90034-5} +} + @Misc{BEO23, author = {Besche, Hans Ulrich and Eick, Bettina and O'Brien, Eamonn}, title = {SmallGrp, The GAP Small Groups Library, Version 1.5.3}, diff --git a/docs/src/AlgebraicGeometry/Curves/ProjectiveCurves.md b/docs/src/AlgebraicGeometry/Curves/ProjectiveCurves.md index 0e5ccb7d86b6..322ec37412d2 100644 --- a/docs/src/AlgebraicGeometry/Curves/ProjectiveCurves.md +++ b/docs/src/AlgebraicGeometry/Curves/ProjectiveCurves.md @@ -8,4 +8,5 @@ CurrentModule = Oscar ProjectiveCurve invert_birational_map geometric_genus +graph_curve ``` diff --git a/src/AlgebraicGeometry/AlgebraicGeometry.jl b/src/AlgebraicGeometry/AlgebraicGeometry.jl index 09c30e3ce922..d083ff7c5a1f 100644 --- a/src/AlgebraicGeometry/AlgebraicGeometry.jl +++ b/src/AlgebraicGeometry/AlgebraicGeometry.jl @@ -3,6 +3,7 @@ include("ToricVarieties/JToric.jl") include("Curves/AffinePlaneCurve.jl") include("Curves/ProjectivePlaneCurve.jl") include("Curves/ProjectiveCurve.jl") +include("Curves/GraphCurve.jl") include("Curves/ParametrizationPlaneCurves.jl") include("Surfaces/K3Auto.jl") include("Surfaces/AdjunctionProcess/AdjunctionProcess.jl") diff --git a/src/AlgebraicGeometry/Curves/GraphCurve.jl b/src/AlgebraicGeometry/Curves/GraphCurve.jl new file mode 100644 index 000000000000..e44d775129df --- /dev/null +++ b/src/AlgebraicGeometry/Curves/GraphCurve.jl @@ -0,0 +1,50 @@ +@doc raw""" + graph_curve(G::Graph) + +Return the graph curve of `G`, i.e., a union of lines whose dual graph is `G`, see [BE91](@cite). + +Assumes that `G` is trivalent and 3-connected. + +# Examples +```jldoctest +julia> G1 = vertex_edge_graph(simplex(3)) +Undirected graph with 4 nodes and the following edges: +(2, 1)(3, 1)(3, 2)(4, 1)(4, 2)(4, 3) + +julia> C1 = graph_curve(G1) +Projective curve + in projective 2-space over QQ with coordinates [x1, x2, x3] +defined by ideal (x1^2*x2*x3 - x1*x2^2*x3 + x1*x2*x3^2) + +julia> G2 = vertex_edge_graph(cube(3)) +Undirected graph with 8 nodes and the following edges: +(2, 1)(3, 1)(4, 2)(4, 3)(5, 1)(6, 2)(6, 5)(7, 3)(7, 5)(8, 4)(8, 6)(8, 7) + +julia> C2 = graph_curve(G2) +Projective curve + in projective 4-space over QQ with coordinates [x1, x2, x3, x4, x5] +defined by ideal with 5 generators + +``` +""" +function graph_curve(G::Graph; check::Bool=true) + @req all(isequal(3),degree(G)) "G is not trivalent" + @req connectivity(G)==3 "G is not three-connected" + + R,_ = graded_polynomial_ring(QQ,Int(nv(G)//2+1)) + rowOfVariables = matrix(R,[gens(R)]) + + cycleMatrix = kernel(matrix(QQ,signed_incidence_matrix(G)); side=:right) + cycleMatrix = matrix(R,cycleMatrix) # converting to matrix over R for vcat below + + vertexIdeals = MPolyIdeal[] + for v in 1:n_vertices(G) + edgesContainingV = findall(edge->(v in edge),collect(edges(G))) + cycleMatrix_v = cycleMatrix[edgesContainingV,:] + push!(vertexIdeals,ideal(minors(vcat(cycleMatrix_v,rowOfVariables),3))) + end + graphCurveIdeal = reduce(intersect,vertexIdeals) + graphCurve = projective_curve(graphCurveIdeal) + + return graphCurve +end diff --git a/src/exports.jl b/src/exports.jl index a55d0e7a51a0..b6e2a390233a 100644 --- a/src/exports.jl +++ b/src/exports.jl @@ -667,6 +667,7 @@ export graded_map export graded_polynomial_ring export grading_group export graph +export graph_curve export graph_from_adjacency_matrix export graph_from_edges export grassmann_pluecker_ideal