File: Mathlib/RingTheory/Idempotents.lean

full_name: isIdempotentElem_one_sub_one_sub_pow_pow
code: theorem isIdempotentElem_one_sub_one_sub_pow_pow
    (x : R) (n : ℕ) (hx : (x - x ^ 2) ^ n = 0) :
    IsIdempotentElem (1 - (1 - x ^ n) ^ n) 
goal: IsIdempotentElem (1 - (1 - x ^ n) ^ n)

full_name: exists_isIdempotentElem_mul_eq_zero_of_ker_isNilpotent_aux
code: theorem exists_isIdempotentElem_mul_eq_zero_of_ker_isNilpotent_aux
    (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    (e₁ : S) (he : e₁ ∈ f.range) (he₁ : IsIdempotentElem e₁)
    (e₂ : R) (he₂ : IsIdempotentElem e₂) (he₁e₂ : e₁ * f e₂ = 0) :
    ∃ e' : R, IsIdempotentElem e' ∧ f e' = e₁ ∧ e' * e₂ = 0 
goal: ∃ e', IsIdempotentElem e' ∧ f e' = e₁ ∧ e' * e₂ = 0

full_name: exists_isIdempotentElem_mul_eq_zero_of_ker_isNilpotent
code: /-- Orthogonal idempotents lift along nil ideals. -/
theorem exists_isIdempotentElem_mul_eq_zero_of_ker_isNilpotent
    (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    (e₁ : S) (he : e₁ ∈ f.range) (he₁ : IsIdempotentElem e₁)
    (e₂ : R) (he₂ : IsIdempotentElem e₂) (he₁e₂ : e₁ * f e₂ = 0) (he₂e₁ : f e₂ * e₁ = 0) :
    ∃ e' : R, IsIdempotentElem e' ∧ f e' = e₁ ∧ e' * e₂ = 0 ∧ e₂ * e' = 0 
goal: ∃ e', IsIdempotentElem e' ∧ f e' = e₁ ∧ e' * e₂ = 0 ∧ e₂ * e' = 0

full_name: exists_isIdempotentElem_eq_of_ker_isNilpotent
code: /-- Idempotents lift along nil ideals. -/
theorem exists_isIdempotentElem_eq_of_ker_isNilpotent (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    (e : S) (he : e ∈ f.range) (he' : IsIdempotentElem e) :
    ∃ e' : R, IsIdempotentElem e' ∧ f e' = e 
goal: ∃ e', IsIdempotentElem e' ∧ f e' = e

full_name: orthogonalIdempotents_iff
code: /-- A family `{ eᵢ }` of idempotent elements is orthogonal if `eᵢ * eⱼ = 0` for all `i ≠ j`. -/
@[mk_iff]
structure OrthogonalIdempotents : Prop where
  idem : ∀ i, IsIdempotentElem (e i)
  ortho : ∀ i j, i ≠ j → e i * e j = 0
goal: OrthogonalIdempotents e ↔ (∀ (i : I), IsIdempotentElem (e i)) ∧ ∀ (i j : I), i ≠ j → e i * e j = 0

full_name: OrthogonalIdempotents.idem
code: /-- A family `{ eᵢ }` of idempotent elements is orthogonal if `eᵢ * eⱼ = 0` for all `i ≠ j`. -/
@[mk_iff]
structure OrthogonalIdempotents : Prop where
  idem : ∀ i, IsIdempotentElem (e i)
  ortho : ∀ i j, i ≠ j → e i * e j = 0
goal: IsIdempotentElem (e i)

full_name: OrthogonalIdempotents.ortho
code: /-- A family `{ eᵢ }` of idempotent elements is orthogonal if `eᵢ * eⱼ = 0` for all `i ≠ j`. -/
@[mk_iff]
structure OrthogonalIdempotents : Prop where
  idem : ∀ i, IsIdempotentElem (e i)
  ortho : ∀ i j, i ≠ j → e i * e j = 0
goal: i ≠ j → e i * e j = 0

full_name: OrthogonalIdempotents
code: /-- A family `{ eᵢ }` of idempotent elements is orthogonal if `eᵢ * eⱼ = 0` for all `i ≠ j`. -/
@[mk_iff]
structure OrthogonalIdempotents : Prop where
  idem : ∀ i, IsIdempotentElem (e i)
  ortho : ∀ i j, i ≠ j → e i * e j = 0
goal: Prop

full_name: OrthogonalIdempotents.mul_eq
code: lemma OrthogonalIdempotents.mul_eq [DecidableEq I] (he : OrthogonalIdempotents e) (i j) :
    e i * e j = if i = j then e i else 0 
goal: e i * e j = if i = j then e i else 0

full_name: OrthogonalIdempotents.iff_mul_eq
code: lemma OrthogonalIdempotents.iff_mul_eq [DecidableEq I] :
    OrthogonalIdempotents e ↔ ∀ i j, e i * e j = if i = j then e i else 0 
goal: OrthogonalIdempotents e ↔ ∀ (i j : I), e i * e j = if i = j then e i else 0

full_name: OrthogonalIdempotents.isIdempotentElem_sum
code: lemma OrthogonalIdempotents.isIdempotentElem_sum [Fintype I] : IsIdempotentElem (∑ i, e i) 
goal: IsIdempotentElem (∑ i : I, e i)

full_name: OrthogonalIdempotents.map
code: lemma OrthogonalIdempotents.map :
    OrthogonalIdempotents (f ∘ e) 
goal: OrthogonalIdempotents (⇑f ∘ e)

full_name: OrthogonalIdempotents.map_injective_iff
code: lemma OrthogonalIdempotents.map_injective_iff (hf : Function.Injective f) :
    OrthogonalIdempotents (f ∘ e) ↔ OrthogonalIdempotents e 
goal: OrthogonalIdempotents (⇑f ∘ e) ↔ OrthogonalIdempotents e

full_name: OrthogonalIdempotents.embedding
code: lemma OrthogonalIdempotents.embedding {J} (i : J ↪ I) :
    OrthogonalIdempotents (e ∘ i) 
goal: OrthogonalIdempotents (e ∘ ⇑i)

full_name: OrthogonalIdempotents.equiv
code: lemma OrthogonalIdempotents.equiv {J} (i : J ≃ I) :
    OrthogonalIdempotents (e ∘ i) ↔ OrthogonalIdempotents e 
goal: OrthogonalIdempotents (e ∘ ⇑i) ↔ OrthogonalIdempotents e

full_name: OrthogonalIdempotents.unique
code: lemma OrthogonalIdempotents.unique [Unique I] :
    OrthogonalIdempotents e ↔ IsIdempotentElem (e default) 
goal: OrthogonalIdempotents e ↔ IsIdempotentElem (e default)

full_name: OrthogonalIdempotents.option
code: lemma OrthogonalIdempotents.option [Fintype I] (x)
    (hx : IsIdempotentElem x) (hx₁ : x * ∑ i, e i = 0) (hx₂ : (∑ i, e i) * x = 0) :
    OrthogonalIdempotents (Option.elim · x e) 
goal: OrthogonalIdempotents fun x_1 => x_1.elim x e

full_name: OrthogonalIdempotents.lift_of_isNilpotent_ker_aux
code: lemma OrthogonalIdempotents.lift_of_isNilpotent_ker_aux
    (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    {n} {e : Fin n → S} (he : OrthogonalIdempotents e) (he' : ∀ i, e i ∈ f.range) :
    ∃ e' : Fin n → R, OrthogonalIdempotents e' ∧ f ∘ e' = e 
goal: ∃ e', OrthogonalIdempotents e' ∧ ⇑f ∘ e' = e

full_name: OrthogonalIdempotents.lift_of_isNilpotent_ker
code: /-- A family of orthogonal idempotents lift along nil ideals. -/
lemma OrthogonalIdempotents.lift_of_isNilpotent_ker [Finite I]
    (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    {e : I → S} (he : OrthogonalIdempotents e) (he' : ∀ i, e i ∈ f.range) :
    ∃ e' : I → R, OrthogonalIdempotents e' ∧ f ∘ e' = e 
goal: ∃ e', OrthogonalIdempotents e' ∧ ⇑f ∘ e' = e

full_name: completeOrthogonalIdempotents_iff
code: /--
A family `{ eᵢ }` of idempotent elements is complete orthogonal if
1. (orthogonal) `eᵢ * eⱼ = 0` for all `i ≠ j`.
2. (complete) `∑ eᵢ = 1`
-/
@[mk_iff]
structure CompleteOrthogonalIdempotents (e : I → R) extends OrthogonalIdempotents e : Prop where
  complete : ∑ i, e i = 1
goal: CompleteOrthogonalIdempotents e ↔ OrthogonalIdempotents e ∧ ∑ i : I, e i = 1

full_name: CompleteOrthogonalIdempotents.complete
code: /--
A family `{ eᵢ }` of idempotent elements is complete orthogonal if
1. (orthogonal) `eᵢ * eⱼ = 0` for all `i ≠ j`.
2. (complete) `∑ eᵢ = 1`
-/
@[mk_iff]
structure CompleteOrthogonalIdempotents (e : I → R) extends OrthogonalIdempotents e : Prop where
  complete : ∑ i, e i = 1
goal: ∑ i : I, e i = 1

full_name: CompleteOrthogonalIdempotents
code: /--
A family `{ eᵢ }` of idempotent elements is complete orthogonal if
1. (orthogonal) `eᵢ * eⱼ = 0` for all `i ≠ j`.
2. (complete) `∑ eᵢ = 1`
-/
@[mk_iff]
structure CompleteOrthogonalIdempotents (e : I → R) extends OrthogonalIdempotents e : Prop where
  complete : ∑ i, e i = 1
goal: Prop

full_name: CompleteOrthogonalIdempotents.unique_iff
code: lemma CompleteOrthogonalIdempotents.unique_iff [Unique I] :
    CompleteOrthogonalIdempotents e ↔ e default = 1 
goal: CompleteOrthogonalIdempotents e ↔ e default = 1

full_name: CompleteOrthogonalIdempotents.pair_iff
code: lemma CompleteOrthogonalIdempotents.pair_iff {x y : R} :
    CompleteOrthogonalIdempotents ![x, y] ↔ IsIdempotentElem x ∧ y = 1 - x 
goal: CompleteOrthogonalIdempotents ![x, y] ↔ IsIdempotentElem x ∧ y = 1 - x

full_name: CompleteOrthogonalIdempotents.of_isIdempotentElem
code: lemma CompleteOrthogonalIdempotents.of_isIdempotentElem {e : R} (he : IsIdempotentElem e) :
    CompleteOrthogonalIdempotents ![e, 1 - e] 
goal: CompleteOrthogonalIdempotents ![e, 1 - e]

full_name: CompleteOrthogonalIdempotents.single
code: lemma CompleteOrthogonalIdempotents.single {I : Type*} [Fintype I] [DecidableEq I]
    (R : I → Type*) [∀ i, Ring (R i)] :
    CompleteOrthogonalIdempotents (Pi.single (f := R) · 1) 
goal: CompleteOrthogonalIdempotents fun x => Pi.single x 1

full_name: CompleteOrthogonalIdempotents.map
code: lemma CompleteOrthogonalIdempotents.map :
    CompleteOrthogonalIdempotents (f ∘ e) 
goal: CompleteOrthogonalIdempotents (⇑f ∘ e)

full_name: CompleteOrthogonalIdempotents.map_injective_iff
code: lemma CompleteOrthogonalIdempotents.map_injective_iff (hf : Function.Injective f) :
    CompleteOrthogonalIdempotents (f ∘ e) ↔ CompleteOrthogonalIdempotents e 
goal: CompleteOrthogonalIdempotents (⇑f ∘ e) ↔ CompleteOrthogonalIdempotents e

full_name: CompleteOrthogonalIdempotents.equiv
code: lemma CompleteOrthogonalIdempotents.equiv {J} [Fintype J] (i : J ≃ I) :
    CompleteOrthogonalIdempotents (e ∘ i) ↔ CompleteOrthogonalIdempotents e 
goal: CompleteOrthogonalIdempotents (e ∘ ⇑i) ↔ CompleteOrthogonalIdempotents e

full_name: CompleteOrthogonalIdempotents.option
code: lemma CompleteOrthogonalIdempotents.option (he : OrthogonalIdempotents e) :
    CompleteOrthogonalIdempotents (Option.elim · (1 - ∑ i, e i) e) 
goal: CompleteOrthogonalIdempotents fun x => x.elim (1 - ∑ i : I, e i) e

full_name: CompleteOrthogonalIdempotents.of_subsingleton
code: @[nontriviality]
lemma CompleteOrthogonalIdempotents.of_subsingleton [Subsingleton R] :
    CompleteOrthogonalIdempotents e 
goal: CompleteOrthogonalIdempotents e

full_name: CompleteOrthogonalIdempotents.lift_of_isNilpotent_ker_aux
code: lemma CompleteOrthogonalIdempotents.lift_of_isNilpotent_ker_aux
    (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    {n} {e : Fin n → S} (he : CompleteOrthogonalIdempotents e) (he' : ∀ i, e i ∈ f.range) :
    ∃ e' : Fin n → R, CompleteOrthogonalIdempotents e' ∧ f ∘ e' = e 
goal: ∃ e', CompleteOrthogonalIdempotents e' ∧ ⇑f ∘ e' = e

full_name: CompleteOrthogonalIdempotents.lift_of_isNilpotent_ker
code: /-- A system of complete orthogonal idempotents lift along nil ideals. -/
lemma CompleteOrthogonalIdempotents.lift_of_isNilpotent_ker
    (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    {e : I → S} (he : CompleteOrthogonalIdempotents e) (he' : ∀ i, e i ∈ f.range) :
    ∃ e' : I → R, CompleteOrthogonalIdempotents e' ∧ f ∘ e' = e 
goal: ∃ e', CompleteOrthogonalIdempotents e' ∧ ⇑f ∘ e' = e

full_name: eq_of_isNilpotent_sub_of_isIdempotentElem_of_commute
code: theorem eq_of_isNilpotent_sub_of_isIdempotentElem_of_commute {e₁ e₂ : R}
    (he₁ : IsIdempotentElem e₁) (he₂ : IsIdempotentElem e₂) (H : IsNilpotent (e₁ - e₂))
    (H' : Commute e₁ e₂) :
    e₁ = e₂ 
goal: e₁ = e₂

full_name: CompleteOrthogonalIdempotents.of_ker_isNilpotent_of_isMulCentral
code: theorem CompleteOrthogonalIdempotents.of_ker_isNilpotent_of_isMulCentral
    (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    (he : ∀ i, IsIdempotentElem (e i))
    (he' : ∀ i, IsMulCentral (e i))
    (he'' : CompleteOrthogonalIdempotents (f ∘ e)) :
    CompleteOrthogonalIdempotents e 
goal: CompleteOrthogonalIdempotents e

full_name: eq_of_isNilpotent_sub_of_isIdempotentElem
code: theorem eq_of_isNilpotent_sub_of_isIdempotentElem {e₁ e₂ : R}
    (he₁ : IsIdempotentElem e₁) (he₂ : IsIdempotentElem e₂) (H : IsNilpotent (e₁ - e₂)) :
    e₁ = e₂ 
goal: e₁ = e₂

full_name: existsUnique_isIdempotentElem_eq_of_ker_isNilpotent
code: theorem existsUnique_isIdempotentElem_eq_of_ker_isNilpotent (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    (e : S) (he : e ∈ f.range) (he' : IsIdempotentElem e) :
    ∃! e' : R, IsIdempotentElem e' ∧ f e' = e 
goal: ∃! e', IsIdempotentElem e' ∧ f e' = e

full_name: OrthogonalIdempotents.surjective_pi
code: /-- A family of orthogonal idempotents induces an surjection `R ≃+* ∏ R ⧸ ⟨1 - eᵢ⟩` -/
lemma OrthogonalIdempotents.surjective_pi {I : Type*} [Finite I] {e : I → R}
    (he : OrthogonalIdempotents e) :
    Function.Surjective (Pi.ringHom fun i ↦ Ideal.Quotient.mk (Ideal.span {1 - e i})) 
goal: Function.Surjective ⇑(Pi.ringHom fun i => Ideal.Quotient.mk (Ideal.span {1 - e i}))

full_name: CompleteOrthogonalIdempotents.of_ker_isNilpotent
code: theorem CompleteOrthogonalIdempotents.of_ker_isNilpotent (h : ∀ x ∈ RingHom.ker f, IsNilpotent x)
    (he : ∀ i, IsIdempotentElem (e i))
    (he' : CompleteOrthogonalIdempotents (f ∘ e)) :
    CompleteOrthogonalIdempotents e 
goal: CompleteOrthogonalIdempotents e

full_name: OrthogonalIdempotents.prod_one_sub
code: lemma OrthogonalIdempotents.prod_one_sub (he : OrthogonalIdempotents e) :
    ∏ i, (1 - e i) = 1 - ∑ i, e i 
goal: ∏ i : I, (1 - e i) = 1 - ∑ i : I, e i

full_name: CompleteOrthogonalIdempotents.prod_one_sub
code: lemma CompleteOrthogonalIdempotents.prod_one_sub (he : CompleteOrthogonalIdempotents e) :
    ∏ i, (1 - e i) = 0 
goal: ∏ i : I, (1 - e i) = 0

full_name: CompleteOrthogonalIdempotents.of_prod_one_sub
code: lemma CompleteOrthogonalIdempotents.of_prod_one_sub
    (he : OrthogonalIdempotents e) (he' : ∏ i, (1 - e i) = 0) :
    CompleteOrthogonalIdempotents e 
goal: CompleteOrthogonalIdempotents e

full_name: CompleteOrthogonalIdempotents.bijective_pi
code: /-- A family of complete orthogonal idempotents induces an isomorphism `R ≃+* ∏ R ⧸ ⟨1 - eᵢ⟩` -/
lemma CompleteOrthogonalIdempotents.bijective_pi (he : CompleteOrthogonalIdempotents e) :
    Function.Bijective (Pi.ringHom fun i ↦ Ideal.Quotient.mk (Ideal.span {1 - e i})) 
goal: Function.Bijective ⇑(Pi.ringHom fun i => Ideal.Quotient.mk (Ideal.span {1 - e i}))

full_name: CompleteOrthogonalIdempotents.bijective_pi'
code: lemma CompleteOrthogonalIdempotents.bijective_pi' (he : CompleteOrthogonalIdempotents (1 - e ·)) :
    Function.Bijective (Pi.ringHom fun i ↦ Ideal.Quotient.mk (Ideal.span {e i})) 
goal: Function.Bijective ⇑(Pi.ringHom fun i => Ideal.Quotient.mk (Ideal.span {e i}))

full_name: bijective_pi_of_isIdempotentElem
code: lemma bijective_pi_of_isIdempotentElem (e : I → R)
    (he : ∀ i, IsIdempotentElem (e i))
    (he₁ : ∀ i j, i ≠ j → (1 - e i) * (1 - e j) = 0) (he₂ : ∏ i, e i = 0) :
    Function.Bijective (Pi.ringHom fun i ↦ Ideal.Quotient.mk (Ideal.span {e i})) 
goal: Function.Bijective ⇑(Pi.ringHom fun i => Ideal.Quotient.mk (Ideal.span {e i}))