Theorem: IsAdicComplete.le_jacobson_bot
File: Mathlib/LinearAlgebra/AdicCompletion.lean

tactic: intro x hx
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
⊢ I ≤ Ideal.jacobson ⊥

tactic: rw [← Ideal.neg_mem_iff, Ideal.mem_jacobson_bot]
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
⊢ x ∈ Ideal.jacobson ⊥

tactic: intro y
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
⊢ ∀ (y : R), IsUnit (-x * y + 1)

tactic: rw [add_comm]
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
⊢ IsUnit (-x * y + 1)

tactic: let f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
⊢ IsUnit (1 + -x * y)

tactic: have hf : ∀ m n, m ≤ n → f m ≡ f n [SMOD I ^ m • (⊤ : Submodule R R)] := by
  intro m n h
  simp only [Algebra.id.smul_eq_mul, Ideal.mul_top, SModEq.sub_mem]
  rw [← add_tsub_cancel_of_le h, Finset.sum_range_add, ← sub_sub, sub_self, zero_sub,
    @neg_mem_iff]
  apply Submodule.sum_mem
  intro n _
  rw [mul_pow, pow_add, mul_assoc]
  exact Ideal.mul_mem_right _ (I ^ m) (Ideal.pow_mem_pow hx m)
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
⊢ IsUnit (1 + -x * y)

tactic: obtain ⟨L, hL⟩ := IsPrecomplete.prec toIsPrecomplete @hf
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
⊢ IsUnit (1 + -x * y)

tactic: intro m n h
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
⊢ ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]

tactic: simp only [Algebra.id.smul_eq_mul, Ideal.mul_top, SModEq.sub_mem]
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
m n : ℕ
h : m ≤ n
⊢ f m ≡ f n [SMOD I ^ m • ⊤]

tactic: rw [← add_tsub_cancel_of_le h, Finset.sum_range_add, ← sub_sub, sub_self, zero_sub,
  @neg_mem_iff]
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
m n : ℕ
h : m ≤ n
⊢ ∑ i in range m, (x * y) ^ i - ∑ i in range n, (x * y) ^ i ∈ I ^ m

tactic: apply Submodule.sum_mem
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
m n : ℕ
h : m ≤ n
⊢ ∑ x_1 in range (n - m), (x * y) ^ (m + x_1) ∈ I ^ m

tactic: intro n _
state_before: case a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
m n : ℕ
h : m ≤ n
⊢ ∀ (c : ℕ), c ∈ range (n - m) → (x * y) ^ (m + c) ∈ I ^ m

tactic: rw [mul_pow, pow_add, mul_assoc]
state_before: case a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
m n✝ : ℕ
h : m ≤ n✝
n : ℕ
a✝ : n ∈ range (n✝ - m)
⊢ (x * y) ^ (m + n) ∈ I ^ m

tactic: exact Ideal.mul_mem_right _ (I ^ m) (Ideal.pow_mem_pow hx m)
state_before: case a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
m n✝ : ℕ
h : m ≤ n✝
n : ℕ
a✝ : n ∈ range (n✝ - m)
⊢ x ^ m * (x ^ n * y ^ (m + n)) ∈ I ^ m

tactic: rw [isUnit_iff_exists_inv]
state_before: case intro
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
hL : ∀ (n : ℕ), f n ≡ L [SMOD I ^ n • ⊤]
⊢ IsUnit (1 + -x * y)

tactic: use L
state_before: case intro
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
hL : ∀ (n : ℕ), f n ≡ L [SMOD I ^ n • ⊤]
⊢ ∃ b, (1 + -x * y) * b = 1

tactic: rw [← sub_eq_zero, neg_mul]
state_before: case intro
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
hL : ∀ (n : ℕ), f n ≡ L [SMOD I ^ n • ⊤]
⊢ (1 + -x * y) * L = 1

tactic: apply IsHausdorff.haus (toIsHausdorff : IsHausdorff I R)
state_before: case intro
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
hL : ∀ (n : ℕ), f n ≡ L [SMOD I ^ n • ⊤]
⊢ (1 + -(x * y)) * L - 1 = 0

tactic: intro n
state_before: case intro.a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
hL : ∀ (n : ℕ), f n ≡ L [SMOD I ^ n • ⊤]
⊢ ∀ (n : ℕ), (1 + -(x * y)) * L - 1 ≡ 0 [SMOD I ^ n • ⊤]

tactic: specialize hL n
state_before: case intro.a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
hL : ∀ (n : ℕ), f n ≡ L [SMOD I ^ n • ⊤]
n : ℕ
⊢ (1 + -(x * y)) * L - 1 ≡ 0 [SMOD I ^ n • ⊤]

tactic: rw [SModEq.sub_mem, Algebra.id.smul_eq_mul, Ideal.mul_top] at hL⊢
state_before: case intro.a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n : ℕ
hL : f n ≡ L [SMOD I ^ n • ⊤]
⊢ (1 + -(x * y)) * L - 1 ≡ 0 [SMOD I ^ n • ⊤]

tactic: rw [sub_zero]
state_before: case intro.a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n : ℕ
hL : f n - L ∈ I ^ n
⊢ (1 + -(x * y)) * L - 1 - 0 ∈ I ^ n

tactic: suffices (1 - x * y) * f n - 1 ∈ I ^ n by
  convert Ideal.sub_mem _ this (Ideal.mul_mem_left _ (1 + -(x * y)) hL) using 1
  ring
state_before: case intro.a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n : ℕ
hL : f n - L ∈ I ^ n
⊢ (1 + -(x * y)) * L - 1 ∈ I ^ n

tactic: cases n
state_before: case intro.a
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n : ℕ
hL : f n - L ∈ I ^ n
⊢ (1 - x * y) * f n - 1 ∈ I ^ n

tactic: convert Ideal.sub_mem _ this (Ideal.mul_mem_left _ (1 + -(x * y)) hL) using 1
state_before: R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n : ℕ
hL : f n - L ∈ I ^ n
this : (1 - x * y) * f n - 1 ∈ I ^ n
⊢ (1 + -(x * y)) * L - 1 ∈ I ^ n

tactic: ring
state_before: case h.e'_4
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n : ℕ
hL : f n - L ∈ I ^ n
this : (1 - x * y) * f n - 1 ∈ I ^ n
⊢ (1 + -(x * y)) * L - 1 = (1 - x * y) * f n - 1 - (1 + -(x * y)) * (f n - L)

tactic: simp only [Ideal.one_eq_top, pow_zero, Nat.zero_eq, mem_top]
state_before: case intro.a.zero
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
hL : f Nat.zero - L ∈ I ^ Nat.zero
⊢ (1 - x * y) * f Nat.zero - 1 ∈ I ^ Nat.zero

tactic: rw [← neg_sub _ (1 : R), neg_mul, mul_geom_sum, neg_sub, sub_sub, add_comm, ← sub_sub,
  sub_self, zero_sub, @neg_mem_iff, mul_pow]
state_before: case intro.a.succ
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n✝ : ℕ
hL : f (Nat.succ n✝) - L ∈ I ^ Nat.succ n✝
⊢ (1 - x * y) * f (Nat.succ n✝) - 1 ∈ I ^ Nat.succ n✝

tactic: exact Ideal.mul_mem_right _ (I ^ _) (Ideal.pow_mem_pow hx _)
state_before: case intro.a.succ
R : Type u_1
inst✝⁵ : CommRing R
I : Ideal R
M : Type ?u.289904
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type ?u.290446
inst✝² : AddCommGroup N
inst✝¹ : Module R N
inst✝ : IsAdicComplete I R
x : R
hx : x ∈ I
y : R
f : ℕ → R := fun n => ∑ i in range n, (x * y) ^ i
hf : ∀ (m n : ℕ), m ≤ n → f m ≡ f n [SMOD I ^ m • ⊤]
L : R
n✝ : ℕ
hL : f (Nat.succ n✝) - L ∈ I ^ Nat.succ n✝
⊢ x ^ Nat.succ n✝ * y ^ Nat.succ n✝ ∈ I ^ Nat.succ n✝