/-
Copyright 2026 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
module
public import Mathlib.Combinatorics.SimpleGraph.Diam
public import Mathlib.Data.Real.Basic
public import FormalConjecturesForMathlib.Combinatorics.SimpleGraph.VertexDistance@[expose] public sectionnamespace SimpleGraphvariable {α : Type*} [Fintype α] [DecidableEq α]The set of vertices of maximum eccentricity.
noncomputable def maxEccentricityVertices (G : SimpleGraph α) : Set α :=
{v : α | G.eccent v = G.ediam}
The average eccentricity of a graph G: the mean of G.eccent v over all vertices,
converted to a real number. Returns 0 if the graph has no vertices.
noncomputable def averageEccentricity (G : SimpleGraph α) : ℝ :=
(∑ v : α, (G.eccent v).toNat) / (Fintype.card α : ℝ)
The diameter of a finite graph as a computable natural number: the maximum BFS distance
(computable_dist) over all ordered pairs of vertices.
def computable_ediam (G : SimpleGraph α) [DecidableRel G.Adj] : ℕ :=
Finset.univ.sup fun p : α × α => computable_dist G p.1 p.2
For a connected finite graph, the extended diameter ediam equals the computable diameter.
a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedp:α × αhp:(Finset.univ.sup fun p ↦ G.computable_dist p.1 p.2) = G.computable_dist p.1 p.2hp':G.computable_ediam = G.computable_dist p.1 p.2⊢ G.edist p.1 p.2 ≤ G.ediam
exact edist_le_ediam All goals completed! 🐙
The eccentricity of a vertex u in a finite graph as a computable natural number:
the maximum BFS distance (computable_dist) from u to any vertex.
def computable_eccent (G : SimpleGraph α) [DecidableRel G.Adj] (u : α) : ℕ :=
Finset.univ.sup fun v => computable_dist G u vThe radius of a finite graph as a computable natural number: the minimum, over all vertices, of the computable eccentricity.
def computable_radius (G : SimpleGraph α) [DecidableRel G.Adj] [Nonempty α] : ℕ :=
Finset.univ.inf' Finset.univ_nonempty (computable_eccent G)
For a connected finite graph, the eccentricity eccent u equals the computable eccentricity.
theorem eccent_eq_computable (G : SimpleGraph α) [DecidableRel G.Adj] [Nonempty α]
(hc : G.Connected) (u : α) : G.eccent u = (computable_eccent G u : ℕ∞) := by α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ G.eccent u = ↑(G.computable_eccent u)
apply le_antisymm a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ G.eccent u ≤ ↑(G.computable_eccent u)a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ ↑(G.computable_eccent u) ≤ G.eccent u
· a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ G.eccent u ≤ ↑(G.computable_eccent u) rw [eccent_le_iff a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ ∀ (v : α), G.edist u v ≤ ↑(G.computable_eccent u) a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ ∀ (v : α), G.edist u v ≤ ↑(G.computable_eccent u)] a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ ∀ (v : α), G.edist u v ≤ ↑(G.computable_eccent u); intro v a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:α⊢ G.edist u v ≤ ↑(G.computable_eccent u)
rw [← (hc.preconnected u v).coe_dist_eq_edist, a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:α⊢ ↑(G.dist u v) ≤ ↑(G.computable_eccent u) a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:α⊢ ↑(G.computable_dist u v) ≤ ↑(G.computable_eccent u) dist_eq_computable a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:α⊢ ↑(G.computable_dist u v) ≤ ↑(G.computable_eccent u)a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:α⊢ ↑(G.computable_dist u v) ≤ ↑(G.computable_eccent u)]a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:α⊢ ↑(G.computable_dist u v) ≤ ↑(G.computable_eccent u)
exact_mod_cast Finset.le_sup (f := fun v => computable_dist G u v) (Finset.mem_univ v) All goals completed! 🐙
· a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:α⊢ ↑(G.computable_eccent u) ≤ G.eccent u obtain ⟨v, -, hv⟩ := Finset.exists_mem_eq_sup (Finset.univ : Finset α) Finset.univ_nonempty
(fun v => computable_dist G u v) a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u v⊢ ↑(G.computable_eccent u) ≤ G.eccent u
have hv' : computable_eccent G u = computable_dist G u v := hv a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ ↑(G.computable_eccent u) ≤ G.eccent u
rw [hv', a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ ↑(G.computable_dist u v) ≤ G.eccent u a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ G.edist u v ≤ G.eccent u ← dist_eq_computable, a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ ↑(G.dist u v) ≤ G.eccent ua α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ G.edist u v ≤ G.eccent u (hc.preconnected u v).coe_dist_eq_edist a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ G.edist u v ≤ G.eccent ua α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ G.edist u v ≤ G.eccent u]a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu:αv:αhv:(Finset.univ.sup fun v ↦ G.computable_dist u v) = G.computable_dist u vhv':G.computable_eccent u = G.computable_dist u v⊢ G.edist u v ≤ G.eccent u
exact edist_le_eccent All goals completed! 🐙
For a connected finite graph, the radius radius equals the computable radius.
theorem radius_eq_computable (G : SimpleGraph α) [DecidableRel G.Adj] [Nonempty α]
(hc : G.Connected) : G.radius = (computable_radius G : ℕ∞) := by α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connected⊢ G.radius = ↑G.computable_radius
apply le_antisymm a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connected⊢ G.radius ≤ ↑G.computable_radiusa α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connected⊢ ↑G.computable_radius ≤ G.radius
· a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connected⊢ G.radius ≤ ↑G.computable_radius obtain ⟨u0, -, hu0⟩ := Finset.exists_mem_eq_inf' (Finset.univ_nonempty) (computable_eccent G) a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu0:αhu0:Finset.univ.inf' ⋯ G.computable_eccent = G.computable_eccent u0⊢ G.radius ≤ ↑G.computable_radius
have h0 : computable_radius G = computable_eccent G u0 := hu0 a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu0:αhu0:Finset.univ.inf' ⋯ G.computable_eccent = G.computable_eccent u0h0:G.computable_radius = G.computable_eccent u0⊢ G.radius ≤ ↑G.computable_radius
rw [h0, a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu0:αhu0:Finset.univ.inf' ⋯ G.computable_eccent = G.computable_eccent u0h0:G.computable_radius = G.computable_eccent u0⊢ G.radius ≤ ↑(G.computable_eccent u0) a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu0:αhu0:Finset.univ.inf' ⋯ G.computable_eccent = G.computable_eccent u0h0:G.computable_radius = G.computable_eccent u0⊢ G.radius ≤ G.eccent u0 ← eccent_eq_computable G hc u0 a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu0:αhu0:Finset.univ.inf' ⋯ G.computable_eccent = G.computable_eccent u0h0:G.computable_radius = G.computable_eccent u0⊢ G.radius ≤ G.eccent u0 a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu0:αhu0:Finset.univ.inf' ⋯ G.computable_eccent = G.computable_eccent u0h0:G.computable_radius = G.computable_eccent u0⊢ G.radius ≤ G.eccent u0]a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu0:αhu0:Finset.univ.inf' ⋯ G.computable_eccent = G.computable_eccent u0h0:G.computable_radius = G.computable_eccent u0⊢ G.radius ≤ G.eccent u0
exact radius_le_eccent All goals completed! 🐙
· a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connected⊢ ↑G.computable_radius ≤ G.radius obtain ⟨u1, hu1⟩ := G.exists_eccent_eq_radius a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu1:αhu1:G.eccent u1 = G.radius⊢ ↑G.computable_radius ≤ G.radius
rw [← hu1, a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu1:αhu1:G.eccent u1 = G.radius⊢ ↑G.computable_radius ≤ G.eccent u1 a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu1:αhu1:G.eccent u1 = G.radius⊢ ↑G.computable_radius ≤ ↑(G.computable_eccent u1) eccent_eq_computable G hc u1 a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu1:αhu1:G.eccent u1 = G.radius⊢ ↑G.computable_radius ≤ ↑(G.computable_eccent u1)a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu1:αhu1:G.eccent u1 = G.radius⊢ ↑G.computable_radius ≤ ↑(G.computable_eccent u1)]a α:Type u_1inst✝³:Fintype αinst✝²:DecidableEq αG:SimpleGraph αinst✝¹:DecidableRel G.Adjinst✝:Nonempty αhc:G.Connectedu1:αhu1:G.eccent u1 = G.radius⊢ ↑G.computable_radius ≤ ↑(G.computable_eccent u1)
exact_mod_cast Finset.inf'_le (computable_eccent G) (Finset.mem_univ u1) All goals completed! 🐙end SimpleGraph