Theorem: Int.Matrix.image_T_subset_S
File: Mathlib/NumberTheory/SiegelsLemma.lean

tactic: rw [mem_Icc] at hv ⊢
state_before: m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : v ∈ T
⊢ A *ᵥ v ∈ S
state_after: m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
⊢ N ≤ A *ᵥ v ∧ A *ᵥ v ≤ P

tactic: have mulVec_def : A.mulVec v =
    fun i ↦ Finset.sum univ fun j : Fin n ↦ A i j * v j := rfl
state_before: m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
⊢ N ≤ A *ᵥ v ∧ A *ᵥ v ≤ P
state_after: m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
⊢ N ≤ A *ᵥ v ∧ A *ᵥ v ≤ P

tactic: rw [mulVec_def]
state_before: m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
⊢ N ≤ A *ᵥ v ∧ A *ᵥ v ≤ P
state_after: m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
⊢ (N ≤ fun i => ∑ j : Fin n, A i j * v j) ∧ (fun i => ∑ j : Fin n, A i j * v j) ≤ P

tactic: refine ⟨fun i ↦ ?_, fun i ↦ ?_⟩
state_before: m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
⊢ (N ≤ fun i => ∑ j : Fin n, A i j * v j) ∧ (fun i => ∑ j : Fin n, A i j * v j) ≤ P
state_after: case refine_1
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
⊢ N i ≤ (fun i => ∑ j : Fin n, A i j * v j) i

case refine_2
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
⊢ (fun i => ∑ j : Fin n, A i j * v j) i ≤ P i

tactic: all_goals
  simp only [mul_neg]
  gcongr ∑ _ : Fin n, ?_ with j _ rw [← mul_comm (v j)] rcases le_total 0 (A i j) with hsign | hsign
state_before: case refine_1
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
⊢ N i ≤ (fun i => ∑ j : Fin n, A i j * v j) i

case refine_2
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
⊢ (fun i => ∑ j : Fin n, A i j * v j) i ≤ P i
state_after: case refine_1.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ -(↑B * (A i j)⁻) ≤ v j * A i j

case refine_1.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ -(↑B * (A i j)⁻) ≤ v j * A i j

case refine_2.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ v j * A i j ≤ ↑B * (A i j)⁺

case refine_2.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ v j * A i j ≤ ↑B * (A i j)⁺

tactic: simp only [mul_neg]
state_before: case refine_2
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
⊢ (fun i => ∑ j : Fin n, A i j * v j) i ≤ P i
state_after: case refine_2
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
⊢ ∑ j : Fin n, A i j * v j ≤ ∑ j : Fin n, ↑B * (A i j)⁺

tactic: gcongr ∑ _ : Fin n, ?_ with j _
state_before: case refine_2
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
⊢ ∑ j : Fin n, A i j * v j ≤ ∑ j : Fin n, ↑B * (A i j)⁺
state_after: case refine_2.h
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
⊢ A i j * v j ≤ ↑B * (A i j)⁺

tactic: rw [← mul_comm (v j)]
state_before: case refine_2.h
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
⊢ A i j * v j ≤ ↑B * (A i j)⁺
state_after: case refine_2.h
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
⊢ v j * A i j ≤ ↑B * (A i j)⁺

tactic: rcases le_total 0 (A i j) with hsign | hsign
state_before: case refine_2.h
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
⊢ v j * A i j ≤ ↑B * (A i j)⁺
state_after: case refine_2.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ v j * A i j ≤ ↑B * (A i j)⁺

case refine_2.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ v j * A i j ≤ ↑B * (A i j)⁺

tactic: rw [negPart_eq_zero.2 hsign]
state_before: case refine_1.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ -(↑B * (A i j)⁻) ≤ v j * A i j
state_after: case refine_1.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ -(↑B * 0) ≤ v j * A i j

tactic: exact mul_nonneg (hv.1 j) hsign
state_before: case refine_1.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ -(↑B * 0) ≤ v j * A i j
state_after: no goals

tactic: rw [negPart_eq_neg.2 hsign]
state_before: case refine_1.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ -(↑B * (A i j)⁻) ≤ v j * A i j
state_after: case refine_1.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ -(↑B * -A i j) ≤ v j * A i j

tactic: simp only [mul_neg, neg_neg]
state_before: case refine_1.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ -(↑B * -A i j) ≤ v j * A i j
state_after: case refine_1.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ ↑B * A i j ≤ v j * A i j

tactic: exact mul_le_mul_of_nonpos_right (hv.2 j) hsign
state_before: case refine_1.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ ↑B * A i j ≤ v j * A i j
state_after: no goals

tactic: rw [posPart_eq_self.2 hsign]
state_before: case refine_2.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ v j * A i j ≤ ↑B * (A i j)⁺
state_after: case refine_2.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ v j * A i j ≤ ↑B * A i j

tactic: exact mul_le_mul_of_nonneg_right (hv.2 j) hsign
state_before: case refine_2.h.inl
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : 0 ≤ A i j
⊢ v j * A i j ≤ ↑B * A i j
state_after: no goals

tactic: rw [posPart_eq_zero.2 hsign]
state_before: case refine_2.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ v j * A i j ≤ ↑B * (A i j)⁺
state_after: case refine_2.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ v j * A i j ≤ ↑B * 0

tactic: exact mul_nonpos_of_nonneg_of_nonpos (hv.1 j) hsign
state_before: case refine_2.h.inr
m n : ℕ
A : Matrix (Fin m) (Fin n) ℤ
v✝ : Fin n → ℤ
hn : m < n
hm : 0 < m
v : Fin n → ℤ
hv : 0 ≤ v ∧ v ≤ B'
mulVec_def : A *ᵥ v = fun i => ∑ j : Fin n, A i j * v j
i : Fin m
j : Fin n
a✝ : j ∈ univ
hsign : A i j ≤ 0
⊢ v j * A i j ≤ ↑B * 0
state_after: no goals