-- Mathlib/RingTheory/Adjoin/PowerBasis.lean
theorem repr_gen_pow_isIntegral (hB : IsIntegral R B.gen) [IsDomain S]
    (hmin : minpoly S B.gen = (minpoly R B.gen).map (algebraMap R S)) (n : ℕ) :
    ∀ i, IsIntegral R (B.basis.repr (B.gen ^ n) i)

Proof state:
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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
⊢ Q.degree < (minpoly R B.gen).degree

Tactic:
exact degree_modByMonic_lt _ (minpoly.monic hB)

Result:
no goals

Proof state:
case pos
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
j : ℕ
hj : j < B.dim
hij : ⟨j, hj⟩ = i
⊢ IsIntegral R ((algebraMap R S) (Q.coeff j))

Tactic:
exact isIntegral_algebraMap

Result:
no goals

Proof state:
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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)

Tactic:
intro i

Result:
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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)

Proof state:
case neg
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
⊢ IsIntegral R ((B.basis.repr (∑ i ∈ Finset.range B.dim, Q.coeff i • B.gen ^ i)) i)

Tactic:
simp only [map_sum, LinearEquiv.map_smulₛₗ, RingHom.id_apply, Finset.sum_apply']

Result:
case neg
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
⊢ IsIntegral R (∑ k ∈ Finset.range B.dim, (B.basis.repr (Q.coeff k • B.gen ^ k)) i)

Proof state:
case neg
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
j : ℕ
hj : j ∈ Finset.range B.dim
⊢ IsIntegral R ((B.basis.repr (Q.coeff j • B.gen ^ j)) i)

Tactic:
replace hj := Finset.mem_range.1 hj

Result:
case neg
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
j : ℕ
hj : j < B.dim
⊢ IsIntegral R ((B.basis.repr (Q.coeff j • B.gen ^ j)) i)

Proof state:
case neg
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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)

Tactic:
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)

Result:
case neg
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
⊢ IsIntegral R ((B.basis.repr (B.gen ^ n)) i)

Proof state:
case pos
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
j : ℕ
hj : j < B.dim
hij : ⟨j, hj⟩ = i
⊢ IsIntegral R (Q.coeff j • if ⟨j, hj⟩ = i then 1 else 0)

Tactic:
simp only [hij, eq_self_iff_true, if_true]

Result:
case pos
S : Type u_2
inst✝⁷ : CommRing S
R : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : Algebra R 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 : Q.natDegree < B.dim
j : ℕ
hj : j < B.dim
hij : ⟨j, hj⟩ = i
⊢ IsIntegral R (Q.coeff j • 1)