Theorem: bind₁_rename_expand_wittPolynomial
File: Mathlib/RingTheory/WittVector/StructurePolynomial.lean

tactic: apply MvPolynomial.map_injective (Int.castRingHom ℚ) Int.cast_injective
state_before: p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
⊢ ↑(bind₁ fun b => ↑(rename fun i => (b, i)) (↑(expand p) (W_ ℤ n))) Φ =
    ↑(bind₁ fun i => ↑(expand p) (wittStructureInt p Φ i)) (W_ ℤ n)

tactic: simp only [map_bind₁, map_rename, map_expand, rename_expand, map_wittPolynomial]
state_before: case a
p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
⊢ ↑(map (Int.castRingHom ℚ)) (↑(bind₁ fun b => ↑(rename fun i => (b, i)) (↑(expand p) (W_ ℤ n))) Φ) =
    ↑(map (Int.castRingHom ℚ)) (↑(bind₁ fun i => ↑(expand p) (wittStructureInt p Φ i)) (W_ ℤ n))

tactic: have key := (wittStructureRat_prop p (map (Int.castRingHom ℚ) Φ) n).symm
state_before: case a
p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
⊢ ↑(bind₁ fun i => ↑(expand p) (↑(rename fun i_1 => (i, i_1)) (W_ ℚ n))) (↑(map (Int.castRingHom ℚ)) Φ) =
    ↑(bind₁ fun i => ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))) (W_ ℚ n)

tactic: apply_fun expand p  at key
state_before: case a
p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
key :
  ↑(bind₁ fun i => ↑(rename (Prod.mk i)) (W_ ℚ n)) (↑(map (Int.castRingHom ℚ)) Φ) =
    ↑(bind₁ (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ))) (W_ ℚ n)
⊢ ↑(bind₁ fun i => ↑(expand p) (↑(rename fun i_1 => (i, i_1)) (W_ ℚ n))) (↑(map (Int.castRingHom ℚ)) Φ) =
    ↑(bind₁ fun i => ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))) (W_ ℚ n)

tactic: simp only [expand_bind₁] at key
state_before: case a
p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
key :
  ↑(expand p) (↑(bind₁ fun i => ↑(rename (Prod.mk i)) (W_ ℚ n)) (↑(map (Int.castRingHom ℚ)) Φ)) =
    ↑(expand p) (↑(bind₁ (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ))) (W_ ℚ n))
⊢ ↑(bind₁ fun i => ↑(expand p) (↑(rename fun i_1 => (i, i_1)) (W_ ℚ n))) (↑(map (Int.castRingHom ℚ)) Φ) =
    ↑(bind₁ fun i => ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))) (W_ ℚ n)

tactic: rw [key]
state_before: case a
p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
key :
  ↑(bind₁ fun i => ↑(expand p) (↑(rename (Prod.mk i)) (W_ ℚ n))) (↑(map (Int.castRingHom ℚ)) Φ) =
    ↑(bind₁ fun i => ↑(expand p) (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) i)) (W_ ℚ n)
⊢ ↑(bind₁ fun i => ↑(expand p) (↑(rename fun i_1 => (i, i_1)) (W_ ℚ n))) (↑(map (Int.castRingHom ℚ)) Φ) =
    ↑(bind₁ fun i => ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))) (W_ ℚ n)

tactic: clear key
state_before: case a
p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
key :
  ↑(bind₁ fun i => ↑(expand p) (↑(rename (Prod.mk i)) (W_ ℚ n))) (↑(map (Int.castRingHom ℚ)) Φ) =
    ↑(bind₁ fun i => ↑(expand p) (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) i)) (W_ ℚ n)
⊢ ↑(bind₁ fun i => ↑(expand p) (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) i)) (W_ ℚ n) =
    ↑(bind₁ fun i => ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))) (W_ ℚ n)

tactic: apply eval₂Hom_congr' rfl _ rfl
state_before: case a
p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
⊢ ↑(bind₁ fun i => ↑(expand p) (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) i)) (W_ ℚ n) =
    ↑(bind₁ fun i => ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))) (W_ ℚ n)

tactic: rintro i hi -
state_before: p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
⊢ ∀ (i : ℕ),
    i ∈ vars (W_ ℚ n) →
      i ∈ vars (W_ ℚ n) →
        ↑(expand p) (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) i) =
          ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))

tactic: rw [wittPolynomial_vars, Finset.mem_range] at hi
state_before: p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
i : ℕ
hi : i ∈ vars (W_ ℚ n)
⊢ ↑(expand p) (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) i) =
    ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))

tactic: simp only [IH i hi]
state_before: p : ℕ
R : Type ?u.755142
idx : Type u_1
inst✝ : CommRing R
hp : Fact (Nat.Prime p)
Φ : MvPolynomial idx ℤ
n : ℕ
IH :
  ∀ (m : ℕ),
    m < n + 1 →
      ↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ m) = wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) m
i : ℕ
hi : i < n + 1
⊢ ↑(expand p) (wittStructureRat p (↑(map (Int.castRingHom ℚ)) Φ) i) =
    ↑(expand p) (↑(map (Int.castRingHom ℚ)) (wittStructureInt p Φ i))