[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
ι : Type u_1
M : Type u_2
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : AddCommMonoid M
inst✝³ : Algebra R A
inst✝² : Module A M
inst✝¹ : Module R M
inst✝ : IsScalarTower R A M
b : Basis ι R M
h : Function.Bijective ↑(algebraMap R A)
c : R
x : M
⊢ ↑(RingEquiv.ofBijective (algebraMap R A) h) c • x = c • x
[PROOFSTEP]
simp
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : LinearIndependent R b
hc : LinearIndependent S c
⊢ LinearIndependent R fun p => b p.fst • c p.snd
[PROOFSTEP]
rw [linearIndependent_iff'] at hb hc
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
⊢ LinearIndependent R fun p => b p.fst • c p.snd
[PROOFSTEP]
rw [linearIndependent_iff'']
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
⊢ ∀ (s : Finset (ι × ι')) (g : ι × ι' → R),
    (∀ (i : ι × ι'), ¬i ∈ s → g i = 0) → ∑ i in s, g i • b i.fst • c i.snd = 0 → ∀ (i : ι × ι'), g i = 0
[PROOFSTEP]
rintro s g hg hsg ⟨i, k⟩
[GOAL]
case mk
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
⊢ g (i, k) = 0
[PROOFSTEP]
by_cases hik : (i, k) ∈ s
[GOAL]
case pos
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : (i, k) ∈ s
⊢ g (i, k) = 0
[PROOFSTEP]
have h1 : ∑ i in s.image Prod.fst ×ˢ s.image Prod.snd, g i • b i.1 • c i.2 = 0 :=
  by
  rw [← hsg]
  exact
    (Finset.sum_subset Finset.subset_product fun p _ hp => show g p • b p.1 • c p.2 = 0 by rw [hg p hp, zero_smul]).symm
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : (i, k) ∈ s
⊢ ∑ i in Finset.image Prod.fst s ×ˢ Finset.image Prod.snd s, g i • b i.fst • c i.snd = 0
[PROOFSTEP]
rw [← hsg]
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : (i, k) ∈ s
⊢ ∑ i in Finset.image Prod.fst s ×ˢ Finset.image Prod.snd s, g i • b i.fst • c i.snd = ∑ i in s, g i • b i.fst • c i.snd
[PROOFSTEP]
exact
  (Finset.sum_subset Finset.subset_product fun p _ hp => show g p • b p.1 • c p.2 = 0 by rw [hg p hp, zero_smul]).symm
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : (i, k) ∈ s
p : ι × ι'
x✝ : p ∈ Finset.image Prod.fst s ×ˢ Finset.image Prod.snd s
hp : ¬p ∈ s
⊢ g p • b p.fst • c p.snd = 0
[PROOFSTEP]
rw [hg p hp, zero_smul]
[GOAL]
case pos
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : (i, k) ∈ s
h1 : ∑ i in Finset.image Prod.fst s ×ˢ Finset.image Prod.snd s, g i • b i.fst • c i.snd = 0
⊢ g (i, k) = 0
[PROOFSTEP]
rw [Finset.sum_product_right] at h1
[GOAL]
case pos
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : (i, k) ∈ s
h1 : ∑ y in Finset.image Prod.snd s, ∑ x in Finset.image Prod.fst s, g (x, y) • b (x, y).fst • c (x, y).snd = 0
⊢ g (i, k) = 0
[PROOFSTEP]
simp_rw [← smul_assoc, ← Finset.sum_smul] at h1
[GOAL]
case pos
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : (i, k) ∈ s
h1 : ∑ x in Finset.image Prod.snd s, (∑ i in Finset.image Prod.fst s, g (i, x) • b i) • c x = 0
⊢ g (i, k) = 0
[PROOFSTEP]
exact hb _ _ (hc _ _ h1 k (Finset.mem_image_of_mem _ hik)) i (Finset.mem_image_of_mem _ hik)
[GOAL]
case neg
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
b : ι → S
ι' : Type w₁
c : ι' → A
hb : ∀ (s : Finset ι) (g : ι → R), ∑ i in s, g i • b i = 0 → ∀ (i : ι), i ∈ s → g i = 0
hc : ∀ (s : Finset ι') (g : ι' → S), ∑ i in s, g i • c i = 0 → ∀ (i : ι'), i ∈ s → g i = 0
s : Finset (ι × ι')
g : ι × ι' → R
hg : ∀ (i : ι × ι'), ¬i ∈ s → g i = 0
hsg : ∑ i in s, g i • b i.fst • c i.snd = 0
i : ι
k : ι'
hik : ¬(i, k) ∈ s
⊢ g (i, k) = 0
[PROOFSTEP]
exact hg _ hik
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
x : A
ij : ι × ι'
⊢ ↑(↑(smul b c).repr x) ij = ↑(↑b.repr (↑(↑c.repr x) ij.snd)) ij.fst
[PROOFSTEP]
simp [Basis.smul]
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
ij : ι × ι'
⊢ ↑(smul b c) ij = ↑b ij.fst • ↑c ij.snd
[PROOFSTEP]
obtain ⟨i, j⟩ := ij
[GOAL]
case mk
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
i : ι
j : ι'
⊢ ↑(smul b c) (i, j) = ↑b (i, j).fst • ↑c (i, j).snd
[PROOFSTEP]
rw [Basis.apply_eq_iff]
[GOAL]
case mk
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
i : ι
j : ι'
⊢ ↑(smul b c).repr (↑b (i, j).fst • ↑c (i, j).snd) = single (i, j) 1
[PROOFSTEP]
ext ⟨i', j'⟩
[GOAL]
case mk.h.mk
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
i : ι
j : ι'
i' : ι
j' : ι'
⊢ ↑(↑(smul b c).repr (↑b (i, j).fst • ↑c (i, j).snd)) (i', j') = ↑(single (i, j) 1) (i', j')
[PROOFSTEP]
rw [Basis.smul_repr, LinearEquiv.map_smul, Basis.repr_self, Finsupp.smul_apply, Finsupp.single_apply]
[GOAL]
case mk.h.mk
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
i : ι
j : ι'
i' : ι
j' : ι'
⊢ ↑(↑b.repr (↑b (i, j).fst • if (i, j).snd = (i', j').snd then 1 else 0)) (i', j').fst = ↑(single (i, j) 1) (i', j')
[PROOFSTEP]
dsimp only
[GOAL]
case mk.h.mk
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
i : ι
j : ι'
i' : ι
j' : ι'
⊢ ↑(↑b.repr (↑b i • if j = j' then 1 else 0)) i' = ↑(single (i, j) 1) (i', j')
[PROOFSTEP]
split_ifs with hi
[GOAL]
case pos
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
i : ι
j : ι'
i' : ι
j' : ι'
hi : j = j'
⊢ ↑(↑b.repr (↑b i • 1)) i' = ↑(single (i, j) 1) (i', j')
[PROOFSTEP]
simp [hi, Finsupp.single_apply]
[GOAL]
case neg
R : Type u
S : Type v
A : Type w
B : Type u₁
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid A
inst✝³ : Algebra R S
inst✝² : Module S A
inst✝¹ : Module R A
inst✝ : IsScalarTower R S A
ι : Type v₁
ι' : Type w₁
b : Basis ι R S
c : Basis ι' S A
i : ι
j : ι'
i' : ι
j' : ι'
hi : ¬j = j'
⊢ ↑(↑b.repr (↑b i • 0)) i' = ↑(single (i, j) 1) (i', j')
[PROOFSTEP]
simp [hi]
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
src✝ : Algebra B D := RingHom.toAlgebra ↑(restrictDomain B f)
⊢ OneHom.toFun (↑↑↑f) 1 = 1
[PROOFSTEP]
simp only [toRingHom_eq_coe, RingHom.toMonoidHom_eq_coe, OneHom.toFun_eq_coe, map_one]
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
src✝ : Algebra B D := RingHom.toAlgebra ↑(restrictDomain B f)
⊢ ∀ (x y : C),
    OneHom.toFun { toFun := f.toFun, map_one' := (_ : ↑↑↑↑f 1 = 1) } (x * y) =
      OneHom.toFun { toFun := f.toFun, map_one' := (_ : ↑↑↑↑f 1 = 1) } x *
        OneHom.toFun { toFun := f.toFun, map_one' := (_ : ↑↑↑↑f 1 = 1) } y
[PROOFSTEP]
simp only [toRingHom_eq_coe, RingHom.toMonoidHom_eq_coe, OneHom.toFun_eq_coe, MonoidHom.toOneHom_coe, map_mul,
  MonoidHom.coe_coe, RingHom.coe_coe, forall_const]
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
src✝ : Algebra B D := RingHom.toAlgebra ↑(restrictDomain B f)
⊢ OneHom.toFun
      (↑{ toOneHom := { toFun := f.toFun, map_one' := (_ : ↑↑↑↑f 1 = 1) },
          map_mul' := (_ : ∀ (a a_1 : C), ↑↑↑f (a * a_1) = ↑f a * ↑f a_1) })
      0 =
    0
[PROOFSTEP]
simp only [toRingHom_eq_coe, RingHom.toMonoidHom_eq_coe, OneHom.toFun_eq_coe, MonoidHom.toOneHom_coe, MonoidHom.coe_coe,
  map_zero]
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
src✝ : Algebra B D := RingHom.toAlgebra ↑(restrictDomain B f)
⊢ ∀ (x y : C),
    OneHom.toFun
        (↑{ toOneHom := { toFun := f.toFun, map_one' := (_ : ↑↑↑↑f 1 = 1) },
            map_mul' := (_ : ∀ (a a_1 : C), ↑↑↑f (a * a_1) = ↑f a * ↑f a_1) })
        (x + y) =
      OneHom.toFun
          (↑{ toOneHom := { toFun := f.toFun, map_one' := (_ : ↑↑↑↑f 1 = 1) },
              map_mul' := (_ : ∀ (a a_1 : C), ↑↑↑f (a * a_1) = ↑f a * ↑f a_1) })
          x +
        OneHom.toFun
          (↑{ toOneHom := { toFun := f.toFun, map_one' := (_ : ↑↑↑↑f 1 = 1) },
              map_mul' := (_ : ∀ (a a_1 : C), ↑↑↑f (a * a_1) = ↑f a * ↑f a_1) })
          y
[PROOFSTEP]
simp only [toRingHom_eq_coe, RingHom.toMonoidHom_eq_coe, OneHom.toFun_eq_coe, MonoidHom.toOneHom_coe, MonoidHom.coe_coe,
  map_add, RingHom.coe_coe, forall_const]
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f✝ : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
f : C →ₐ[A] D
⊢ (fun fg =>
        let x := RingHom.toAlgebra ↑fg.fst;
        AlgHom.restrictScalars A fg.snd)
      ((fun f => { fst := AlgHom.restrictDomain B f, snd := AlgHom.extendScalars B f }) f) =
    f
[PROOFSTEP]
dsimp only
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f✝ : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
f : C →ₐ[A] D
⊢ AlgHom.restrictScalars A (AlgHom.extendScalars B f) = f
[PROOFSTEP]
ext
[GOAL]
case H
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f✝ : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
f : C →ₐ[A] D
x✝ : C
⊢ ↑(AlgHom.restrictScalars A (AlgHom.extendScalars B f)) x✝ = ↑f x✝
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
⊢ Function.RightInverse
    (fun fg =>
      let x := RingHom.toAlgebra ↑fg.fst;
      AlgHom.restrictScalars A fg.snd)
    fun f => { fst := AlgHom.restrictDomain B f, snd := AlgHom.extendScalars B f }
[PROOFSTEP]
rintro ⟨⟨⟨⟨⟨f, _⟩, _⟩, _⟩, _⟩, ⟨⟨⟨⟨g, _⟩, _⟩, _⟩, hg⟩⟩
[GOAL]
case mk.mk.mk.mk.mk.mk.mk.mk.mk
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f✝ : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
f : B → D
map_one'✝¹ : f 1 = 1
map_mul'✝¹ :
  ∀ (x y : B),
    OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } (x * y) =
      OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } x * OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } y
map_zero'✝¹ : OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) 0 = 0
map_add'✝¹ :
  ∀ (x y : B),
    OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) (x + y) =
      OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) x +
        OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) y
commutes'✝ :
  ∀ (r : A),
    OneHom.toFun
        (↑↑{ toMonoidHom := { toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
              map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ })
        (↑(algebraMap A B) r) =
      ↑(algebraMap A D) r
g : C → D
map_one'✝ : g 1 = 1
map_mul'✝ :
  ∀ (x y : C),
    OneHom.toFun { toFun := g, map_one' := map_one'✝ } (x * y) =
      OneHom.toFun { toFun := g, map_one' := map_one'✝ } x * OneHom.toFun { toFun := g, map_one' := map_one'✝ } y
map_zero'✝ : OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) 0 = 0
map_add'✝ :
  ∀ (x y : C),
    OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) (x + y) =
      OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) x +
        OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) y
hg :
  ∀ (r : B),
    OneHom.toFun
        (↑↑{ toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ },
              map_zero' := map_zero'✝, map_add' := map_add'✝ })
        (↑(algebraMap B C) r) =
      ↑(algebraMap B D) r
⊢ (fun f => { fst := AlgHom.restrictDomain B f, snd := AlgHom.extendScalars B f })
      ((fun fg =>
          let x := RingHom.toAlgebra ↑fg.fst;
          AlgHom.restrictScalars A fg.snd)
        {
          fst :=
            {
              toRingHom :=
                { toMonoidHom := { toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
                  map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ },
              commutes' := commutes'✝ },
          snd :=
            {
              toRingHom :=
                { toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ },
                  map_zero' := map_zero'✝, map_add' := map_add'✝ },
              commutes' := hg } }) =
    {
      fst :=
        {
          toRingHom :=
            { toMonoidHom := { toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
              map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ },
          commutes' := commutes'✝ },
      snd :=
        {
          toRingHom :=
            { toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ },
              map_zero' := map_zero'✝, map_add' := map_add'✝ },
          commutes' := hg } }
[PROOFSTEP]
obtain rfl : f = fun x => g (algebraMap B C x) := by
  ext x
  exact (hg x).symm
[GOAL]
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f✝ : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
f : B → D
map_one'✝¹ : f 1 = 1
map_mul'✝¹ :
  ∀ (x y : B),
    OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } (x * y) =
      OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } x * OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } y
map_zero'✝¹ : OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) 0 = 0
map_add'✝¹ :
  ∀ (x y : B),
    OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) (x + y) =
      OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) x +
        OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) y
commutes'✝ :
  ∀ (r : A),
    OneHom.toFun
        (↑↑{ toMonoidHom := { toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
              map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ })
        (↑(algebraMap A B) r) =
      ↑(algebraMap A D) r
g : C → D
map_one'✝ : g 1 = 1
map_mul'✝ :
  ∀ (x y : C),
    OneHom.toFun { toFun := g, map_one' := map_one'✝ } (x * y) =
      OneHom.toFun { toFun := g, map_one' := map_one'✝ } x * OneHom.toFun { toFun := g, map_one' := map_one'✝ } y
map_zero'✝ : OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) 0 = 0
map_add'✝ :
  ∀ (x y : C),
    OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) (x + y) =
      OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) x +
        OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) y
hg :
  ∀ (r : B),
    OneHom.toFun
        (↑↑{ toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ },
              map_zero' := map_zero'✝, map_add' := map_add'✝ })
        (↑(algebraMap B C) r) =
      ↑(algebraMap B D) r
⊢ f = fun x => g (↑(algebraMap B C) x)
[PROOFSTEP]
ext x
[GOAL]
case h
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f✝ : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
f : B → D
map_one'✝¹ : f 1 = 1
map_mul'✝¹ :
  ∀ (x y : B),
    OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } (x * y) =
      OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } x * OneHom.toFun { toFun := f, map_one' := map_one'✝¹ } y
map_zero'✝¹ : OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) 0 = 0
map_add'✝¹ :
  ∀ (x y : B),
    OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) (x + y) =
      OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) x +
        OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) y
commutes'✝ :
  ∀ (r : A),
    OneHom.toFun
        (↑↑{ toMonoidHom := { toOneHom := { toFun := f, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
              map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ })
        (↑(algebraMap A B) r) =
      ↑(algebraMap A D) r
g : C → D
map_one'✝ : g 1 = 1
map_mul'✝ :
  ∀ (x y : C),
    OneHom.toFun { toFun := g, map_one' := map_one'✝ } (x * y) =
      OneHom.toFun { toFun := g, map_one' := map_one'✝ } x * OneHom.toFun { toFun := g, map_one' := map_one'✝ } y
map_zero'✝ : OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) 0 = 0
map_add'✝ :
  ∀ (x y : C),
    OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) (x + y) =
      OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) x +
        OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) y
hg :
  ∀ (r : B),
    OneHom.toFun
        (↑↑{ toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝ }, map_mul' := map_mul'✝ },
              map_zero' := map_zero'✝, map_add' := map_add'✝ })
        (↑(algebraMap B C) r) =
      ↑(algebraMap B D) r
x : B
⊢ f x = g (↑(algebraMap B C) x)
[PROOFSTEP]
exact (hg x).symm
[GOAL]
case mk.mk.mk.mk.mk.mk.mk.mk.mk
R : Type u
S : Type v
A : Type w
B : Type u₁
C : Type u_1
D : Type u_2
inst✝⁸ : CommSemiring A
inst✝⁷ : CommSemiring C
inst✝⁶ : CommSemiring D
inst✝⁵ : Algebra A C
inst✝⁴ : Algebra A D
f : C →ₐ[A] D
inst✝³ : CommSemiring B
inst✝² : Algebra A B
inst✝¹ : Algebra B C
inst✝ : IsScalarTower A B C
g : C → D
map_one'✝¹ : g 1 = 1
map_mul'✝¹ :
  ∀ (x y : C),
    OneHom.toFun { toFun := g, map_one' := map_one'✝¹ } (x * y) =
      OneHom.toFun { toFun := g, map_one' := map_one'✝¹ } x * OneHom.toFun { toFun := g, map_one' := map_one'✝¹ } y
map_zero'✝¹ : OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) 0 = 0
map_add'✝¹ :
  ∀ (x y : C),
    OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) (x + y) =
      OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) x +
        OneHom.toFun (↑{ toOneHom := { toFun := g, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ }) y
map_one'✝ : (fun x => g (↑(algebraMap B C) x)) 1 = 1
map_mul'✝ :
  ∀ (x y : B),
    OneHom.toFun { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ } (x * y) =
      OneHom.toFun { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ } x *
        OneHom.toFun { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ } y
map_zero'✝ :
  OneHom.toFun
      (↑{ toOneHom := { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ }, map_mul' := map_mul'✝ }) 0 =
    0
map_add'✝ :
  ∀ (x y : B),
    OneHom.toFun
        (↑{ toOneHom := { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ }, map_mul' := map_mul'✝ })
        (x + y) =
      OneHom.toFun
          (↑{ toOneHom := { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ }, map_mul' := map_mul'✝ })
          x +
        OneHom.toFun
          (↑{ toOneHom := { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ }, map_mul' := map_mul'✝ })
          y
commutes'✝ :
  ∀ (r : A),
    OneHom.toFun
        (↑↑{
              toMonoidHom :=
                { toOneHom := { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ },
                  map_mul' := map_mul'✝ },
              map_zero' := map_zero'✝, map_add' := map_add'✝ })
        (↑(algebraMap A B) r) =
      ↑(algebraMap A D) r
hg :
  ∀ (r : B),
    OneHom.toFun
        (↑↑{ toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
              map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ })
        (↑(algebraMap B C) r) =
      ↑(algebraMap B D) r
⊢ (fun f => { fst := AlgHom.restrictDomain B f, snd := AlgHom.extendScalars B f })
      ((fun fg =>
          let x := RingHom.toAlgebra ↑fg.fst;
          AlgHom.restrictScalars A fg.snd)
        {
          fst :=
            {
              toRingHom :=
                {
                  toMonoidHom :=
                    { toOneHom := { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ },
                      map_mul' := map_mul'✝ },
                  map_zero' := map_zero'✝, map_add' := map_add'✝ },
              commutes' := commutes'✝ },
          snd :=
            {
              toRingHom :=
                { toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
                  map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ },
              commutes' := hg } }) =
    {
      fst :=
        {
          toRingHom :=
            {
              toMonoidHom :=
                { toOneHom := { toFun := fun x => g (↑(algebraMap B C) x), map_one' := map_one'✝ },
                  map_mul' := map_mul'✝ },
              map_zero' := map_zero'✝, map_add' := map_add'✝ },
          commutes' := commutes'✝ },
      snd :=
        {
          toRingHom :=
            { toMonoidHom := { toOneHom := { toFun := g, map_one' := map_one'✝¹ }, map_mul' := map_mul'✝¹ },
              map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ },
          commutes' := hg } }
[PROOFSTEP]
rfl


[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
g : G
⊢ zpowers g = closure {g}
[PROOFSTEP]
ext
[GOAL]
case h
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
g x✝ : G
⊢ x✝ ∈ zpowers g ↔ x✝ ∈ closure {g}
[PROOFSTEP]
exact mem_closure_singleton.symm
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
N : Type u_3
inst✝¹ : Group N
R : Type u_4
inst✝ : Ring R
r : R
k : ℤ
⊢ ↑k * r ∈ zmultiples r
[PROOFSTEP]
simpa only [← zsmul_eq_mul] using zsmul_mem_zmultiples r k
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
N : Type u_3
inst✝¹ : Group N
R : Type u_4
inst✝ : Ring R
r : R
k : ℤ
⊢ (fun x => x • 1) k = ↑k
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
inst✝³ : Group G
A✝ : Type u_2
inst✝² : AddGroup A✝
N : Type u_3
inst✝¹ : Group N
A : Type u_4
inst✝ : AddGroupWithOne A
⊢ AddMonoidHom.range (castAddHom A) = AddSubgroup.zmultiples 1
[PROOFSTEP]
ext a
[GOAL]
case h
G : Type u_1
inst✝³ : Group G
A✝ : Type u_2
inst✝² : AddGroup A✝
N : Type u_3
inst✝¹ : Group N
A : Type u_4
inst✝ : AddGroupWithOne A
a : A
⊢ a ∈ AddMonoidHom.range (castAddHom A) ↔ a ∈ AddSubgroup.zmultiples 1
[PROOFSTEP]
simp_rw [AddMonoidHom.mem_range, Int.coe_castAddHom, AddSubgroup.mem_zmultiples_iff, zsmul_one]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
f : G →* N
x : G
⊢ Subgroup.map f (Subgroup.zpowers x) = Subgroup.zpowers (↑f x)
[PROOFSTEP]
rw [Subgroup.zpowers_eq_closure, Subgroup.zpowers_eq_closure, f.map_closure, Set.image_singleton]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
a b k : ℤ
⊢ (fun x => x • a) k = b ↔ b = a * k
[PROOFSTEP]
rw [mul_comm, eq_comm, ← smul_eq_mul]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
⊢ ↑Additive.ofMul '' ↑(Subgroup.zpowers x) = ↑(AddSubgroup.zmultiples (↑Additive.ofMul x))
[PROOFSTEP]
ext y
[GOAL]
case h
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
⊢ y ∈ ↑Additive.ofMul '' ↑(Subgroup.zpowers x) ↔ y ∈ ↑(AddSubgroup.zmultiples (↑Additive.ofMul x))
[PROOFSTEP]
constructor
[GOAL]
case h.mp
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
⊢ y ∈ ↑Additive.ofMul '' ↑(Subgroup.zpowers x) → y ∈ ↑(AddSubgroup.zmultiples (↑Additive.ofMul x))
[PROOFSTEP]
rintro ⟨z, ⟨m, hm⟩, hz2⟩
[GOAL]
case h.mp.intro.intro.intro
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
z : G
hz2 : ↑Additive.ofMul z = y
m : ℤ
hm : (fun x x_1 => x ^ x_1) x m = z
⊢ y ∈ ↑(AddSubgroup.zmultiples (↑Additive.ofMul x))
[PROOFSTEP]
use m
[GOAL]
case h
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
z : G
hz2 : ↑Additive.ofMul z = y
m : ℤ
hm : (fun x x_1 => x ^ x_1) x m = z
⊢ (fun x_1 => x_1 • ↑Additive.ofMul x) m = y
[PROOFSTEP]
simp only at *
[GOAL]
case h
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
z : G
hz2 : ↑Additive.ofMul z = y
m : ℤ
hm : x ^ m = z
⊢ m • ↑Additive.ofMul x = y
[PROOFSTEP]
rwa [← ofMul_zpow, hm]
[GOAL]
case h.mpr
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
⊢ y ∈ ↑(AddSubgroup.zmultiples (↑Additive.ofMul x)) → y ∈ ↑Additive.ofMul '' ↑(Subgroup.zpowers x)
[PROOFSTEP]
rintro ⟨n, hn⟩
[GOAL]
case h.mpr.intro
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
n : ℤ
hn : (fun x_1 => x_1 • ↑Additive.ofMul x) n = y
⊢ y ∈ ↑Additive.ofMul '' ↑(Subgroup.zpowers x)
[PROOFSTEP]
refine' ⟨x ^ n, ⟨n, rfl⟩, _⟩
[GOAL]
case h.mpr.intro
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : G
y : Additive G
n : ℤ
hn : (fun x_1 => x_1 • ↑Additive.ofMul x) n = y
⊢ ↑Additive.ofMul (x ^ n) = y
[PROOFSTEP]
rwa [ofMul_zpow]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : A
⊢ ↑Multiplicative.ofAdd '' ↑(AddSubgroup.zmultiples x) = ↑(Subgroup.zpowers (↑Multiplicative.ofAdd x))
[PROOFSTEP]
symm
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : A
⊢ ↑(Subgroup.zpowers (↑Multiplicative.ofAdd x)) = ↑Multiplicative.ofAdd '' ↑(AddSubgroup.zmultiples x)
[PROOFSTEP]
rw [Equiv.eq_image_iff_symm_image_eq]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
x : A
⊢ ↑Multiplicative.ofAdd.symm '' ↑(Subgroup.zpowers (↑Multiplicative.ofAdd x)) = ↑(AddSubgroup.zmultiples x)
[PROOFSTEP]
exact ofMul_image_zpowers_eq_zmultiples_ofMul
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
s : Set G
g✝ g : G
x✝¹ x✝ : { x // x ∈ zpowers g }
val✝¹ : G
w✝¹ : ℤ
h₁ : (fun x x_1 => x ^ x_1) g w✝¹ = val✝¹
val✝ : G
w✝ : ℤ
h₂ : (fun x x_1 => x ^ x_1) g w✝ = val✝
⊢ { val := val✝¹, property := (_ : ∃ y, (fun x x_1 => x ^ x_1) g y = val✝¹) } *
      { val := val✝, property := (_ : ∃ y, (fun x x_1 => x ^ x_1) g y = val✝) } =
    { val := val✝, property := (_ : ∃ y, (fun x x_1 => x ^ x_1) g y = val✝) } *
      { val := val✝¹, property := (_ : ∃ y, (fun x x_1 => x ^ x_1) g y = val✝¹) }
[PROOFSTEP]
rw [Subtype.ext_iff, coe_mul, coe_mul, Subtype.coe_mk, Subtype.coe_mk, ← h₁, ← h₂, zpow_mul_comm]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
s : Set G
g✝ g : G
H : Subgroup G
⊢ zpowers g ≤ H ↔ g ∈ H
[PROOFSTEP]
rw [zpowers_eq_closure, closure_le, Set.singleton_subset_iff, SetLike.mem_coe]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
s : Set G
g✝ g : G
⊢ zpowers g = ⊥ ↔ g = 1
[PROOFSTEP]
rw [eq_bot_iff, zpowers_le, mem_bot]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
s : Set G
g : G
S : Set G
hS : closure S = ⊤
⊢ center G = ⨅ (g : G) (_ : g ∈ S), centralizer ↑(zpowers g)
[PROOFSTEP]
rw [← centralizer_univ, ← coe_top, ← hS, centralizer_closure]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
N : Type u_3
inst✝ : Group N
s : Set G
g : G
S : Set G
hS : closure S = ⊤
⊢ center G = ⨅ (g : ↑S), centralizer ↑(zpowers ↑g)
[PROOFSTEP]
rw [center_eq_iInf S hS, ← iInf_subtype'']


[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : M →ₛₗ[ρ₁₂] N →ₛₗ[σ₁₂] P
x : M
y : N
⊢ (Finsupp.sum (↑b₁.repr x) fun i xi =>
      Finsupp.sum (↑b₂.repr y) fun j yj => ↑ρ₁₂ xi • ↑σ₁₂ yj • ↑(↑B (↑b₁ i)) (↑b₂ j)) =
    ↑(↑B x) y
[PROOFSTEP]
conv_rhs => rw [← b₁.total_repr x, ← b₂.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : M →ₛₗ[ρ₁₂] N →ₛₗ[σ₁₂] P
x : M
y : N
| ↑(↑B x) y
[PROOFSTEP]
rw [← b₁.total_repr x, ← b₂.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : M →ₛₗ[ρ₁₂] N →ₛₗ[σ₁₂] P
x : M
y : N
| ↑(↑B x) y
[PROOFSTEP]
rw [← b₁.total_repr x, ← b₂.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : M →ₛₗ[ρ₁₂] N →ₛₗ[σ₁₂] P
x : M
y : N
| ↑(↑B x) y
[PROOFSTEP]
rw [← b₁.total_repr x, ← b₂.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : M →ₛₗ[ρ₁₂] N →ₛₗ[σ₁₂] P
x : M
y : N
⊢ (Finsupp.sum (↑b₁.repr x) fun i xi =>
      Finsupp.sum (↑b₂.repr y) fun j yj => ↑ρ₁₂ xi • ↑σ₁₂ yj • ↑(↑B (↑b₁ i)) (↑b₂ j)) =
    ↑(↑B (↑(Finsupp.total ι₁ M R ↑b₁) (↑b₁.repr x))) (↑(Finsupp.total ι₂ N S ↑b₂) (↑b₂.repr y))
[PROOFSTEP]
simp_rw [Finsupp.total_apply, Finsupp.sum, map_sum₂, map_sum, LinearMap.map_smulₛₗ₂, LinearMap.map_smulₛₗ]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : Mₗ →ₗ[R] Nₗ →ₗ[R] Pₗ
x : Mₗ
y : Nₗ
⊢ (Finsupp.sum (↑b₁'.repr x) fun i xi => Finsupp.sum (↑b₂'.repr y) fun j yj => xi • yj • ↑(↑B (↑b₁' i)) (↑b₂' j)) =
    ↑(↑B x) y
[PROOFSTEP]
conv_rhs => rw [← b₁'.total_repr x, ← b₂'.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : Mₗ →ₗ[R] Nₗ →ₗ[R] Pₗ
x : Mₗ
y : Nₗ
| ↑(↑B x) y
[PROOFSTEP]
rw [← b₁'.total_repr x, ← b₂'.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : Mₗ →ₗ[R] Nₗ →ₗ[R] Pₗ
x : Mₗ
y : Nₗ
| ↑(↑B x) y
[PROOFSTEP]
rw [← b₁'.total_repr x, ← b₂'.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : Mₗ →ₗ[R] Nₗ →ₗ[R] Pₗ
x : Mₗ
y : Nₗ
| ↑(↑B x) y
[PROOFSTEP]
rw [← b₁'.total_repr x, ← b₂'.total_repr y]
[GOAL]
ι₁ : Type u_1
ι₂ : Type u_2
R : Type u_3
R₂ : Type u_4
S : Type u_5
S₂ : Type u_6
M : Type u_7
N : Type u_8
P : Type u_9
Mₗ : Type u_10
Nₗ : Type u_11
Pₗ : Type u_12
inst✝¹⁷ : CommSemiring R
inst✝¹⁶ : CommSemiring S
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : CommSemiring S₂
inst✝¹³ : AddCommMonoid M
inst✝¹² : AddCommMonoid N
inst✝¹¹ : AddCommMonoid P
inst✝¹⁰ : AddCommMonoid Mₗ
inst✝⁹ : AddCommMonoid Nₗ
inst✝⁸ : AddCommMonoid Pₗ
inst✝⁷ : Module R M
inst✝⁶ : Module S N
inst✝⁵ : Module R₂ P
inst✝⁴ : Module S₂ P
inst✝³ : Module R Mₗ
inst✝² : Module R Nₗ
inst✝¹ : Module R Pₗ
inst✝ : SMulCommClass S₂ R₂ P
ρ₁₂ : R →+* R₂
σ₁₂ : S →+* S₂
b₁ : Basis ι₁ R M
b₂ : Basis ι₂ S N
b₁' : Basis ι₁ R Mₗ
b₂' : Basis ι₂ R Nₗ
B : Mₗ →ₗ[R] Nₗ →ₗ[R] Pₗ
x : Mₗ
y : Nₗ
⊢ (Finsupp.sum (↑b₁'.repr x) fun i xi => Finsupp.sum (↑b₂'.repr y) fun j yj => xi • yj • ↑(↑B (↑b₁' i)) (↑b₂' j)) =
    ↑(↑B (↑(Finsupp.total ι₁ Mₗ R ↑b₁') (↑b₁'.repr x))) (↑(Finsupp.total ι₂ Nₗ R ↑b₂') (↑b₂'.repr y))
[PROOFSTEP]
simp_rw [Finsupp.total_apply, Finsupp.sum, map_sum₂, map_sum, LinearMap.map_smul₂, LinearMap.map_smul]


[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
⊢ IsSemisimple R L ↔ ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
[PROOFSTEP]
rw [isSemisimple_iff_no_solvable_ideals]
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
⊢ (∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → I = ⊥) ↔
    ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
⊢ (∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → I = ⊥) →
    ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
[PROOFSTEP]
intro h₁ I h₂
[GOAL]
case mpr
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
⊢ (∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥) →
    ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → I = ⊥
[PROOFSTEP]
intro h₁ I h₂
[GOAL]
case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h₁ : ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → I = ⊥
I : LieIdeal R L
h₂ : IsLieAbelian { x // x ∈ ↑I }
⊢ I = ⊥
[PROOFSTEP]
haveI : IsLieAbelian I := h₂
[GOAL]
case mp
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h₁ : ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → I = ⊥
I : LieIdeal R L
h₂ this : IsLieAbelian { x // x ∈ ↑I }
⊢ I = ⊥
[PROOFSTEP]
apply h₁
[GOAL]
case mp.a
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h₁ : ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → I = ⊥
I : LieIdeal R L
h₂ this : IsLieAbelian { x // x ∈ ↑I }
⊢ IsSolvable R { x // x ∈ ↑I }
[PROOFSTEP]
exact LieAlgebra.ofAbelianIsSolvable R I
[GOAL]
case mpr
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h₁ : ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
I : LieIdeal R L
h₂ : IsSolvable R { x // x ∈ ↑I }
⊢ I = ⊥
[PROOFSTEP]
haveI : IsSolvable R I := h₂
[GOAL]
case mpr
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h₁ : ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
I : LieIdeal R L
h₂ this : IsSolvable R { x // x ∈ ↑I }
⊢ I = ⊥
[PROOFSTEP]
rw [← abelian_of_solvable_ideal_eq_bot_iff]
[GOAL]
case mpr
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h₁ : ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
I : LieIdeal R L
h₂ this : IsSolvable R { x // x ∈ ↑I }
⊢ derivedAbelianOfIdeal I = ⊥
[PROOFSTEP]
apply h₁
[GOAL]
case mpr.a
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h₁ : ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
I : LieIdeal R L
h₂ this : IsSolvable R { x // x ∈ ↑I }
⊢ IsLieAbelian { x // x ∈ ↑(derivedAbelianOfIdeal I) }
[PROOFSTEP]
exact abelian_derivedAbelianOfIdeal I
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : IsSemisimple R L
⊢ center R L = ⊥
[PROOFSTEP]
rw [isSemisimple_iff_no_abelian_ideals] at h
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
⊢ center R L = ⊥
[PROOFSTEP]
apply h
[GOAL]
case a
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
⊢ IsLieAbelian { x // x ∈ ↑(center R L) }
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : IsSimple R L
⊢ IsSemisimple R L
[PROOFSTEP]
rw [isSemisimple_iff_no_abelian_ideals]
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : IsSimple R L
⊢ ∀ (I : LieIdeal R L), IsLieAbelian { x // x ∈ ↑I } → I = ⊥
[PROOFSTEP]
intro I hI
[GOAL]
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : IsSimple R L
I : LieIdeal R L
hI : IsLieAbelian { x // x ∈ ↑I }
⊢ I = ⊥
[PROOFSTEP]
obtain @⟨⟨h₁⟩, h₂⟩ := id h
[GOAL]
case mk.mk
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : IsSimple R L
I : LieIdeal R L
hI : IsLieAbelian { x // x ∈ ↑I }
h₂ : ¬IsLieAbelian L
h₁ : ∀ (N : LieSubmodule R L L), N ≠ ⊥ → N = ⊤
⊢ I = ⊥
[PROOFSTEP]
by_contra contra
[GOAL]
case mk.mk
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : IsSimple R L
I : LieIdeal R L
hI : IsLieAbelian { x // x ∈ ↑I }
h₂ : ¬IsLieAbelian L
h₁ : ∀ (N : LieSubmodule R L L), N ≠ ⊥ → N = ⊤
contra : ¬I = ⊥
⊢ False
[PROOFSTEP]
rw [h₁ I contra, lie_abelian_iff_equiv_lie_abelian LieIdeal.topEquiv] at hI
[GOAL]
case mk.mk
R : Type u
L : Type v
inst✝² : CommRing R
inst✝¹ : LieRing L
inst✝ : LieAlgebra R L
h : IsSimple R L
I : LieIdeal R L
hI : IsLieAbelian L
h₂ : ¬IsLieAbelian L
h₁ : ∀ (N : LieSubmodule R L L), N ≠ ⊥ → N = ⊤
contra : ¬I = ⊥
⊢ False
[PROOFSTEP]
exact h₂ hI
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsSemisimple R L
h : IsLieAbelian L
⊢ Subsingleton L
[PROOFSTEP]
rw [isLieAbelian_iff_center_eq_top R L, center_eq_bot_of_semisimple] at h
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsSemisimple R L
h : ⊥ = ⊤
⊢ Subsingleton L
[PROOFSTEP]
exact (LieSubmodule.subsingleton_iff R L L).mp (subsingleton_of_bot_eq_top h)
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsSemisimple R L
⊢ IsLieAbelian { x // x ∈ ↑(radical R L) }
[PROOFSTEP]
rw [IsSemisimple.semisimple]
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsSemisimple R L
⊢ IsLieAbelian { x // x ∈ ↑⊥ }
[PROOFSTEP]
exact isLieAbelian_bot R L
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsNoetherian R L
⊢ IsLieAbelian { x // x ∈ ↑(radical R L) } ↔
    ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → IsLieAbelian { x // x ∈ ↑I }
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsNoetherian R L
⊢ IsLieAbelian { x // x ∈ ↑(radical R L) } →
    ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → IsLieAbelian { x // x ∈ ↑I }
[PROOFSTEP]
rintro h₁ I h₂
[GOAL]
case mp
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsNoetherian R L
h₁ : IsLieAbelian { x // x ∈ ↑(radical R L) }
I : LieIdeal R L
h₂ : IsSolvable R { x // x ∈ ↑I }
⊢ IsLieAbelian { x // x ∈ ↑I }
[PROOFSTEP]
rw [LieIdeal.solvable_iff_le_radical] at h₂
[GOAL]
case mp
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsNoetherian R L
h₁ : IsLieAbelian { x // x ∈ ↑(radical R L) }
I : LieIdeal R L
h₂ : I ≤ radical R L
⊢ IsLieAbelian { x // x ∈ ↑I }
[PROOFSTEP]
exact (LieIdeal.homOfLe_injective h₂).isLieAbelian h₁
[GOAL]
case mpr
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsNoetherian R L
⊢ (∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → IsLieAbelian { x // x ∈ ↑I }) →
    IsLieAbelian { x // x ∈ ↑(radical R L) }
[PROOFSTEP]
intro h
[GOAL]
case mpr
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsNoetherian R L
h : ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → IsLieAbelian { x // x ∈ ↑I }
⊢ IsLieAbelian { x // x ∈ ↑(radical R L) }
[PROOFSTEP]
apply h
[GOAL]
case mpr.a
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsNoetherian R L
h : ∀ (I : LieIdeal R L), IsSolvable R { x // x ∈ ↑I } → IsLieAbelian { x // x ∈ ↑I }
⊢ IsSolvable R { x // x ∈ ↑(radical R L) }
[PROOFSTEP]
infer_instance
[GOAL]
R : Type u
L : Type v
inst✝³ : CommRing R
inst✝² : LieRing L
inst✝¹ : LieAlgebra R L
inst✝ : IsSemisimple R L
⊢ LieHom.ker (ad R L) = ⊥
[PROOFSTEP]
simp


[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁵ : CommRing 𝕜
inst✝¹⁴ : AddCommGroup E
inst✝¹³ : Module 𝕜 E
inst✝¹² : TopologicalSpace E
inst✝¹¹ : TopologicalAddGroup E
inst✝¹⁰ : ContinuousConstSMul 𝕜 E
inst✝⁹ : AddCommGroup F
inst✝⁸ : Module 𝕜 F
inst✝⁷ : TopologicalSpace F
inst✝⁶ : TopologicalAddGroup F
inst✝⁵ : ContinuousConstSMul 𝕜 F
inst✝⁴ : AddCommGroup G
inst✝³ : Module 𝕜 G
inst✝² : TopologicalSpace G
inst✝¹ : TopologicalAddGroup G
inst✝ : ContinuousConstSMul 𝕜 G
p : FormalMultilinearSeries 𝕜 E F
n : ℕ
h : 0 < n
⊢ removeZero p n = p n
[PROOFSTEP]
rw [← Nat.succ_pred_eq_of_pos h]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁵ : CommRing 𝕜
inst✝¹⁴ : AddCommGroup E
inst✝¹³ : Module 𝕜 E
inst✝¹² : TopologicalSpace E
inst✝¹¹ : TopologicalAddGroup E
inst✝¹⁰ : ContinuousConstSMul 𝕜 E
inst✝⁹ : AddCommGroup F
inst✝⁸ : Module 𝕜 F
inst✝⁷ : TopologicalSpace F
inst✝⁶ : TopologicalAddGroup F
inst✝⁵ : ContinuousConstSMul 𝕜 F
inst✝⁴ : AddCommGroup G
inst✝³ : Module 𝕜 G
inst✝² : TopologicalSpace G
inst✝¹ : TopologicalAddGroup G
inst✝ : ContinuousConstSMul 𝕜 G
p : FormalMultilinearSeries 𝕜 E F
n : ℕ
h : 0 < n
⊢ removeZero p (Nat.succ (Nat.pred n)) = p (Nat.succ (Nat.pred n))
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁵ : CommRing 𝕜
inst✝¹⁴ : AddCommGroup E
inst✝¹³ : Module 𝕜 E
inst✝¹² : TopologicalSpace E
inst✝¹¹ : TopologicalAddGroup E
inst✝¹⁰ : ContinuousConstSMul 𝕜 E
inst✝⁹ : AddCommGroup F
inst✝⁸ : Module 𝕜 F
inst✝⁷ : TopologicalSpace F
inst✝⁶ : TopologicalAddGroup F
inst✝⁵ : ContinuousConstSMul 𝕜 F
inst✝⁴ : AddCommGroup G
inst✝³ : Module 𝕜 G
inst✝² : TopologicalSpace G
inst✝¹ : TopologicalAddGroup G
inst✝ : ContinuousConstSMul 𝕜 G
p : FormalMultilinearSeries 𝕜 E F
m n : ℕ
v : Fin m → E
w : Fin n → E
h1 : m = n
h2 : ∀ (i : ℕ) (him : i < m) (hin : i < n), v { val := i, isLt := him } = w { val := i, isLt := hin }
⊢ ↑(p m) v = ↑(p n) w
[PROOFSTEP]
subst n
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁵ : CommRing 𝕜
inst✝¹⁴ : AddCommGroup E
inst✝¹³ : Module 𝕜 E
inst✝¹² : TopologicalSpace E
inst✝¹¹ : TopologicalAddGroup E
inst✝¹⁰ : ContinuousConstSMul 𝕜 E
inst✝⁹ : AddCommGroup F
inst✝⁸ : Module 𝕜 F
inst✝⁷ : TopologicalSpace F
inst✝⁶ : TopologicalAddGroup F
inst✝⁵ : ContinuousConstSMul 𝕜 F
inst✝⁴ : AddCommGroup G
inst✝³ : Module 𝕜 G
inst✝² : TopologicalSpace G
inst✝¹ : TopologicalAddGroup G
inst✝ : ContinuousConstSMul 𝕜 G
p : FormalMultilinearSeries 𝕜 E F
m : ℕ
v w : Fin m → E
h2 : ∀ (i : ℕ) (him hin : i < m), v { val := i, isLt := him } = w { val := i, isLt := hin }
⊢ ↑(p m) v = ↑(p m) w
[PROOFSTEP]
congr with ⟨i, hi⟩
[GOAL]
case h.e_6.h.h.mk
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁵ : CommRing 𝕜
inst✝¹⁴ : AddCommGroup E
inst✝¹³ : Module 𝕜 E
inst✝¹² : TopologicalSpace E
inst✝¹¹ : TopologicalAddGroup E
inst✝¹⁰ : ContinuousConstSMul 𝕜 E
inst✝⁹ : AddCommGroup F
inst✝⁸ : Module 𝕜 F
inst✝⁷ : TopologicalSpace F
inst✝⁶ : TopologicalAddGroup F
inst✝⁵ : ContinuousConstSMul 𝕜 F
inst✝⁴ : AddCommGroup G
inst✝³ : Module 𝕜 G
inst✝² : TopologicalSpace G
inst✝¹ : TopologicalAddGroup G
inst✝ : ContinuousConstSMul 𝕜 G
p : FormalMultilinearSeries 𝕜 E F
m : ℕ
v w : Fin m → E
h2 : ∀ (i : ℕ) (him hin : i < m), v { val := i, isLt := him } = w { val := i, isLt := hin }
i : ℕ
hi : i < m
⊢ v { val := i, isLt := hi } = w { val := i, isLt := hi }
[PROOFSTEP]
exact h2 i hi hi
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁰ : CommRing 𝕜
n : ℕ
inst✝⁹ : AddCommGroup E
inst✝⁸ : Module 𝕜 E
inst✝⁷ : TopologicalSpace E
inst✝⁶ : TopologicalAddGroup E
inst✝⁵ : ContinuousConstSMul 𝕜 E
inst✝⁴ : AddCommGroup F
inst✝³ : Module 𝕜 F
inst✝² : TopologicalSpace F
inst✝¹ : TopologicalAddGroup F
inst✝ : ContinuousConstSMul 𝕜 F
p : FormalMultilinearSeries 𝕜 E F
⊢ order 0 = 0
[PROOFSTEP]
simp [order]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁰ : CommRing 𝕜
n : ℕ
inst✝⁹ : AddCommGroup E
inst✝⁸ : Module 𝕜 E
inst✝⁷ : TopologicalSpace E
inst✝⁶ : TopologicalAddGroup E
inst✝⁵ : ContinuousConstSMul 𝕜 E
inst✝⁴ : AddCommGroup F
inst✝³ : Module 𝕜 F
inst✝² : TopologicalSpace F
inst✝¹ : TopologicalAddGroup F
inst✝ : ContinuousConstSMul 𝕜 F
p : FormalMultilinearSeries 𝕜 E F
hp : order p ≠ 0
h : p = 0
⊢ False
[PROOFSTEP]
simp [h] at hp
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹¹ : CommRing 𝕜
n : ℕ
inst✝¹⁰ : AddCommGroup E
inst✝⁹ : Module 𝕜 E
inst✝⁸ : TopologicalSpace E
inst✝⁷ : TopologicalAddGroup E
inst✝⁶ : ContinuousConstSMul 𝕜 E
inst✝⁵ : AddCommGroup F
inst✝⁴ : Module 𝕜 F
inst✝³ : TopologicalSpace F
inst✝² : TopologicalAddGroup F
inst✝¹ : ContinuousConstSMul 𝕜 F
p : FormalMultilinearSeries 𝕜 E F
inst✝ : DecidablePred fun n => p n ≠ 0
hp : ∃ n, p n ≠ 0
⊢ order p = Nat.find hp
[PROOFSTEP]
convert Nat.sInf_def hp
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁰ : CommRing 𝕜
n : ℕ
inst✝⁹ : AddCommGroup E
inst✝⁸ : Module 𝕜 E
inst✝⁷ : TopologicalSpace E
inst✝⁶ : TopologicalAddGroup E
inst✝⁵ : ContinuousConstSMul 𝕜 E
inst✝⁴ : AddCommGroup F
inst✝³ : Module 𝕜 F
inst✝² : TopologicalSpace F
inst✝¹ : TopologicalAddGroup F
inst✝ : ContinuousConstSMul 𝕜 F
p : FormalMultilinearSeries 𝕜 E F
⊢ order p = 0 ↔ p = 0 ∨ p 0 ≠ 0
[PROOFSTEP]
simpa [order, Nat.sInf_eq_zero, FormalMultilinearSeries.ext_iff, eq_empty_iff_forall_not_mem] using or_comm
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝¹⁰ : CommRing 𝕜
n : ℕ
inst✝⁹ : AddCommGroup E
inst✝⁸ : Module 𝕜 E
inst✝⁷ : TopologicalSpace E
inst✝⁶ : TopologicalAddGroup E
inst✝⁵ : ContinuousConstSMul 𝕜 E
inst✝⁴ : AddCommGroup F
inst✝³ : Module 𝕜 F
inst✝² : TopologicalSpace F
inst✝¹ : TopologicalAddGroup F
inst✝ : ContinuousConstSMul 𝕜 F
p : FormalMultilinearSeries 𝕜 E F
hp : p ≠ 0
⊢ order p = 0 ↔ p 0 ≠ 0
[PROOFSTEP]
simp [order_eq_zero_iff', hp]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
s : E
p : FormalMultilinearSeries 𝕜 𝕜 E
f : 𝕜 → E
n : ℕ
z z₀ : 𝕜
y : Fin n → 𝕜
⊢ ↑(p n) y = (∏ i : Fin n, y i) • coeff p n
[PROOFSTEP]
convert (p n).toMultilinearMap.map_smul_univ y 1
[GOAL]
case h.e'_2.h.e'_1.h
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
s : E
p : FormalMultilinearSeries 𝕜 𝕜 E
f : 𝕜 → E
n : ℕ
z z₀ : 𝕜
y : Fin n → 𝕜
x✝ : Fin n
⊢ y x✝ = y x✝ • OfNat.ofNat 1 x✝
[PROOFSTEP]
funext
[GOAL]
case h.e'_2.h.e'_1.h
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
s : E
p : FormalMultilinearSeries 𝕜 𝕜 E
f : 𝕜 → E
n : ℕ
z z₀ : 𝕜
y : Fin n → 𝕜
x✝ : Fin n
⊢ y x✝ = y x✝ • OfNat.ofNat 1 x✝
[PROOFSTEP]
simp only [Pi.one_apply, Algebra.id.smul_eq_mul, mul_one]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
s : E
p : FormalMultilinearSeries 𝕜 𝕜 E
f : 𝕜 → E
n : ℕ
z z₀ : 𝕜
y : Fin n → 𝕜
⊢ coeff p n = 0 ↔ p n = 0
[PROOFSTEP]
rw [← mkPiField_coeff_eq p, ContinuousMultilinearMap.mkPiField_eq_zero_iff]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
s : E
p : FormalMultilinearSeries 𝕜 𝕜 E
f : 𝕜 → E
n : ℕ
z z₀ : 𝕜
y : Fin n → 𝕜
⊢ (↑(p n) fun x => z) = z ^ n • coeff p n
[PROOFSTEP]
simp
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
s : E
p : FormalMultilinearSeries 𝕜 𝕜 E
f : 𝕜 → E
n : ℕ
z z₀ : 𝕜
y : Fin n → 𝕜
⊢ ‖p n‖ = ‖coeff p n‖
[PROOFSTEP]
rw [← mkPiField_coeff_eq p, ContinuousMultilinearMap.norm_mkPiField]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
p : FormalMultilinearSeries 𝕜 𝕜 E
n : ℕ
⊢ coeff (fslope p) n = coeff p (n + 1)
[PROOFSTEP]
simp only [fslope, coeff, ContinuousMultilinearMap.curryLeft_apply]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
p : FormalMultilinearSeries 𝕜 𝕜 E
n : ℕ
⊢ ↑(p (n + 1)) (cons 1 1) = ↑(p (n + 1)) 1
[PROOFSTEP]
congr 1
[GOAL]
case h.e_6.h
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
p : FormalMultilinearSeries 𝕜 𝕜 E
n : ℕ
⊢ cons 1 1 = 1
[PROOFSTEP]
exact Fin.cons_self_tail 1
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
p : FormalMultilinearSeries 𝕜 𝕜 E
n✝ k n : ℕ
⊢ coeff (fslope^[k] p) n = coeff p (n + k)
[PROOFSTEP]
induction k generalizing p with
| zero => rfl
| succ k ih => simp [ih, add_assoc]
[GOAL]
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
p : FormalMultilinearSeries 𝕜 𝕜 E
n✝ k n : ℕ
⊢ coeff (fslope^[k] p) n = coeff p (n + k)
[PROOFSTEP]
induction k generalizing p with
| zero => rfl
| succ k ih => simp [ih, add_assoc]
[GOAL]
case zero
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
n✝ n : ℕ
p : FormalMultilinearSeries 𝕜 𝕜 E
⊢ coeff (fslope^[Nat.zero] p) n = coeff p (n + Nat.zero)
[PROOFSTEP]

| zero => rfl
[GOAL]
case zero
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
n✝ n : ℕ
p : FormalMultilinearSeries 𝕜 𝕜 E
⊢ coeff (fslope^[Nat.zero] p) n = coeff p (n + Nat.zero)
[PROOFSTEP]
rfl
[GOAL]
case succ
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
n✝ n k : ℕ
ih : ∀ {p : FormalMultilinearSeries 𝕜 𝕜 E}, coeff (fslope^[k] p) n = coeff p (n + k)
p : FormalMultilinearSeries 𝕜 𝕜 E
⊢ coeff (fslope^[Nat.succ k] p) n = coeff p (n + Nat.succ k)
[PROOFSTEP]

| succ k ih => simp [ih, add_assoc]
[GOAL]
case succ
𝕜 : Type u
𝕜' : Type u'
E : Type v
F : Type w
G : Type x
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
n✝ n k : ℕ
ih : ∀ {p : FormalMultilinearSeries 𝕜 𝕜 E}, coeff (fslope^[k] p) n = coeff p (n + k)
p : FormalMultilinearSeries 𝕜 𝕜 E
⊢ coeff (fslope^[Nat.succ k] p) n = coeff p (n + Nat.succ k)
[PROOFSTEP]
simp [ih, add_assoc]