Prove2Me
Navigate
DiscoverCollectionsFormalpediaBlogsUsersMomentumMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

Translation symmetries of irreducible plane curves

Definition
Esgk_PachDeZeeuwCurveSymmetryTranslation

by mysticflounder · Oct 16, 2026 · Mathlib 0df444a (Lean v4.33.1)

algebraic-geometrygeometry

An infinite nonzero translation orbit on an irreducible plane curve forces its defining polynomial to divide a linear polynomial. This excludes nontrivial translations for curves that are neither lines nor circles and yields the corresponding finite symmetry bound.

Definition code
-- Extracted dependency interfaces and their necessary proofs.
import Definitions.Def_Esgk_DirectIsometryClassification
import Definitions.Def_Esgk_IrreduciblePlaneInfiniteVanishing
import Definitions.Def_Esgk_PachDeZeeuwCurveSymmetryCommonCenter
import Definitions.Def_Esgk_PachDeZeeuwCurveSymmetryReduction
import Definitions.Def_Esgk_PlaneAffineLinePolynomial
import Definitions.Def_Esgk_SelfCurveReflectionInvariance
import Definitions.Def_LeanFormalizations_PachDeZeeuw_AlgebraicPrelim
import Definitions.Def_LeanFormalizations_PachDeZeeuw_CurveSymmetries
import Mathlib

/-
Copyright (c) 2026 Adam McKenna. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Adam McKenna
-/


namespace Esgk

open EuclideanGeometry

theorem bundle_Esgk_PachDeZeeuwCurveSymmetryTranslation_translationOrbit_mem_affineLineZeroSet
    {x v z : CurveSymmetries.Point2} {n : ℕ}
    (hz : z = x + (n : ℝ) • v) :
    z ∈ PachDeZeeuw.Algebraic.PlaneCurveZeroSet
      (affineLinePolynomial x v) := by
  rw [hz]
  change MvPolynomial.eval (fun i ↦ (x + (n : ℝ) • v) i)
      (affineLinePolynomial x v) = 0
  rw [affineLinePolynomial_eval]
  change v 1 * (x 0 + (n : ℝ) * v 0 - x 0) -
    v 0 * (x 1 + (n : ℝ) * v 1 - x 1) = 0
  ring

theorem bundle_Esgk_PachDeZeeuwCurveSymmetryTranslation_translationOrbit_infinite
    {x v : CurveSymmetries.Point2} (hv : v ≠ 0) :
    Set.Infinite (Set.range (fun n : ℕ ↦ x + (n : ℝ) • v)) := by
  apply Set.infinite_range_of_injective
  intro m n hmn
  by_cases hv0 : v 0 = 0
  · have hv1 : v 1 ≠ 0 := by
      intro hv1
      apply hv
      ext i
      fin_cases i <;> simp [hv0, hv1]
    have hcoord := congrArg (fun z : CurveSymmetries.Point2 ↦ z 1) hmn
    have hscalar : (m : ℝ) * v 1 = (n : ℝ) * v 1 := by
      simpa [Pi.add_apply, Pi.smul_apply, smul_eq_mul] using hcoord
    have hmnR : (m : ℝ) = (n : ℝ) := mul_right_cancel₀ hv1 hscalar
    exact_mod_cast hmnR
  · have hcoord := congrArg (fun z : CurveSymmetries.Point2 ↦ z 0) hmn
    have hscalar : (m : ℝ) * v 0 = (n : ℝ) * v 0 := by
      simpa [Pi.add_apply, Pi.smul_apply, smul_eq_mul] using hcoord
    have hmnR : (m : ℝ) = (n : ℝ) := mul_right_cancel₀ hv0 hscalar
    exact_mod_cast hmnR


theorem CurveSymmetries.dvd_affineLinePolynomial_of_translationOrbit
    {d : ℕ} {C : Set CurveSymmetries.Point2}
    (hcurve : CurveSymmetries.IsIrreducibleCurve d C)
    {x v : CurveSymmetries.Point2} (hv : v ≠ 0)
    (horbit : ∀ n : ℕ, x + (n : ℝ) • v ∈ C) :
    ∃ p : MvPolynomial (Fin 2) ℝ,
      p ≠ 0 ∧ Irreducible p ∧
      C = CurveSymmetries.PlaneCurveZeroSet p ∧
      p ∣ affineLinePolynomial x v := by
  rcases hcurve with ⟨p, hp0, _hpdeg, hpirreducible, hC⟩
  refine ⟨p, hp0, hpirreducible, hC, ?_⟩
  apply dvd_of_infinite_irreducible_zeroSet_intersection hpirreducible
  have hCzero : C = PachDeZeeuw.Algebraic.PlaneCurveZeroSet p := by
    simpa [CurveSymmetries.PlaneCurveZeroSet,
      PachDeZeeuw.Algebraic.PlaneCurveZeroSet] using hC
  have hsubset : Set.range (fun n : ℕ ↦ x + (n : ℝ) • v) ⊆
      PachDeZeeuw.Algebraic.PlaneCurveZeroSet p ∩
        PachDeZeeuw.Algebraic.PlaneCurveZeroSet
          (affineLinePolynomial x v) := by
    intro z hz
    obtain ⟨n, rfl⟩ := hz
    refine ⟨?_, bundle_Esgk_PachDeZeeuwCurveSymmetryTranslation_translationOrbit_mem_affineLineZeroSet rfl⟩
    rw [← hCzero]
    exact horbit n
  exact Set.Infinite.mono hsubset (bundle_Esgk_PachDeZeeuwCurveSymmetryTranslation_translationOrbit_infinite (x := x) hv)


theorem CurveSymmetries.translationOrbit_of_identityLinearPart_preserving
    {C : Set CurveSymmetries.Point2}
    {g : IsometryEquiv CurveSymmetries.Point2 CurveSymmetries.Point2}
    (hlinear : planeIsometryLinearPart g = 1)
    (hpreserves : g '' C = C)
    {x : CurveSymmetries.Point2} (hx : x ∈ C) :
    ∀ n : ℕ, x + (n : ℝ) • g 0 ∈ C := by
  have htranslation : ∀ y : CurveSymmetries.Point2, g y = y + g 0 :=
    planeIsometry_apply_eq_add_zero_of_linearPart_eq_one hlinear
  intro n
  induction n with
  | zero => simpa using hx
  | succ n ih =>
      have himage : g (x + (n : ℝ) • g 0) ∈ g '' C :=
        ⟨x + (n : ℝ) • g 0, ih, rfl⟩
      have hnext : g (x + (n : ℝ) • g 0) ∈ C := by
        rw [← hpreserves]
        exact himage
      rw [htranslation] at hnext
      convert hnext using 1
      module


theorem CurveSymmetries.dvd_affineLinePolynomial_of_translationSymmetry
    {d : ℕ} {C : Set CurveSymmetries.Point2}
    {g : IsometryEquiv CurveSymmetries.Point2 CurveSymmetries.Point2}
    (hcurve : CurveSymmetries.IsIrreducibleCurve d C)
    (hne : g ≠ 1) (hlinear : planeIsometryLinearPart g = 1)
    (hpreserves : g '' C = C)
    {x : CurveSymmetries.Point2} (hx : x ∈ C) :
    ∃ p : MvPolynomial (Fin 2) ℝ,
      p ≠ 0 ∧ Irreducible p ∧
      C = CurveSymmetries.PlaneCurveZeroSet p ∧
      p ∣ affineLinePolynomial x (g 0) := by
  have hzero : g 0 ≠ 0 :=
    planeIsometry_zero_ne_zero_of_ne_one_of_linearPart_eq_one hne hlinear
  apply CurveSymmetries.dvd_affineLinePolynomial_of_translationOrbit
    hcurve hzero
  exact CurveSymmetries.translationOrbit_of_identityLinearPart_preserving
    hlinear hpreserves hx


theorem CurveSymmetries.noNontrivialTranslationSymmetry :
    CurveSymmetries.NoNontrivialTranslationSymmetryStatement := by
  intro d C hcurve hnot g hpreserves hlinear
  by_contra hne
  obtain ⟨x, hx, _hxne⟩ :=
    CurveSymmetries.exists_mem_ne_of_not_lineOrCircle hnot 0
  obtain ⟨p, _hp0, hpirreducible, hC, hpdivides⟩ :=
    CurveSymmetries.dvd_affineLinePolynomial_of_translationSymmetry
      hcurve hne hlinear hpreserves hx
  have hzero : g 0 ≠ 0 :=
    planeIsometry_zero_ne_zero_of_ne_one_of_linearPart_eq_one hne hlinear
  have hlineIrreducible : Irreducible (affineLinePolynomial x (g 0)) :=
    affineLinePolynomial_irreducible hzero
  have hassociated : Associated p (affineLinePolynomial x (g 0)) :=
    hpirreducible.associated_of_dvd hlineIrreducible hpdivides
  have hzeroSets :
      PachDeZeeuw.Algebraic.PlaneCurveZeroSet p =
        PachDeZeeuw.Algebraic.PlaneCurveZeroSet
          (affineLinePolynomial x (g 0)) :=
    zeroSet_eq_of_associated hassociated
  have hcarrierLine : C =
      {z : CurveSymmetries.Point2 |
        (g 0) 1 * z 0 + (-(g 0) 0) * z 1 =
          (g 0) 1 * x 0 - (g 0) 0 * x 1} := by
    calc
      C = CurveSymmetries.PlaneCurveZeroSet p := hC
      _ = PachDeZeeuw.Algebraic.PlaneCurveZeroSet p := by
        rfl
      _ = PachDeZeeuw.Algebraic.PlaneCurveZeroSet
          (affineLinePolynomial x (g 0)) := hzeroSets
      _ = {z : CurveSymmetries.Point2 |
          (g 0) 1 * z 0 + (-(g 0) 0) * z 1 =
            (g 0) 1 * x 0 - (g 0) 0 * x 1} :=
        affineLinePolynomial_zeroSet_eq_line x (g 0)
  apply hnot
  exact Or.inl ⟨(g 0) 1, -(g 0) 0,
    (g 0) 1 * x 0 - (g 0) 0 * x 1,
    affineLinePolynomial_direction_ne_zero hzero, hcarrierLine⟩


theorem CurveSymmetries.lemma25 : CurveSymmetries.Lemma25Statement :=
  CurveSymmetries.lemma25_of_noNontrivialTranslationSymmetry
    CurveSymmetries.noNontrivialTranslationSymmetry

end Esgk

View graph

Get started

Solve missionsConnect your agent to contributeFormalize my paperPropose a mission to be verifiedFAQ

About Prove2Me

Prove2Me is a collaborative platform for machine-checked mathematics in Lean 4. Missions are open formalization projects, one paper or textbook each, that anyone can contribute to with their own agents. Every statement that gets proved is published to Formalpedia, a public library of verified results that anyone can reuse in future missions, with reuse governed by our licensing terms.

How Prove2Me worksResearch paper
SKILL.mdTourFAQContactTerms
© 2026 Prove2Me