-- Mathlib/RingTheory/Polynomial/Basic.lean
theorem sup_aeval_range_eq_top_of_isCoprime (f : M →ₗ[R] M) {p q : R[X]} (hpq : IsCoprime p q) :
    LinearMap.range (aeval f p) ⊔ LinearMap.range (aeval f q) = ⊤

Proof state:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
hpq : IsCoprime p q
⊢ LinearMap.range ((aeval f) p) ⊔ LinearMap.range ((aeval f) q) = ⊤

Tactic:
rw [eq_top_iff]

Result:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
hpq : IsCoprime p q
⊢ ⊤ ≤ LinearMap.range ((aeval f) p) ⊔ LinearMap.range ((aeval f) q)

Proof state:
case intro.intro
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ∃ y ∈ LinearMap.range ((aeval f) p), ∃ z ∈ LinearMap.range ((aeval f) q), y + z = v

Tactic:
use aeval f (p * p') v

Result:
case h
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) (p * p')) v ∈ LinearMap.range ((aeval f) p) ∧
    ∃ z ∈ LinearMap.range ((aeval f) q), ((aeval f) (p * p')) v + z = v

Proof state:
case right
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ∃ z ∈ LinearMap.range ((aeval f) q), ((aeval f) (p * p')) v + z = v

Tactic:
use aeval f (q * q') v

Result:
case h
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) (q * q')) v ∈ LinearMap.range ((aeval f) q) ∧ ((aeval f) (p * p')) v + ((aeval f) (q * q')) v = v

Proof state:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
hpq : IsCoprime p q
v : M
a✝ : v ∈ ⊤
⊢ v ∈ LinearMap.range ((aeval f) p) ⊔ LinearMap.range ((aeval f) q)

Tactic:
rw [Submodule.mem_sup]

Result:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
hpq : IsCoprime p q
v : M
a✝ : v ∈ ⊤
⊢ ∃ y ∈ LinearMap.range ((aeval f) p), ∃ z ∈ LinearMap.range ((aeval f) q), y + z = v

Proof state:
case h
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) (p * p')) v ∈ LinearMap.range ((aeval f) p) ∧
    ∃ z ∈ LinearMap.range ((aeval f) q), ((aeval f) (p * p')) v + z = v

Tactic:
use LinearMap.mem_range.2 ⟨aeval f p' v, by simp only [LinearMap.mul_apply, aeval_mul]⟩

Result:
case right
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ∃ z ∈ LinearMap.range ((aeval f) q), ((aeval f) (p * p')) v + z = v

Proof state:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
hpq : IsCoprime p q
⊢ ⊤ ≤ LinearMap.range ((aeval f) p) ⊔ LinearMap.range ((aeval f) q)

Tactic:
intro v _

Result:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
hpq : IsCoprime p q
v : M
a✝ : v ∈ ⊤
⊢ v ∈ LinearMap.range ((aeval f) p) ⊔ LinearMap.range ((aeval f) q)

Proof state:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) q) (((aeval f) q') v) = ((aeval f) (q * q')) v

Tactic:
simp only [LinearMap.mul_apply, aeval_mul]

Result:
no goals

Proof state:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
hpq : IsCoprime p q
v : M
a✝ : v ∈ ⊤
⊢ ∃ y ∈ LinearMap.range ((aeval f) p), ∃ z ∈ LinearMap.range ((aeval f) q), y + z = v

Tactic:
rcases hpq with ⟨p', q', hpq'⟩

Result:
case intro.intro
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ∃ y ∈ LinearMap.range ((aeval f) p), ∃ z ∈ LinearMap.range ((aeval f) q), y + z = v

Proof state:
case right
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) (p * p')) v + ((aeval f) (q * q')) v = v

Tactic:
simpa only [mul_comm p p', mul_comm q q', aeval_one, aeval_add] using
  congr_arg (fun p : R[X] => aeval f p v) hpq'

Result:
no goals

Proof state:
case h
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) (q * q')) v ∈ LinearMap.range ((aeval f) q) ∧ ((aeval f) (p * p')) v + ((aeval f) (q * q')) v = v

Tactic:
use LinearMap.mem_range.2 ⟨aeval f q' v, by simp only [LinearMap.mul_apply, aeval_mul]⟩

Result:
case right
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) (p * p')) v + ((aeval f) (q * q')) v = v

Proof state:
R : Type u
M : Type w
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : M →ₗ[R] M
p q : R[X]
v : M
a✝ : v ∈ ⊤
p' q' : R[X]
hpq' : p' * p + q' * q = 1
⊢ ((aeval f) p) (((aeval f) p') v) = ((aeval f) (p * p')) v

Tactic:
simp only [LinearMap.mul_apply, aeval_mul]

Result:
no goals