[GOAL]
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
⊢ Basis (Fin (natDegree (minpoly K x))) K { x_1 // x_1 ∈ adjoin K {x} }
[PROOFSTEP]
have hST : Function.Injective (algebraMap (adjoin K ({ x } : Set S)) S) := Subtype.coe_injective
[GOAL]
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
⊢ Basis (Fin (natDegree (minpoly K x))) K { x_1 // x_1 ∈ adjoin K {x} }
[PROOFSTEP]
have hx' : IsIntegral K (⟨x, subset_adjoin (Set.mem_singleton x)⟩ : adjoin K ({ x } : Set S)) :=
  by
  apply (isIntegral_algebraMap_iff hST).mp
  convert hx
[GOAL]
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
⊢ IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
[PROOFSTEP]
apply (isIntegral_algebraMap_iff hST).mp
[GOAL]
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
⊢ IsIntegral K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
[PROOFSTEP]
convert hx
[GOAL]
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
⊢ Basis (Fin (natDegree (minpoly K x))) K { x_1 // x_1 ∈ adjoin K {x} }
[PROOFSTEP]
have minpoly_eq := minpoly.eq_of_algebraMap_eq hST hx' rfl
[GOAL]
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
⊢ Basis (Fin (natDegree (minpoly K x))) K { x_1 // x_1 ∈ adjoin K {x} }
[PROOFSTEP]
apply
  @Basis.mk (Fin (minpoly K x).natDegree) _ (adjoin K { x }) fun i => ⟨x, subset_adjoin (Set.mem_singleton x)⟩ ^ (i : ℕ)
[GOAL]
case hli
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
⊢ LinearIndependent K fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i
[PROOFSTEP]
have : LinearIndependent K _ := linearIndependent_pow (⟨x, self_mem_adjoin_singleton _ _⟩ : adjoin K { x })
[GOAL]
case hli
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
this : LinearIndependent K fun i => { val := x, property := (_ : x ∈ adjoin K {x}) } ^ ↑i
⊢ LinearIndependent K fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i
[PROOFSTEP]
rwa [minpoly_eq] at this
[GOAL]
case hsp
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
⊢ ⊤ ≤ Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
[PROOFSTEP]
rintro ⟨y, hy⟩ _
[GOAL]
case hsp.mk
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
y : S
hy : y ∈ adjoin K {x}
a✝ : { val := y, property := hy } ∈ ⊤
⊢ { val := y, property := hy } ∈
    Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
[PROOFSTEP]
have := hx'.mem_span_pow (y := ⟨y, hy⟩)
[GOAL]
case hsp.mk
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
y : S
hy : y ∈ adjoin K {x}
a✝ : { val := y, property := hy } ∈ ⊤
this :
  (∃ f, { val := y, property := hy } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f) →
    { val := y, property := hy } ∈
      Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
⊢ { val := y, property := hy } ∈
    Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
[PROOFSTEP]
rw [minpoly_eq] at this
[GOAL]
case hsp.mk
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
y : S
hy : y ∈ adjoin K {x}
a✝ : { val := y, property := hy } ∈ ⊤
this :
  (∃ f, { val := y, property := hy } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f) →
    { val := y, property := hy } ∈
      Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
⊢ { val := y, property := hy } ∈
    Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
[PROOFSTEP]
apply this
[GOAL]
case hsp.mk
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
y : S
hy : y ∈ adjoin K {x}
a✝ : { val := y, property := hy } ∈ ⊤
this :
  (∃ f, { val := y, property := hy } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f) →
    { val := y, property := hy } ∈
      Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
⊢ ∃ f, { val := y, property := hy } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f
[PROOFSTEP]
rw [adjoin_singleton_eq_range_aeval] at hy
[GOAL]
case hsp.mk
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
y : S
hy✝ : y ∈ adjoin K {x}
hy : y ∈ AlgHom.range (aeval x)
a✝ : { val := y, property := hy✝ } ∈ ⊤
this :
  (∃ f, { val := y, property := hy✝ } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f) →
    { val := y, property := hy✝ } ∈
      Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
⊢ ∃ f, { val := y, property := hy✝ } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f
[PROOFSTEP]
obtain ⟨f, rfl⟩ := (aeval x).mem_range.mp hy
[GOAL]
case hsp.mk.intro
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
f : K[X]
hy✝ : ↑(aeval x) f ∈ adjoin K {x}
hy : ↑(aeval x) f ∈ AlgHom.range (aeval x)
a✝ : { val := ↑(aeval x) f, property := hy✝ } ∈ ⊤
this :
  (∃ f_1, { val := ↑(aeval x) f, property := hy✝ } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f_1) →
    { val := ↑(aeval x) f, property := hy✝ } ∈
      Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
⊢ ∃ f_1, { val := ↑(aeval x) f, property := hy✝ } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f_1
[PROOFSTEP]
use f
[GOAL]
case h
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
f : K[X]
hy✝ : ↑(aeval x) f ∈ adjoin K {x}
hy : ↑(aeval x) f ∈ AlgHom.range (aeval x)
a✝ : { val := ↑(aeval x) f, property := hy✝ } ∈ ⊤
this :
  (∃ f_1, { val := ↑(aeval x) f, property := hy✝ } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f_1) →
    { val := ↑(aeval x) f, property := hy✝ } ∈
      Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
⊢ { val := ↑(aeval x) f, property := hy✝ } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f
[PROOFSTEP]
ext
[GOAL]
case h.a
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
hST : Function.Injective ↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S)
hx' : IsIntegral K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }
minpoly_eq :
  minpoly K { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } =
    minpoly K (↑(algebraMap { x_1 // x_1 ∈ adjoin K {x} } S) { val := x, property := (_ : x ∈ ↑(adjoin K {x})) })
f : K[X]
hy✝ : ↑(aeval x) f ∈ adjoin K {x}
hy : ↑(aeval x) f ∈ AlgHom.range (aeval x)
a✝ : { val := ↑(aeval x) f, property := hy✝ } ∈ ⊤
this :
  (∃ f_1, { val := ↑(aeval x) f, property := hy✝ } = ↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f_1) →
    { val := ↑(aeval x) f, property := hy✝ } ∈
      Submodule.span K (Set.range fun i => { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i)
⊢ ↑{ val := ↑(aeval x) f, property := hy✝ } = ↑(↑(aeval { val := x, property := (_ : x ∈ ↑(adjoin K {x})) }) f)
[PROOFSTEP]
exact aeval_algebraMap_apply S (⟨x, _⟩ : adjoin K { x }) _
[GOAL]
K : Type u_1
S : Type u_2
inst✝² : Field K
inst✝¹ : CommRing S
inst✝ : Algebra K S
x : S
hx : IsIntegral K x
i : Fin (natDegree (minpoly K x))
⊢ ↑(powerBasisAux hx) i = { val := x, property := (_ : x ∈ ↑(adjoin K {x})) } ^ ↑i
[PROOFSTEP]
rw [adjoin.powerBasisAux, Basis.mk_apply]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
⊢ ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
intro i
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
⊢ IsIntegral R (↑(↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
let Q := X ^ n %ₘ minpoly R B.gen
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
⊢ IsIntegral R (↑(↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
have : B.gen ^ n = aeval B.gen Q :=
  by
  rw [← @aeval_X_pow R _ _ _ _ B.gen, ← modByMonic_add_div (X ^ n) (minpoly.monic hB)]
  simp
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
⊢ B.gen ^ n = ↑(aeval B.gen) Q
[PROOFSTEP]
rw [← @aeval_X_pow R _ _ _ _ B.gen, ← modByMonic_add_div (X ^ n) (minpoly.monic hB)]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
⊢ ↑(aeval B.gen) (X ^ n %ₘ minpoly R B.gen + minpoly R B.gen * (X ^ n /ₘ minpoly R B.gen)) = ↑(aeval B.gen) Q
[PROOFSTEP]
simp
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
⊢ IsIntegral R (↑(↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
by_cases hQ : Q = 0
[GOAL]
case pos
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : Q = 0
⊢ IsIntegral R (↑(↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
simp [this, hQ, isIntegral_zero]
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
⊢ IsIntegral R (↑(↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
have hlt : Q.natDegree < B.dim :=
  by
  rw [← B.natDegree_minpoly, hmin, (minpoly.monic hB).natDegree_map, natDegree_lt_natDegree_iff hQ]
  letI : Nontrivial R := Nontrivial.of_polynomial_ne hQ
  exact degree_modByMonic_lt _ (minpoly.monic hB)
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
⊢ natDegree Q < B.dim
[PROOFSTEP]
rw [← B.natDegree_minpoly, hmin, (minpoly.monic hB).natDegree_map, natDegree_lt_natDegree_iff hQ]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
⊢ degree Q < degree (minpoly R B.gen)
[PROOFSTEP]
letI : Nontrivial R := Nontrivial.of_polynomial_ne hQ
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this✝ : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
this : Nontrivial R := Nontrivial.of_polynomial_ne hQ
⊢ degree Q < degree (minpoly R B.gen)
[PROOFSTEP]
exact degree_modByMonic_lt _ (minpoly.monic hB)
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
⊢ IsIntegral R (↑(↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
rw [this, aeval_eq_sum_range' hlt]
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
⊢ IsIntegral R (↑(↑B.basis.repr (Finset.sum (Finset.range B.dim) fun i => coeff Q i • B.gen ^ i)) i)
[PROOFSTEP]
simp only [LinearEquiv.map_sum, LinearEquiv.map_smulₛₗ, RingHom.id_apply, Finset.sum_apply']
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
⊢ IsIntegral R
    (Finset.sum (Finset.range B.dim) fun x => ↑(↑B.basis.repr (coeff (X ^ n %ₘ minpoly R B.gen) x • B.gen ^ x)) i)
[PROOFSTEP]
refine' IsIntegral.sum _ fun j hj => _
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j ∈ Finset.range B.dim
⊢ IsIntegral R (↑(↑B.basis.repr (coeff (X ^ n %ₘ minpoly R B.gen) j • B.gen ^ j)) i)
[PROOFSTEP]
replace hj := Finset.mem_range.1 hj
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j < B.dim
⊢ IsIntegral R (↑(↑B.basis.repr (coeff (X ^ n %ₘ minpoly R B.gen) j • B.gen ^ j)) i)
[PROOFSTEP]
rw [← Fin.val_mk hj, ← B.basis_eq_pow, Algebra.smul_def, IsScalarTower.algebraMap_apply R S A, ← Algebra.smul_def,
  LinearEquiv.map_smul]
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j < B.dim
⊢ IsIntegral R
    (↑(↑(algebraMap R S) (coeff (X ^ n %ₘ minpoly R B.gen) ↑{ val := j, isLt := hj }) •
          ↑B.basis.repr (↑B.basis { val := j, isLt := hj }))
      i)
[PROOFSTEP]
simp only [algebraMap_smul, Finsupp.coe_smul, Pi.smul_apply, B.basis.repr_self_apply]
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j < B.dim
⊢ IsIntegral R (coeff (X ^ n %ₘ minpoly R B.gen) j • if { val := j, isLt := hj } = i then 1 else 0)
[PROOFSTEP]
by_cases hij : (⟨j, hj⟩ : Fin _) = i
[GOAL]
case pos
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j < B.dim
hij : { val := j, isLt := hj } = i
⊢ IsIntegral R (coeff (X ^ n %ₘ minpoly R B.gen) j • if { val := j, isLt := hj } = i then 1 else 0)
[PROOFSTEP]
simp only [hij, eq_self_iff_true, if_true]
[GOAL]
case pos
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j < B.dim
hij : { val := j, isLt := hj } = i
⊢ IsIntegral R (coeff (X ^ n %ₘ minpoly R B.gen) j • 1)
[PROOFSTEP]
rw [Algebra.smul_def, mul_one]
[GOAL]
case pos
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j < B.dim
hij : { val := j, isLt := hj } = i
⊢ IsIntegral R (↑(algebraMap R S) (coeff (X ^ n %ₘ minpoly R B.gen) j))
[PROOFSTEP]
exact isIntegral_algebraMap
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
i : Fin B.dim
Q : R[X] := X ^ n %ₘ minpoly R B.gen
this : B.gen ^ n = ↑(aeval B.gen) Q
hQ : ¬Q = 0
hlt : natDegree Q < B.dim
j : ℕ
hj : j < B.dim
hij : ¬{ val := j, isLt := hj } = i
⊢ IsIntegral R (coeff (X ^ n %ₘ minpoly R B.gen) j • if { val := j, isLt := hj } = i then 1 else 0)
[PROOFSTEP]
simp [hij, isIntegral_zero]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x y : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hy : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr y) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
⊢ ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x * y)) i)
[PROOFSTEP]
intro i
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x y : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hy : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr y) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
i : Fin B.dim
⊢ IsIntegral R (↑(↑B.basis.repr (x * y)) i)
[PROOFSTEP]
rw [← B.basis.sum_repr x, ← B.basis.sum_repr y, Finset.sum_mul_sum, LinearEquiv.map_sum, Finset.sum_apply']
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x y : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hy : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr y) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
i : Fin B.dim
⊢ IsIntegral R
    (Finset.sum (Finset.univ ×ˢ Finset.univ) fun k =>
      ↑(↑B.basis.repr (↑(↑B.basis.repr x) k.fst • ↑B.basis k.fst * ↑(↑B.basis.repr y) k.snd • ↑B.basis k.snd)) i)
[PROOFSTEP]
refine' IsIntegral.sum _ fun I _ => _
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x y : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hy : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr y) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
i : Fin B.dim
I : Fin B.dim × Fin B.dim
x✝ : I ∈ Finset.univ ×ˢ Finset.univ
⊢ IsIntegral R
    (↑(↑B.basis.repr (↑(↑B.basis.repr x) I.fst • ↑B.basis I.fst * ↑(↑B.basis.repr y) I.snd • ↑B.basis I.snd)) i)
[PROOFSTEP]
simp only [Algebra.smul_mul_assoc, Algebra.mul_smul_comm, LinearEquiv.map_smulₛₗ, RingHom.id_apply, Finsupp.coe_smul,
  Pi.smul_apply, id.smul_eq_mul]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x y : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hy : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr y) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
i : Fin B.dim
I : Fin B.dim × Fin B.dim
x✝ : I ∈ Finset.univ ×ˢ Finset.univ
⊢ IsIntegral R
    ((↑(↑B.basis.repr y) I.snd • ↑(↑B.basis.repr x) I.fst • ↑(↑B.basis.repr (↑B.basis I.fst * ↑B.basis I.snd))) i)
[PROOFSTEP]
refine' isIntegral_mul (hy _) (isIntegral_mul (hx _) _)
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x y : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hy : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr y) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
i : Fin B.dim
I : Fin B.dim × Fin B.dim
x✝ : I ∈ Finset.univ ×ˢ Finset.univ
⊢ IsIntegral R (↑(↑B.basis.repr (↑B.basis I.fst * ↑B.basis I.snd)) i)
[PROOFSTEP]
simp only [coe_basis, ← pow_add]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x y : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hy : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr y) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
i : Fin B.dim
I : Fin B.dim × Fin B.dim
x✝ : I ∈ Finset.univ ×ˢ Finset.univ
⊢ IsIntegral R (↑(↑B.basis.repr (B.gen ^ (↑I.fst + ↑I.snd))) i)
[PROOFSTEP]
refine' repr_gen_pow_isIntegral hB hmin _ _
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
⊢ ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i)
[PROOFSTEP]
nontriviality A using Subsingleton.elim (x ^ n) 0, isIntegral_zero
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
✝ : Nontrivial A
⊢ ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i)
[PROOFSTEP]
revert hx
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
✝ : Nontrivial A
⊢ (∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)) →
    ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i)
[PROOFSTEP]
refine'
  Nat.case_strong_induction_on (p := fun n ↦ _ → ∀ (i : Fin B.dim), IsIntegral R (B.basis.repr (x ^ n) i)) n _
    fun n hn => _
[GOAL]
case refine'_1
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
✝ : Nontrivial A
⊢ (fun n =>
      (∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)) →
        ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i))
    0
[PROOFSTEP]
intro _ i
[GOAL]
case refine'_1
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
✝ : Nontrivial A
a✝ : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
i : Fin B.dim
⊢ IsIntegral R (↑(↑B.basis.repr (x ^ 0)) i)
[PROOFSTEP]
rw [pow_zero, ← pow_zero B.gen, ← Fin.val_mk B.dim_pos, ← B.basis_eq_pow, B.basis.repr_self_apply]
[GOAL]
case refine'_1
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
✝ : Nontrivial A
a✝ : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
i : Fin B.dim
⊢ IsIntegral R (if { val := 0, isLt := (_ : 0 < B.dim) } = i then 1 else 0)
[PROOFSTEP]
split_ifs
[GOAL]
case pos
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
✝ : Nontrivial A
a✝ : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
i : Fin B.dim
h✝ : { val := 0, isLt := (_ : 0 < B.dim) } = i
⊢ IsIntegral R 1
[PROOFSTEP]
exact isIntegral_one
[GOAL]
case neg
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n : ℕ
✝ : Nontrivial A
a✝ : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
i : Fin B.dim
h✝ : ¬{ val := 0, isLt := (_ : 0 < B.dim) } = i
⊢ IsIntegral R 0
[PROOFSTEP]
exact isIntegral_zero
[GOAL]
case refine'_2
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n✝ : ℕ
✝ : Nontrivial A
n : ℕ
hn :
  ∀ (m : ℕ),
    m ≤ n →
      (fun n =>
          (∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)) →
            ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i))
        m
⊢ (fun n =>
      (∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)) →
        ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i))
    (Nat.succ n)
[PROOFSTEP]
intro hx
[GOAL]
case refine'_2
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n✝ : ℕ
✝ : Nontrivial A
n : ℕ
hn :
  ∀ (m : ℕ),
    m ≤ n →
      (fun n =>
          (∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)) →
            ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i))
        m
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
⊢ ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ Nat.succ n)) i)
[PROOFSTEP]
rw [pow_succ]
[GOAL]
case refine'_2
K : Type u_1
S : Type u_2
inst✝¹¹ : Field K
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra K S
R : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : Algebra R S
inst✝⁶ : Algebra R K
inst✝⁵ : IsScalarTower R K S
A : Type u_4
inst✝⁴ : CommRing A
inst✝³ : Algebra R A
inst✝² : Algebra S A
inst✝¹ : IsScalarTower R S A
B : PowerBasis S A
hB : IsIntegral R B.gen
inst✝ : IsDomain S
x : A
hmin : minpoly S B.gen = Polynomial.map (algebraMap R S) (minpoly R B.gen)
n✝ : ℕ
✝ : Nontrivial A
n : ℕ
hn :
  ∀ (m : ℕ),
    m ≤ n →
      (fun n =>
          (∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)) →
            ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x ^ n)) i))
        m
hx : ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr x) i)
⊢ ∀ (i : Fin B.dim), IsIntegral R (↑(↑B.basis.repr (x * x ^ n)) i)
[PROOFSTEP]
exact repr_mul_isIntegral hB hx (fun _ => hn _ le_rfl (fun _ => hx _) _) hmin
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹⁰ : Field K
inst✝⁹ : CommRing S
inst✝⁸ : Algebra K S
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : Algebra R S
inst✝⁵ : Algebra R K
inst✝⁴ : IsScalarTower R K S
A : Type u_4
inst✝³ : CommRing A
inst✝² : Algebra R A
inst✝¹ : Algebra S A
inst✝ : IsScalarTower R S A
B✝ : PowerBasis S A
hB✝ : IsIntegral R B✝.gen
B B' : PowerBasis K S
P : R[X]
h : ↑(aeval B.gen) P = B'.gen
hB : IsIntegral R B.gen
hmin : minpoly K B.gen = Polynomial.map (algebraMap R K) (minpoly R B.gen)
⊢ ∀ (i : Fin B.dim) (j : Fin B'.dim), IsIntegral R (Basis.toMatrix B.basis (↑B'.basis) i j)
[PROOFSTEP]
intro i j
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹⁰ : Field K
inst✝⁹ : CommRing S
inst✝⁸ : Algebra K S
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : Algebra R S
inst✝⁵ : Algebra R K
inst✝⁴ : IsScalarTower R K S
A : Type u_4
inst✝³ : CommRing A
inst✝² : Algebra R A
inst✝¹ : Algebra S A
inst✝ : IsScalarTower R S A
B✝ : PowerBasis S A
hB✝ : IsIntegral R B✝.gen
B B' : PowerBasis K S
P : R[X]
h : ↑(aeval B.gen) P = B'.gen
hB : IsIntegral R B.gen
hmin : minpoly K B.gen = Polynomial.map (algebraMap R K) (minpoly R B.gen)
i : Fin B.dim
j : Fin B'.dim
⊢ IsIntegral R (Basis.toMatrix B.basis (↑B'.basis) i j)
[PROOFSTEP]
rw [B.basis.toMatrix_apply, B'.coe_basis]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹⁰ : Field K
inst✝⁹ : CommRing S
inst✝⁸ : Algebra K S
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : Algebra R S
inst✝⁵ : Algebra R K
inst✝⁴ : IsScalarTower R K S
A : Type u_4
inst✝³ : CommRing A
inst✝² : Algebra R A
inst✝¹ : Algebra S A
inst✝ : IsScalarTower R S A
B✝ : PowerBasis S A
hB✝ : IsIntegral R B✝.gen
B B' : PowerBasis K S
P : R[X]
h : ↑(aeval B.gen) P = B'.gen
hB : IsIntegral R B.gen
hmin : minpoly K B.gen = Polynomial.map (algebraMap R K) (minpoly R B.gen)
i : Fin B.dim
j : Fin B'.dim
⊢ IsIntegral R (↑(↑B.basis.repr ((fun i => B'.gen ^ ↑i) j)) i)
[PROOFSTEP]
refine' repr_pow_isIntegral hB (fun i => _) hmin _ _
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹⁰ : Field K
inst✝⁹ : CommRing S
inst✝⁸ : Algebra K S
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : Algebra R S
inst✝⁵ : Algebra R K
inst✝⁴ : IsScalarTower R K S
A : Type u_4
inst✝³ : CommRing A
inst✝² : Algebra R A
inst✝¹ : Algebra S A
inst✝ : IsScalarTower R S A
B✝ : PowerBasis S A
hB✝ : IsIntegral R B✝.gen
B B' : PowerBasis K S
P : R[X]
h : ↑(aeval B.gen) P = B'.gen
hB : IsIntegral R B.gen
hmin : minpoly K B.gen = Polynomial.map (algebraMap R K) (minpoly R B.gen)
i✝ : Fin B.dim
j : Fin B'.dim
i : Fin B.dim
⊢ IsIntegral R (↑(↑B.basis.repr B'.gen) i)
[PROOFSTEP]
rw [← h, aeval_eq_sum_range, LinearEquiv.map_sum, Finset.sum_apply']
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹⁰ : Field K
inst✝⁹ : CommRing S
inst✝⁸ : Algebra K S
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : Algebra R S
inst✝⁵ : Algebra R K
inst✝⁴ : IsScalarTower R K S
A : Type u_4
inst✝³ : CommRing A
inst✝² : Algebra R A
inst✝¹ : Algebra S A
inst✝ : IsScalarTower R S A
B✝ : PowerBasis S A
hB✝ : IsIntegral R B✝.gen
B B' : PowerBasis K S
P : R[X]
h : ↑(aeval B.gen) P = B'.gen
hB : IsIntegral R B.gen
hmin : minpoly K B.gen = Polynomial.map (algebraMap R K) (minpoly R B.gen)
i✝ : Fin B.dim
j : Fin B'.dim
i : Fin B.dim
⊢ IsIntegral R (Finset.sum (Finset.range (natDegree P + 1)) fun k => ↑(↑B.basis.repr (coeff P k • B.gen ^ k)) i)
[PROOFSTEP]
refine' IsIntegral.sum _ fun n _ => _
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹⁰ : Field K
inst✝⁹ : CommRing S
inst✝⁸ : Algebra K S
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : Algebra R S
inst✝⁵ : Algebra R K
inst✝⁴ : IsScalarTower R K S
A : Type u_4
inst✝³ : CommRing A
inst✝² : Algebra R A
inst✝¹ : Algebra S A
inst✝ : IsScalarTower R S A
B✝ : PowerBasis S A
hB✝ : IsIntegral R B✝.gen
B B' : PowerBasis K S
P : R[X]
h : ↑(aeval B.gen) P = B'.gen
hB : IsIntegral R B.gen
hmin : minpoly K B.gen = Polynomial.map (algebraMap R K) (minpoly R B.gen)
i✝ : Fin B.dim
j : Fin B'.dim
i : Fin B.dim
n : ℕ
x✝ : n ∈ Finset.range (natDegree P + 1)
⊢ IsIntegral R (↑(↑B.basis.repr (coeff P n • B.gen ^ n)) i)
[PROOFSTEP]
rw [Algebra.smul_def, IsScalarTower.algebraMap_apply R K S, ← Algebra.smul_def, LinearEquiv.map_smul, algebraMap_smul]
[GOAL]
K : Type u_1
S : Type u_2
inst✝¹⁰ : Field K
inst✝⁹ : CommRing S
inst✝⁸ : Algebra K S
R : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : Algebra R S
inst✝⁵ : Algebra R K
inst✝⁴ : IsScalarTower R K S
A : Type u_4
inst✝³ : CommRing A
inst✝² : Algebra R A
inst✝¹ : Algebra S A
inst✝ : IsScalarTower R S A
B✝ : PowerBasis S A
hB✝ : IsIntegral R B✝.gen
B B' : PowerBasis K S
P : R[X]
h : ↑(aeval B.gen) P = B'.gen
hB : IsIntegral R B.gen
hmin : minpoly K B.gen = Polynomial.map (algebraMap R K) (minpoly R B.gen)
i✝ : Fin B.dim
j : Fin B'.dim
i : Fin B.dim
n : ℕ
x✝ : n ∈ Finset.range (natDegree P + 1)
⊢ IsIntegral R (↑(coeff P n • ↑B.basis.repr (B.gen ^ n)) i)
[PROOFSTEP]
exact isIntegral_smul _ (repr_gen_pow_isIntegral hB hmin _ _)


[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f✝ g✝ : G → E
f'✝ g'✝ : G →L[ℝ] E
s✝ : Set G
x✝ : G
n : ℕ∞
f g : ℝ → E
f' g' : E
s : Set ℝ
x : ℝ
hf : HasDerivWithinAt f f' s x
hg : HasDerivWithinAt g g' s x
⊢ HasDerivWithinAt (fun t => Inner.inner (f t) (g t)) (Inner.inner (f x) g' + Inner.inner f' (g x)) s x
[PROOFSTEP]
simpa using (hf.hasFDerivWithinAt.inner 𝕜 hg.hasFDerivWithinAt).hasDerivWithinAt
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f✝ g✝ : G → E
f'✝ g'✝ : G →L[ℝ] E
s : Set G
x✝ : G
n : ℕ∞
f g : ℝ → E
f' g' : E
x : ℝ
⊢ HasDerivAt f f' x →
    HasDerivAt g g' x → HasDerivAt (fun t => Inner.inner (f t) (g t)) (Inner.inner (f x) g' + Inner.inner f' (g x)) x
[PROOFSTEP]
simpa only [← hasDerivWithinAt_univ] using HasDerivWithinAt.inner 𝕜
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : DifferentiableAt ℝ f x
hg : DifferentiableAt ℝ g x
y : G
⊢ ↑(fderiv ℝ (fun t => inner (f t) (g t)) x) y = inner (f x) (↑(fderiv ℝ g x) y) + inner (↑(fderiv ℝ f x) y) (g x)
[PROOFSTEP]
rw [(hf.hasFDerivAt.inner 𝕜 hg.hasFDerivAt).fderiv]
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : DifferentiableAt ℝ f x
hg : DifferentiableAt ℝ g x
y : G
⊢ ↑(ContinuousLinearMap.comp (fderivInnerClm 𝕜 (f x, g x)) (ContinuousLinearMap.prod (fderiv ℝ f x) (fderiv ℝ g x))) y =
    inner (f x) (↑(fderiv ℝ g x) y) + inner (↑(fderiv ℝ f x) y) (g x)
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
⊢ ContDiff ℝ n fun x => ‖x‖ ^ 2
[PROOFSTEP]
convert (reClm : 𝕜 →L[ℝ] ℝ).contDiff.comp ((contDiff_id (E := E)).inner 𝕜 (contDiff_id (E := E)))
[GOAL]
case h.e'_10.h
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
x✝ : E
⊢ ‖x✝‖ ^ 2 = (↑reClm ∘ fun x => inner (id x) (id x)) x✝
[PROOFSTEP]
exact (inner_self_eq_norm_sq _).symm
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x✝ : G
n : ℕ∞
x : E
hx : x ≠ 0
⊢ ContDiffAt ℝ n Norm.norm x
[PROOFSTEP]
have : ‖id x‖ ^ 2 ≠ 0 := pow_ne_zero 2 (norm_pos_iff.2 hx).ne'
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x✝ : G
n : ℕ∞
x : E
hx : x ≠ 0
this : ‖id x‖ ^ 2 ≠ 0
⊢ ContDiffAt ℝ n Norm.norm x
[PROOFSTEP]
simpa only [id, sqrt_sq, norm_nonneg] using (contDiffAt_id.norm_sq 𝕜).sqrt this
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : ContDiffAt ℝ n f x
hg : ContDiffAt ℝ n g x
hne : f x ≠ g x
⊢ ContDiffAt ℝ n (fun y => Dist.dist (f y) (g y)) x
[PROOFSTEP]
simp only [dist_eq_norm]
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : ContDiffAt ℝ n f x
hg : ContDiffAt ℝ n g x
hne : f x ≠ g x
⊢ ContDiffAt ℝ n (fun y => ‖f y - g y‖) x
[PROOFSTEP]
exact (hf.sub hg).norm 𝕜 (sub_ne_zero.2 hne)
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : ContDiffWithinAt ℝ n f s x
hg : ContDiffWithinAt ℝ n g s x
hne : f x ≠ g x
⊢ ContDiffWithinAt ℝ n (fun y => Dist.dist (f y) (g y)) s x
[PROOFSTEP]
simp only [dist_eq_norm]
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : ContDiffWithinAt ℝ n f s x
hg : ContDiffWithinAt ℝ n g s x
hne : f x ≠ g x
⊢ ContDiffWithinAt ℝ n (fun y => ‖f y - g y‖) s x
[PROOFSTEP]
exact (hf.sub hg).norm 𝕜 (sub_ne_zero.2 hne)
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x✝ : G
n : ℕ∞
x : F
⊢ HasStrictFDerivAt (fun x => ‖x‖ ^ 2) (2 • ↑(innerSL ℝ) x) x
[PROOFSTEP]
simp only [sq, ← @inner_self_eq_norm_mul_norm ℝ]
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x✝ : G
n : ℕ∞
x : F
⊢ HasStrictFDerivAt (fun x => ↑re (inner x x)) (2 • ↑(innerSL ℝ) x) x
[PROOFSTEP]
convert (hasStrictFDerivAt_id x).inner ℝ (hasStrictFDerivAt_id x)
[GOAL]
case h.e'_10.h.h
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x✝ : G
n : ℕ∞
x : F
e_7✝ : normedAddCommGroup = NonUnitalNormedRing.toNormedAddCommGroup
he✝ : InnerProductSpace.toNormedSpace = NormedAlgebra.toNormedSpace'
⊢ 2 • ↑(innerSL ℝ) x =
    ContinuousLinearMap.comp (fderivInnerClm ℝ (id x, id x))
      (ContinuousLinearMap.prod (ContinuousLinearMap.id ℝ F) (ContinuousLinearMap.id ℝ F))
[PROOFSTEP]
ext y
[GOAL]
case h.e'_10.h.h.h
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x✝ : G
n : ℕ∞
x : F
e_7✝ : normedAddCommGroup = NonUnitalNormedRing.toNormedAddCommGroup
he✝ : InnerProductSpace.toNormedSpace = NormedAlgebra.toNormedSpace'
y : F
⊢ ↑(2 • ↑(innerSL ℝ) x) y =
    ↑(ContinuousLinearMap.comp (fderivInnerClm ℝ (id x, id x))
          (ContinuousLinearMap.prod (ContinuousLinearMap.id ℝ F) (ContinuousLinearMap.id ℝ F)))
      y
[PROOFSTEP]
simp [two_smul, real_inner_comm]
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : DifferentiableAt ℝ f x
hg : DifferentiableAt ℝ g x
hne : f x ≠ g x
⊢ DifferentiableAt ℝ (fun y => Dist.dist (f y) (g y)) x
[PROOFSTEP]
simp only [dist_eq_norm]
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : DifferentiableAt ℝ f x
hg : DifferentiableAt ℝ g x
hne : f x ≠ g x
⊢ DifferentiableAt ℝ (fun y => ‖f y - g y‖) x
[PROOFSTEP]
exact (hf.sub hg).norm 𝕜 (sub_ne_zero.2 hne)
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : DifferentiableWithinAt ℝ f s x
hg : DifferentiableWithinAt ℝ g s x
hne : f x ≠ g x
⊢ DifferentiableWithinAt ℝ (fun y => Dist.dist (f y) (g y)) s x
[PROOFSTEP]
simp only [dist_eq_norm]
[GOAL]
𝕜 : Type u_1
E : Type u_2
F : Type u_3
inst✝⁷ : IsROrC 𝕜
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : InnerProductSpace 𝕜 E
inst✝⁴ : NormedAddCommGroup F
inst✝³ : InnerProductSpace ℝ F
inst✝² : NormedSpace ℝ E
G : Type u_4
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace ℝ G
f g : G → E
f' g' : G →L[ℝ] E
s : Set G
x : G
n : ℕ∞
hf : DifferentiableWithinAt ℝ f s x
hg : DifferentiableWithinAt ℝ g s x
hne : f x ≠ g x
⊢ DifferentiableWithinAt ℝ (fun y => ‖f y - g y‖) s x
[PROOFSTEP]
exact (hf.sub hg).norm 𝕜 (sub_ne_zero.2 hne)
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ DifferentiableWithinAt 𝕜 f t y ↔ ∀ (i : ι), DifferentiableWithinAt 𝕜 (fun x => f x i) t y
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_differentiableWithinAt_iff, differentiableWithinAt_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ (∀ (i : ι), DifferentiableWithinAt 𝕜 (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) t y) ↔
    ∀ (i : ι), DifferentiableWithinAt 𝕜 (fun x => f x i) t y
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ DifferentiableAt 𝕜 f y ↔ ∀ (i : ι), DifferentiableAt 𝕜 (fun x => f x i) y
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_differentiableAt_iff, differentiableAt_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ (∀ (i : ι), DifferentiableAt 𝕜 (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) y) ↔
    ∀ (i : ι), DifferentiableAt 𝕜 (fun x => f x i) y
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ DifferentiableOn 𝕜 f t ↔ ∀ (i : ι), DifferentiableOn 𝕜 (fun x => f x i) t
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_differentiableOn_iff, differentiableOn_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ (∀ (i : ι), DifferentiableOn 𝕜 (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) t) ↔
    ∀ (i : ι), DifferentiableOn 𝕜 (fun x => f x i) t
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ Differentiable 𝕜 f ↔ ∀ (i : ι), Differentiable 𝕜 fun x => f x i
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_differentiable_iff, differentiable_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ (∀ (i : ι), Differentiable 𝕜 fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) ↔
    ∀ (i : ι), Differentiable 𝕜 fun x => f x i
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ HasStrictFDerivAt f f' y ↔ ∀ (i : ι), HasStrictFDerivAt (fun x => f x i) (comp (EuclideanSpace.proj i) f') y
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_hasStrictFDerivAt_iff, hasStrictFDerivAt_pi']
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ (∀ (i : ι),
      HasStrictFDerivAt (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i)
        (comp (proj i) (comp (↑(EuclideanSpace.equiv ι 𝕜)) f')) y) ↔
    ∀ (i : ι), HasStrictFDerivAt (fun x => f x i) (comp (EuclideanSpace.proj i) f') y
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ HasFDerivWithinAt f f' t y ↔ ∀ (i : ι), HasFDerivWithinAt (fun x => f x i) (comp (EuclideanSpace.proj i) f') t y
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_hasFDerivWithinAt_iff, hasFDerivWithinAt_pi']
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
⊢ (∀ (i : ι),
      HasFDerivWithinAt (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i)
        (comp (proj i) (comp (↑(EuclideanSpace.equiv ι 𝕜)) f')) t y) ↔
    ∀ (i : ι), HasFDerivWithinAt (fun x => f x i) (comp (EuclideanSpace.proj i) f') t y
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ ContDiffWithinAt 𝕜 n f t y ↔ ∀ (i : ι), ContDiffWithinAt 𝕜 n (fun x => f x i) t y
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_contDiffWithinAt_iff, contDiffWithinAt_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ (∀ (i : ι), ContDiffWithinAt 𝕜 n (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) t y) ↔
    ∀ (i : ι), ContDiffWithinAt 𝕜 n (fun x => f x i) t y
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ ContDiffAt 𝕜 n f y ↔ ∀ (i : ι), ContDiffAt 𝕜 n (fun x => f x i) y
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_contDiffAt_iff, contDiffAt_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ (∀ (i : ι), ContDiffAt 𝕜 n (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) y) ↔
    ∀ (i : ι), ContDiffAt 𝕜 n (fun x => f x i) y
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ ContDiffOn 𝕜 n f t ↔ ∀ (i : ι), ContDiffOn 𝕜 n (fun x => f x i) t
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_contDiffOn_iff, contDiffOn_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ (∀ (i : ι), ContDiffOn 𝕜 n (fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) t) ↔
    ∀ (i : ι), ContDiffOn 𝕜 n (fun x => f x i) t
[PROOFSTEP]
rfl
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ ContDiff 𝕜 n f ↔ ∀ (i : ι), ContDiff 𝕜 n fun x => f x i
[PROOFSTEP]
rw [← (EuclideanSpace.equiv ι 𝕜).comp_contDiff_iff, contDiff_pi]
[GOAL]
𝕜 : Type u_1
ι : Type u_2
H : Type u_3
inst✝³ : IsROrC 𝕜
inst✝² : NormedAddCommGroup H
inst✝¹ : NormedSpace 𝕜 H
inst✝ : Fintype ι
f : H → EuclideanSpace 𝕜 ι
f' : H →L[𝕜] EuclideanSpace 𝕜 ι
t : Set H
y : H
n : ℕ∞
⊢ (∀ (i : ι), ContDiff 𝕜 n fun x => (↑(EuclideanSpace.equiv ι 𝕜) ∘ f) x i) ↔ ∀ (i : ι), ContDiff 𝕜 n fun x => f x i
[PROOFSTEP]
rfl
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
⊢ ContDiff ℝ n ↑univUnitBall
[PROOFSTEP]
suffices ContDiff ℝ n fun x : E => ((1 : ℝ) + ‖x‖ ^ 2).sqrt⁻¹ from this.smul contDiff_id
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
⊢ ContDiff ℝ n fun x => (sqrt (1 + ‖x‖ ^ 2))⁻¹
[PROOFSTEP]
have h : ∀ x : E, (0 : ℝ) < (1 : ℝ) + ‖x‖ ^ 2 := fun x => by positivity
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
x : E
⊢ 0 < 1 + ‖x‖ ^ 2
[PROOFSTEP]
positivity
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
h : ∀ (x : E), 0 < 1 + ‖x‖ ^ 2
⊢ ContDiff ℝ n fun x => (sqrt (1 + ‖x‖ ^ 2))⁻¹
[PROOFSTEP]
refine' ContDiff.inv _ fun x => Real.sqrt_ne_zero'.mpr (h x)
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
h : ∀ (x : E), 0 < 1 + ‖x‖ ^ 2
⊢ ContDiff ℝ n fun x => sqrt (1 + ‖x‖ ^ 2)
[PROOFSTEP]
exact (contDiff_const.add <| contDiff_norm_sq ℝ).sqrt fun x => (h x).ne'
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
y : E
hy : y ∈ ball 0 1
⊢ ContDiffWithinAt ℝ n (↑(LocalHomeomorph.symm univUnitBall)) (ball 0 1) y
[PROOFSTEP]
apply ContDiffAt.contDiffWithinAt
[GOAL]
case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
y : E
hy : y ∈ ball 0 1
⊢ ContDiffAt ℝ n (↑(LocalHomeomorph.symm univUnitBall)) y
[PROOFSTEP]
suffices ContDiffAt ℝ n (fun y : E => ((1 : ℝ) - ‖y‖ ^ 2).sqrt⁻¹) y from this.smul contDiffAt_id
[GOAL]
case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
y : E
hy : y ∈ ball 0 1
⊢ ContDiffAt ℝ n (fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹) y
[PROOFSTEP]
have h : (0 : ℝ) < (1 : ℝ) - ‖(y : E)‖ ^ 2 := by
  rwa [mem_ball_zero_iff, ← _root_.abs_one, ← abs_norm, ← sq_lt_sq, one_pow, ← sub_pos] at hy
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
y : E
hy : y ∈ ball 0 1
⊢ 0 < 1 - ‖y‖ ^ 2
[PROOFSTEP]
rwa [mem_ball_zero_iff, ← _root_.abs_one, ← abs_norm, ← sq_lt_sq, one_pow, ← sub_pos] at hy
[GOAL]
case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
y : E
hy : y ∈ ball 0 1
h : 0 < 1 - ‖y‖ ^ 2
⊢ ContDiffAt ℝ n (fun y => (sqrt (1 - ‖y‖ ^ 2))⁻¹) y
[PROOFSTEP]
refine' ContDiffAt.inv _ (Real.sqrt_ne_zero'.mpr h)
[GOAL]
case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
y : E
hy : y ∈ ball 0 1
h : 0 < 1 - ‖y‖ ^ 2
⊢ ContDiffAt ℝ n (fun y => sqrt (1 - ‖y‖ ^ 2)) y
[PROOFSTEP]
refine' (contDiffAt_sqrt h.ne').comp y _
[GOAL]
case h
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
y : E
hy : y ∈ ball 0 1
h : 0 < 1 - ‖y‖ ^ 2
⊢ ContDiffAt ℝ n (fun y => 1 - ‖y‖ ^ 2) y
[PROOFSTEP]
exact contDiffAt_const.sub (contDiff_norm_sq ℝ).contDiffAt
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
⊢ ContDiff ℝ n ↑(univBall c r)
[PROOFSTEP]
unfold univBall
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
⊢ ContDiff ℝ n
    ↑(if h : 0 < r then
        LocalHomeomorph.trans' univUnitBall (unitBallBall c r h)
          (_ : univUnitBall.toLocalEquiv.target = univUnitBall.toLocalEquiv.target)
      else Homeomorph.toLocalHomeomorph (IsometryEquiv.toHomeomorph (IsometryEquiv.vaddConst c)))
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
h : 0 < r
⊢ ContDiff ℝ n
    ↑(LocalHomeomorph.trans' univUnitBall (unitBallBall c r h)
        (_ : univUnitBall.toLocalEquiv.target = univUnitBall.toLocalEquiv.target))
[PROOFSTEP]
exact (contDiff_unitBallBall h).comp contDiff_univUnitBall
[GOAL]
case neg
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
h : ¬0 < r
⊢ ContDiff ℝ n ↑(Homeomorph.toLocalHomeomorph (IsometryEquiv.toHomeomorph (IsometryEquiv.vaddConst c)))
[PROOFSTEP]
exact contDiff_id.add contDiff_const
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
⊢ ContDiffOn ℝ n (↑(LocalHomeomorph.symm (univBall c r))) (ball c r)
[PROOFSTEP]
unfold univBall
[GOAL]
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
⊢ ContDiffOn ℝ n
    (↑(LocalHomeomorph.symm
        (if h : 0 < r then
          LocalHomeomorph.trans' univUnitBall (unitBallBall c r h)
            (_ : univUnitBall.toLocalEquiv.target = univUnitBall.toLocalEquiv.target)
        else Homeomorph.toLocalHomeomorph (IsometryEquiv.toHomeomorph (IsometryEquiv.vaddConst c)))))
    (ball c r)
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
h : 0 < r
⊢ ContDiffOn ℝ n
    (↑(LocalHomeomorph.symm
        (LocalHomeomorph.trans' univUnitBall (unitBallBall c r h)
          (_ : univUnitBall.toLocalEquiv.target = univUnitBall.toLocalEquiv.target))))
    (ball c r)
[PROOFSTEP]
refine contDiffOn_univUnitBall_symm.comp (contDiff_unitBallBall_symm h).contDiffOn ?_
[GOAL]
case pos
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
h : 0 < r
⊢ ball c r ⊆ (fun x => ↑(LocalEquiv.symm (unitBallBall c r h).toLocalEquiv) x) ⁻¹' ball 0 1
[PROOFSTEP]
rw [← unitBallBall_source c r h, ← unitBallBall_target c r h]
[GOAL]
case pos
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
h : 0 < r
⊢ (unitBallBall c r h).toLocalEquiv.target ⊆
    (fun x => ↑(LocalEquiv.symm (unitBallBall c r h).toLocalEquiv) x) ⁻¹' (unitBallBall c r h).toLocalEquiv.source
[PROOFSTEP]
apply LocalHomeomorph.symm_mapsTo
[GOAL]
case neg
n : ℕ∞
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
c : E
r : ℝ
h : ¬0 < r
⊢ ContDiffOn ℝ n
    (↑(LocalHomeomorph.symm (Homeomorph.toLocalHomeomorph (IsometryEquiv.toHomeomorph (IsometryEquiv.vaddConst c)))))
    (ball c r)
[PROOFSTEP]
exact contDiffOn_id.sub contDiffOn_const


[GOAL]
α : Type u_1
β : Type u_2
r : α → α → Prop
inst✝¹ : IsPreorder α r
inst✝ : Inhabited α
⊢ Inhabited (Antisymmetrization α r)
[PROOFSTEP]
unfold Antisymmetrization
[GOAL]
α : Type u_1
β : Type u_2
r : α → α → Prop
inst✝¹ : IsPreorder α r
inst✝ : Inhabited α
⊢ Inhabited (Quotient (AntisymmRel.setoid α r))
[PROOFSTEP]
infer_instance
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
a b : α
⊢ Relation.Fibration (fun x x_1 => x < x_1) (fun x x_1 => x < x_1) (toAntisymmetrization fun x x_1 => x ≤ x_1)
[PROOFSTEP]
rintro a ⟨b⟩ h
[GOAL]
case mk
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
a✝ b✝¹ a : α
b✝ : Antisymmetrization α fun x x_1 => x ≤ x_1
b : α
h : Quot.mk Setoid.r b < toAntisymmetrization (fun x x_1 => x ≤ x_1) a
⊢ ∃ a', (fun x x_1 => x < x_1) a' a ∧ toAntisymmetrization (fun x x_1 => x ≤ x_1) a' = Quot.mk Setoid.r b
[PROOFSTEP]
exact ⟨b, h, rfl⟩
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
a✝¹ b : α
a✝ : (Antisymmetrization α fun x x_1 => x ≤ x_1)ᵒᵈ
a : α
⊢ Quotient.map' id
      (_ :
        ∀ (x x_1 : αᵒᵈ),
          (fun x x_2 => x ≤ x_2) x x_1 ∧ (fun x x_2 => x ≤ x_2) x_1 x →
            (fun x x_2 => x ≤ x_2) x_1 x ∧ (fun x x_2 => x ≤ x_2) x x_1)
      (Quotient.map' id
        (_ :
          ∀ (x x_1 : α),
            (fun x x_2 => x ≤ x_2) x x_1 ∧ (fun x x_2 => x ≤ x_2) x_1 x →
              (fun x x_2 => x ≤ x_2) x_1 x ∧ (fun x x_2 => x ≤ x_2) x x_1)
        (Quotient.mk'' a)) =
    Quotient.mk'' a
[PROOFSTEP]
simp_rw [Quotient.map'_mk'', id]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : Preorder α
inst✝ : Preorder β
a✝¹ b : α
a✝ : Antisymmetrization αᵒᵈ fun x x_1 => x ≤ x_1
a : αᵒᵈ
⊢ Quotient.map' id
      (_ :
        ∀ (x x_1 : α),
          (fun x x_2 => x ≤ x_2) x x_1 ∧ (fun x x_2 => x ≤ x_2) x_1 x →
            (fun x x_2 => x ≤ x_2) x_1 x ∧ (fun x x_2 => x ≤ x_2) x x_1)
      (Quotient.map' id
        (_ :
          ∀ (x x_1 : αᵒᵈ),
            (fun x x_2 => x ≤ x_2) x x_1 ∧ (fun x x_2 => x ≤ x_2) x_1 x →
              (fun x x_2 => x ≤ x_2) x_1 x ∧ (fun x x_2 => x ≤ x_2) x x_1)
        (Quotient.mk'' a)) =
    Quotient.mk'' a
[PROOFSTEP]
simp_rw [Quotient.map'_mk'', id]


[GOAL]
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝⁹ : Semiring R
inst✝⁸ : Semiring R₂
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : Module R₂ M₂
inst✝³ : TopologicalSpace M
inst✝² : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝¹ : RingHomInvPair σ σ'
inst✝ : RingHomInvPair σ' σ
f : ι → M
φ : M →SL[σ] M₂
x : M
hf : HasSum f x
⊢ HasSum (fun b => ↑φ (f b)) (↑φ x)
[PROOFSTEP]
simpa only using hf.map φ.toLinearMap.toAddMonoidHom φ.continuous
[GOAL]
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝⁹ : Semiring R
inst✝⁸ : Semiring R₂
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : Module R₂ M₂
inst✝³ : TopologicalSpace M
inst✝² : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝¹ : RingHomInvPair σ σ'
inst✝ : RingHomInvPair σ' σ
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
h : HasSum (fun b => ↑e (f b)) y
⊢ HasSum f (↑(ContinuousLinearEquiv.symm e) y)
[PROOFSTEP]
simpa only [e.symm.coe_coe, e.symm_apply_apply] using h.mapL (e.symm : M₂ →SL[σ'] M)
[GOAL]
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝⁹ : Semiring R
inst✝⁸ : Semiring R₂
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : Module R₂ M₂
inst✝³ : TopologicalSpace M
inst✝² : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝¹ : RingHomInvPair σ σ'
inst✝ : RingHomInvPair σ' σ
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
h : HasSum f (↑(ContinuousLinearEquiv.symm e) y)
⊢ HasSum (fun b => ↑e (f b)) y
[PROOFSTEP]
simpa only [e.coe_coe, e.apply_symm_apply] using (e : M →SL[σ] M₂).hasSum h
[GOAL]
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝⁹ : Semiring R
inst✝⁸ : Semiring R₂
inst✝⁷ : AddCommMonoid M
inst✝⁶ : Module R M
inst✝⁵ : AddCommMonoid M₂
inst✝⁴ : Module R₂ M₂
inst✝³ : TopologicalSpace M
inst✝² : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝¹ : RingHomInvPair σ σ'
inst✝ : RingHomInvPair σ' σ
f : ι → M
e : M ≃SL[σ] M₂
x : M
⊢ HasSum (fun b => ↑e (f b)) (↑e x) ↔ HasSum f x
[PROOFSTEP]
rw [e.hasSum, ContinuousLinearEquiv.symm_apply_apply]
[GOAL]
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
⊢ ∑' (z : ι), ↑e (f z) = y ↔ ∑' (z : ι), f z = ↑(ContinuousLinearEquiv.symm e) y
[PROOFSTEP]
by_cases hf : Summable f
[GOAL]
case pos
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
hf : Summable f
⊢ ∑' (z : ι), ↑e (f z) = y ↔ ∑' (z : ι), f z = ↑(ContinuousLinearEquiv.symm e) y
[PROOFSTEP]
exact
  ⟨fun h => (e.hasSum.mp ((e.summable.mpr hf).hasSum_iff.mpr h)).tsum_eq, fun h =>
    (e.hasSum.mpr (hf.hasSum_iff.mpr h)).tsum_eq⟩
[GOAL]
case neg
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
hf : ¬Summable f
⊢ ∑' (z : ι), ↑e (f z) = y ↔ ∑' (z : ι), f z = ↑(ContinuousLinearEquiv.symm e) y
[PROOFSTEP]
have hf' : ¬Summable fun z => e (f z) := fun h => hf (e.summable.mp h)
[GOAL]
case neg
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
hf : ¬Summable f
hf' : ¬Summable fun z => ↑e (f z)
⊢ ∑' (z : ι), ↑e (f z) = y ↔ ∑' (z : ι), f z = ↑(ContinuousLinearEquiv.symm e) y
[PROOFSTEP]
rw [tsum_eq_zero_of_not_summable hf, tsum_eq_zero_of_not_summable hf']
[GOAL]
case neg
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
hf : ¬Summable f
hf' : ¬Summable fun z => ↑e (f z)
⊢ 0 = y ↔ 0 = ↑(ContinuousLinearEquiv.symm e) y
[PROOFSTEP]
refine ⟨?_, fun H => ?_⟩
[GOAL]
case neg.refine_1
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
hf : ¬Summable f
hf' : ¬Summable fun z => ↑e (f z)
⊢ 0 = y → 0 = ↑(ContinuousLinearEquiv.symm e) y
[PROOFSTEP]
rintro rfl
[GOAL]
case neg.refine_1
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
hf : ¬Summable f
hf' : ¬Summable fun z => ↑e (f z)
⊢ 0 = ↑(ContinuousLinearEquiv.symm e) 0
[PROOFSTEP]
simp
[GOAL]
case neg.refine_2
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
y : M₂
hf : ¬Summable f
hf' : ¬Summable fun z => ↑e (f z)
H : 0 = ↑(ContinuousLinearEquiv.symm e) y
⊢ 0 = y
[PROOFSTEP]
simpa using congr_arg (fun z => e z) H
[GOAL]
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
⊢ ↑e (∑' (z : ι), f z) = ∑' (z : ι), ↑e (f z)
[PROOFSTEP]
refine' symm (e.tsum_eq_iff.mpr _)
[GOAL]
ι : Type u_1
R : Type u_2
R₂ : Type u_3
M : Type u_4
M₂ : Type u_5
inst✝¹¹ : Semiring R
inst✝¹⁰ : Semiring R₂
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
inst✝⁷ : AddCommMonoid M₂
inst✝⁶ : Module R₂ M₂
inst✝⁵ : TopologicalSpace M
inst✝⁴ : TopologicalSpace M₂
σ : R →+* R₂
σ' : R₂ →+* R
inst✝³ : RingHomInvPair σ σ'
inst✝² : RingHomInvPair σ' σ
inst✝¹ : T2Space M
inst✝ : T2Space M₂
f : ι → M
e : M ≃SL[σ] M₂
⊢ ∑' (z : ι), f z = ↑(ContinuousLinearEquiv.symm e) (↑e (∑' (z : ι), f z))
[PROOFSTEP]
rw [e.symm_apply_apply _]