Files
elementarGeometrie/ElementarGeometrie/Projective/Completion.lean
Stefan Kebekus f8cdb5ba69
Some checks failed
Lean Action CI / build (push) Has been cancelled
Update Completion.lean
2026-06-24 14:18:24 +02:00

182 lines
8.7 KiB
Lean4
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2026 Stefan Kebekus. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Stefan Kebekus
-/
import Mathlib.LinearAlgebra.AffineSpace.FiniteDimensional
import ElementarGeometrie.Projective.Space
/-!
# Projective completion of an affine space
Following Soergel's notes, the **projective completion** of an affine space `E`
over a field `K`, with direction space `V`, is the incidence geometry on the
disjoint union `E ⊕ K V`. Its lines are of two kinds:
* an affine line `g ⊆ E` together with its *point at infinity*, the point of
` K V` given by the direction of `g`;
* the projective lines of ` K V`.
The points coming from ` K V` are the **points at infinity**. When `E` is a
plane, the projective lines of ` K V` reduce to a single **line at infinity**.
## Main definitions
* `IncidenceGeometry.completionLines` : the system of lines of the completion.
* `IncidenceGeometry.projectiveCompletion` : the completion as incidence geometry.
* `IncidenceGeometry.pointsAtInfinity` : the points at infinity.
-/
universe u
open scoped LinearAlgebra.Projectivization
namespace IncidenceGeometry
variable (K V E : Type u) [Field K] [AddCommGroup V] [Module K V] [AddTorsor V E]
/-- The system of lines of the projective completion `E ⊕ K V`:
* for every one-dimensional affine subspace `s ⊆ E`, the union of `s` (embedded on
the left) with its point at infinity `⟨direction s⟩` (embedded on the right);
* for every projective line `g` of ` K V`, its image on the right. -/
def completionLines : Set (Set (E K V)) :=
{L |
( (s : AffineSubspace K E) (h : Module.finrank K s.direction = 1),
L = Sum.inl '' (s : Set E) {Sum.inr (Projectivization.mk'' s.direction h)})
( g projectiveLines K V, L = Sum.inr '' g)}
section Helpers
variable {K V E : Type u} [Field K] [AddCommGroup V] [Module K V] [AddTorsor V E]
open AffineSubspace
/-- The point at infinity depends only on the direction, not on the proof. -/
theorem mk''_congr {H H' : Submodule K V} (h : Module.finrank K H = 1)
(h' : Module.finrank K H' = 1) (e : H = H') :
Projectivization.mk'' H h = Projectivization.mk'' H' h' := by subst e; rfl
theorem inl_mem_affLine {s : AffineSubspace K E} {h : Module.finrank K s.direction = 1} {p : E} :
(Sum.inl p : E K V)
Sum.inl '' (s : Set E) {Sum.inr (Projectivization.mk'' s.direction h)} p s := by
simp
theorem inr_mem_affLine {s : AffineSubspace K E} {h : Module.finrank K s.direction = 1}
{ : K V} :
(Sum.inr : E K V)
Sum.inl '' (s : Set E) {Sum.inr (Projectivization.mk'' s.direction h)}
= Projectivization.mk'' s.direction h := by
simp
omit [AddTorsor V E] in
theorem inl_mem_inrImage {g : Set ( K V)} {p : E} :
(Sum.inl p : E K V) Sum.inr '' g False := by simp
omit [AddTorsor V E] in
theorem inr_mem_inrImage {g : Set ( K V)} { : K V} :
(Sum.inr : E K V) Sum.inr '' g g := by simp
end Helpers
open AffineSubspace in
/-- The **projective completion** of the affine space `E` as an incidence
geometry on `E ⊕ K V`. -/
noncomputable def projectiveCompletion : IncidenceGeometry (E K V) where
lines := completionLines K V E
two_points := by
rintro L (s, h, rfl | g, hg, rfl)
· -- An affine line together with its point at infinity has ≥ 2 points.
have hsne : (s : Set E).Nonempty := by
rw [AffineSubspace.nonempty_iff_ne_bot]
intro hbot
rw [hbot, AffineSubspace.direction_bot, finrank_bot] at h
exact absurd h (by norm_num)
obtain p, hp := hsne
refine Sum.inl p, Sum.inr (Projectivization.mk'' s.direction h),
Sum.inl_ne_inr, Set.mem_union_left _ p, hp, rfl, Set.mem_union_right _ rfl
· -- A projective line has ≥ 2 points.
obtain a, b, hab, ha, hb := (projectivization K V).two_points g hg
exact Sum.inr a, Sum.inr b, fun he => hab (Sum.inr_injective he),
a, ha, rfl, b, hb, rfl
unique_line := by
rintro (p | ℓ₁) (q | ℓ₂) hPQ
· -- Two affine points: the affine line through them, plus its infinity point.
have hpq : p q := fun he => hPQ (by rw [he])
have hqp0 : q - p (0 : V) := vsub_ne_zero.2 (Ne.symm hpq)
have hdir1 : Module.finrank K (mk' p (K (q - p))).direction = 1 := by
rw [direction_mk']; exact finrank_span_singleton hqp0
refine Sum.inl '' ((mk' p (K (q - p))) : Set E)
{Sum.inr (Projectivization.mk'' (mk' p (K (q - p))).direction hdir1)},
Or.inl _, hdir1, rfl, Set.mem_union_left _ p, self_mem_mk' _ _, rfl,
Set.mem_union_left _ q, mem_mk'.2 (Submodule.mem_span_singleton_self _), rfl,
?_
rintro L hL, hpL, hqL
rcases hL with s, h, rfl | g, hg, rfl
· rw [inl_mem_affLine] at hpL hqL
haveI : FiniteDimensional K s.direction := Module.finite_of_finrank_eq_succ h
have hle : K (q - p) s.direction :=
(Submodule.span_singleton_le_iff_mem _ _).2 (vsub_mem_direction hqL hpL)
have hdir : s.direction = K (q - p) :=
(Submodule.eq_of_le_of_finrank_eq hle (by rw [finrank_span_singleton hqp0, h])).symm
have hs : s = mk' p (K (q - p)) :=
(mk'_eq hpL).symm.trans (congrArg (mk' p) hdir)
subst hs; rfl
· rw [inl_mem_inrImage] at hpL; exact hpL.elim
· -- An affine point and a point at infinity: the affine line in that direction.
have hdir1 : Module.finrank K (mk' p ℓ₂.submodule).direction = 1 := by
rw [direction_mk']; exact ℓ₂.finrank_submodule
refine Sum.inl '' ((mk' p ℓ₂.submodule) : Set E)
{Sum.inr (Projectivization.mk'' (mk' p ℓ₂.submodule).direction hdir1)},
Or.inl _, hdir1, rfl, Set.mem_union_left _ p, self_mem_mk' _ _, rfl, ?_, ?_
· rw [inr_mem_affLine]; symm
rw [mk''_congr hdir1 ℓ₂.finrank_submodule (direction_mk' _ _)]
exact Projectivization.mk''_submodule ℓ₂
· rintro L hL, hpL, hL
rcases hL with s, h, rfl | g, hg, rfl
· rw [inl_mem_affLine] at hpL
rw [inr_mem_affLine] at hL
have hdir : s.direction = ℓ₂.submodule := by
have hsub := congrArg Projectivization.submodule hL
rw [Projectivization.submodule_mk''] at hsub; exact hsub.symm
have hs : s = mk' p ℓ₂.submodule :=
(mk'_eq hpL).symm.trans (congrArg (mk' p) hdir)
subst hs; rfl
· rw [inl_mem_inrImage] at hpL; exact hpL.elim
· -- A point at infinity and an affine point: symmetric to the previous case.
have hdir1 : Module.finrank K (mk' q ℓ₁.submodule).direction = 1 := by
rw [direction_mk']; exact ℓ₁.finrank_submodule
refine Sum.inl '' ((mk' q ℓ₁.submodule) : Set E)
{Sum.inr (Projectivization.mk'' (mk' q ℓ₁.submodule).direction hdir1)},
Or.inl _, hdir1, rfl, ?_, Set.mem_union_left _ q, self_mem_mk' _ _, rfl, ?_
· rw [inr_mem_affLine]; symm
rw [mk''_congr hdir1 ℓ₁.finrank_submodule (direction_mk' _ _)]
exact Projectivization.mk''_submodule ℓ₁
· rintro L hL, hL, hqL
rcases hL with s, h, rfl | g, hg, rfl
· rw [inr_mem_affLine] at hL
rw [inl_mem_affLine] at hqL
have hdir : s.direction = ℓ₁.submodule := by
have hsub := congrArg Projectivization.submodule hL
rw [Projectivization.submodule_mk''] at hsub; exact hsub.symm
have hs : s = mk' q ℓ₁.submodule :=
(mk'_eq hqL).symm.trans (congrArg (mk' q) hdir)
subst hs; rfl
· rw [inl_mem_inrImage] at hqL; exact hqL.elim
· -- Two points at infinity: the projective line through them.
have hne : ℓ₁ ℓ₂ := fun he => hPQ (by rw [he])
obtain g₀, hg₀lines, hg₀1, hg₀2, hg₀uniq := (projectivization K V).unique_line ℓ₁ ℓ₂ hne
refine Sum.inr '' g₀, Or.inr g₀, hg₀lines, rfl, ℓ₁, hg₀1, rfl, ℓ₂, hg₀2, rfl, ?_
rintro L hL, h1L, h2L
rcases hL with s, h, rfl | g, hg, rfl
· rw [inr_mem_affLine] at h1L h2L
exact absurd (h1L.trans h2L.symm) hne
· rw [inr_mem_inrImage] at h1L h2L
rw [hg₀uniq g hg, h1L, h2L]
/-- The **points at infinity** of the projective completion: the points coming
from ` K V`. -/
def pointsAtInfinity : Set (E K V) := Set.range Sum.inr
end IncidenceGeometry