File: Mathlib/LinearAlgebra/Reflection.lean

full_name: Module.preReflection
code: /-- Given an element `x` in a module `M` and a linear form `f` on `M`, we define the endomorphism
of `M` for which `y ↦ y - (f y) • x`.

One is typically interested in this endomorphism when `f x = 2`; this definition exists to allow the
user defer discharging this proof obligation. See also `Module.reflection`. -/
def preReflection : End R M 
goal: Module.End R M

full_name: Module.preReflection_apply
code: lemma preReflection_apply :
    preReflection x f y = y - (f y) • x 
goal: (Module.preReflection x f) y = y - f y • x

full_name: Module.preReflection_apply_self
code: lemma preReflection_apply_self (h : f x = 2) :
    preReflection x f x = - x 
goal: (Module.preReflection x f) x = -x

full_name: Module.involutive_preReflection
code: lemma involutive_preReflection (h : f x = 2) :
    Involutive (preReflection x f) 
goal: Function.Involutive ⇑(Module.preReflection x f)

full_name: Module.preReflection_preReflection
code: lemma preReflection_preReflection (g : Dual R M) (h : f x = 2) :
    preReflection (preReflection x f y) (preReflection f (Dual.eval R M x) g) =
    (preReflection x f) ∘ₗ (preReflection y g) ∘ₗ (preReflection x f) 
goal: Module.preReflection ((Module.preReflection x f) y) ((Module.preReflection f ((Module.Dual.eval R M) x)) g) =
  Module.preReflection x f ∘ₗ Module.preReflection y g ∘ₗ Module.preReflection x f

full_name: Module.reflection
code: /-- Given an element `x` in a module `M` and a linear form `f` on `M` for which `f x = 2`, we define
the endomorphism of `M` for which `y ↦ y - (f y) • x`.

It is an involutive endomorphism of `M` fixing the kernel of `f` for which `x ↦ -x`. -/
def reflection (h : f x = 2) : M ≃ₗ[R] M 
goal: M ≃ₗ[R] M

full_name: Module.reflection_apply
code: lemma reflection_apply (h : f x = 2) :
    reflection h y = y - (f y) • x 
goal: (Module.reflection h) y = y - f y • x

full_name: Module.reflection_apply_self
code: @[simp]
lemma reflection_apply_self (h : f x = 2) :
    reflection h x = - x 
goal: (Module.reflection h) x = -x

full_name: Module.involutive_reflection
code: lemma involutive_reflection (h : f x = 2) :
    Involutive (reflection h) 
goal: Function.Involutive ⇑(Module.reflection h)

full_name: Module.reflection_symm
code: @[simp]
lemma reflection_symm (h : f x = 2) :
    (reflection h).symm = reflection h 
goal: (Module.reflection h).symm = Module.reflection h

full_name: Module.invOn_reflection_of_mapsTo
code: lemma invOn_reflection_of_mapsTo {Φ : Set M} (h : f x = 2) :
    InvOn (reflection h) (reflection h) Φ Φ 
goal: Set.InvOn (⇑(Module.reflection h)) (⇑(Module.reflection h)) Φ Φ

full_name: Module.bijOn_reflection_of_mapsTo
code: lemma bijOn_reflection_of_mapsTo {Φ : Set M} (h : f x = 2) (h' : MapsTo (reflection h) Φ Φ) :
    BijOn (reflection h) Φ Φ 
goal: Set.BijOn (⇑(Module.reflection h)) Φ Φ

full_name: Module.Dual.eq_of_preReflection_mapsTo
code: /-- See also `Module.Dual.eq_of_preReflection_mapsTo'` for a variant of this lemma which
applies when `Φ` does not span.

This rather technical-looking lemma exists because it is exactly what is needed to establish various
uniqueness results for root data / systems. One might regard this lemma as lying at the boundary of
linear algebra and combinatorics since the finiteness assumption is the key. -/
lemma Dual.eq_of_preReflection_mapsTo [CharZero R] [NoZeroSMulDivisors R M]
    {x : M} (hx : x ≠ 0) {Φ : Set M} (hΦ₁ : Φ.Finite) (hΦ₂ : span R Φ = ⊤) {f g : Dual R M}
    (hf₁ : f x = 2) (hf₂ : MapsTo (preReflection x f) Φ Φ)
    (hg₁ : g x = 2) (hg₂ : MapsTo (preReflection x g) Φ Φ) :
    f = g 
goal: f = g

full_name: Module.Dual.eq_of_preReflection_mapsTo'
code: /-- This rather technical-looking lemma exists because it is exactly what is needed to establish a
uniqueness result for root data. See the doc string of `Module.Dual.eq_of_preReflection_mapsTo` for
further remarks. -/
lemma Dual.eq_of_preReflection_mapsTo' [CharZero R] [NoZeroSMulDivisors R M]
    {x : M} (hx : x ≠ 0) {Φ : Set M} (hΦ₁ : Φ.Finite) (hx' : x ∈ span R Φ) {f g : Dual R M}
    (hf₁ : f x = 2) (hf₂ : MapsTo (preReflection x f) Φ Φ)
    (hg₁ : g x = 2) (hg₂ : MapsTo (preReflection x g) Φ Φ) :
    (span R Φ).subtype.dualMap f = (span R Φ).subtype.dualMap g 
goal: (Submodule.span R Φ).subtype.dualMap f = (Submodule.span R Φ).subtype.dualMap g

full_name: Module.eq_of_mapsTo_reflection_of_mem
code: lemma eq_of_mapsTo_reflection_of_mem [NoZeroSMulDivisors ℤ M] {Φ : Set M} (hΦ : Φ.Finite)
    (hfx : f x = 2) (hgy : g y = 2) (hgx : g x = 2) (hfy : f y = 2)
    (hxfΦ : MapsTo (preReflection x f) Φ Φ)
    (hygΦ : MapsTo (preReflection y g) Φ Φ)
    (hyΦ : y ∈ Φ) :
    x = y 
goal: x = y

full_name: Module.injOn_dualMap_subtype_span_range_range
code: lemma injOn_dualMap_subtype_span_range_range {ι : Type*} [NoZeroSMulDivisors ℤ M]
    {r : ι ↪ M} {c : ι → Dual R M} (hfin : (range r).Finite)
    (h_two : ∀ i, c i (r i) = 2)
    (h_mapsTo : ∀ i, MapsTo (preReflection (r i) (c i)) (range r) (range r)) :
    InjOn (span R (range r)).subtype.dualMap (range c) 
goal: Set.InjOn (⇑(Submodule.span R (Set.range ⇑r)).subtype.dualMap) (Set.range c)