Theorem: Finpartition.modPartitions_parts_eq (LeanCamCombi/Mathlib/Order/Partition/Finpartition.lean)

State before:
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
⊢ (modPartitions s d hd h).parts = image (fun i => image (fun x => i + d * x) (range ((s - i - 1) / d + 1))) (range d)
Tactic:
rw [modPartitions]
State after:
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
⊢ { parts := image (fun i => filter (fun j => j % d = i) (range s)) (range d), supIndep := ⋯, sup_parts := ⋯,
        not_bot_mem := ⋯ }.parts =
    image (fun i => image (fun x => i + d * x) (range ((s - i - 1) / d + 1))) (range d)

State before:
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
⊢ { parts := image (fun i => filter (fun j => j % d = i) (range s)) (range d), supIndep := ⋯, sup_parts := ⋯,
        not_bot_mem := ⋯ }.parts =
    image (fun i => image (fun x => i + d * x) (range ((s - i - 1) / d + 1))) (range d)
Tactic:
ext x
State after:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
⊢ x ∈
      { parts := image (fun i => filter (fun j => j % d = i) (range s)) (range d), supIndep := ⋯, sup_parts := ⋯,
          not_bot_mem := ⋯ }.parts ↔
    x ∈ image (fun i => image (fun x => i + d * x) (range ((s - i - 1) / d + 1))) (range d)

State before:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
⊢ x ∈
      { parts := image (fun i => filter (fun j => j % d = i) (range s)) (range d), supIndep := ⋯, sup_parts := ⋯,
          not_bot_mem := ⋯ }.parts ↔
    x ∈ image (fun i => image (fun x => i + d * x) (range ((s - i - 1) / d + 1))) (range d)
Tactic:
simp only [mem_image, mem_range]
State after:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
⊢ (∃ a < d, filter (fun j => j % d = a) (range s) = x) ↔
    ∃ a < d, image (fun x => a + d * x) (range ((s - a - 1) / d + 1)) = x

State before:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
⊢ (∃ a < d, filter (fun j => j % d = a) (range s) = x) ↔
    ∃ a < d, image (fun x => a + d * x) (range ((s - a - 1) / d + 1)) = x
Tactic:
refine' exists_congr fun i ↦ and_congr_right fun hi ↦ _
State after:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
i : ℕ
hi : i < d
⊢ filter (fun j => j % d = i) (range s) = x ↔ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = x

State before:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
i : ℕ
hi : i < d
⊢ filter (fun j => j % d = i) (range s) = x ↔ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = x
Tactic:
suffices
  ((range ((s - i - 1) / d + 1)).image fun x ↦ i + d * x) = (range s).filter fun j ↦ j % d = i
  by rw [this]
State after:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
i : ℕ
hi : i < d
⊢ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = filter (fun j => j % d = i) (range s)

State before:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
i : ℕ
hi : i < d
⊢ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = filter (fun j => j % d = i) (range s)
Tactic:
clear x
State after:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
⊢ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = filter (fun j => j % d = i) (range s)

State before:
case a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
⊢ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = filter (fun j => j % d = i) (range s)
Tactic:
ext j
State after:
case a.a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ j ∈ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) ↔ j ∈ filter (fun j => j % d = i) (range s)

State before:
case a.a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ j ∈ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) ↔ j ∈ filter (fun j => j % d = i) (range s)
Tactic:
simp only [mem_image, mem_filter, mem_range, Nat.lt_add_one_iff]
State after:
case a.a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ (∃ a ≤ (s - i - 1) / d, i + d * a = j) ↔ j < s ∧ j % d = i

State before:
case a.a
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ (∃ a ≤ (s - i - 1) / d, i + d * a = j) ↔ j < s ∧ j % d = i
Tactic:
constructor
State after:
case a.a.mp
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ (∃ a ≤ (s - i - 1) / d, i + d * a = j) → j < s ∧ j % d = i

case a.a.mpr
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ j < s ∧ j % d = i → ∃ a ≤ (s - i - 1) / d, i + d * a = j

State before:
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
x : Finset ℕ
i : ℕ
hi : i < d
this : image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = filter (fun j => j % d = i) (range s)
⊢ filter (fun j => j % d = i) (range s) = x ↔ image (fun x => i + d * x) (range ((s - i - 1) / d + 1)) = x
Tactic:
rw [this]
State after:
no goals

State before:
case a.a.mp
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ (∃ a ≤ (s - i - 1) / d, i + d * a = j) → j < s ∧ j % d = i
Tactic:
rintro ⟨j, hj, rfl⟩
State after:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j ≤ (s - i - 1) / d
⊢ i + d * j < s ∧ (i + d * j) % d = i

State before:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j ≤ (s - i - 1) / d
⊢ i + d * j < s ∧ (i + d * j) % d = i
Tactic:
rw [Nat.add_mul_mod_self_left, Nat.mod_eq_of_lt hi, eq_self_iff_true, and_true_iff, ←
  Nat.lt_sub_iff_add_lt', mul_comm]
State after:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j ≤ (s - i - 1) / d
⊢ j * d < s - i

State before:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j ≤ (s - i - 1) / d
⊢ j * d < s - i
Tactic:
rwa [Nat.le_div_iff_mul_le hd.bot_lt, Nat.le_sub_iff_add_le, Nat.succ_le_iff] at hj
State after:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j * d ≤ s - i - 1
⊢ 1 ≤ s - i

State before:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j * d ≤ s - i - 1
⊢ 1 ≤ s - i
Tactic:
rw [Nat.succ_le_iff]
State after:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j * d ≤ s - i - 1
⊢ 0 < s - i

State before:
case a.a.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
hj : j * d ≤ s - i - 1
⊢ 0 < s - i
Tactic:
exact Nat.sub_pos_of_lt (hi.trans_le h)
State after:
no goals

State before:
case a.a.mpr
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
i : ℕ
hi : i < d
j : ℕ
⊢ j < s ∧ j % d = i → ∃ a ≤ (s - i - 1) / d, i + d * a = j
Tactic:
rintro ⟨hj, rfl⟩
State after:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ ∃ a ≤ (s - j % d - 1) / d, j % d + d * a = j

State before:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ ∃ a ≤ (s - j % d - 1) / d, j % d + d * a = j
Tactic:
refine' ⟨j / d, _, Nat.mod_add_div _ _⟩
State after:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ j / d ≤ (s - j % d - 1) / d

State before:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ j / d ≤ (s - j % d - 1) / d
Tactic:
rwa [Nat.le_div_iff_mul_le' hd.bot_lt, Nat.le_sub_iff_add_le, Nat.le_sub_iff_add_le',
  ← add_assoc, mul_comm, Nat.mod_add_div, Nat.add_one_le_iff]
State after:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ j % d ≤ s

case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ 1 ≤ s - j % d

State before:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ 1 ≤ s - j % d
Tactic:
rw [Nat.succ_le_iff]
State after:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ 0 < s - j % d

State before:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ 0 < s - j % d
Tactic:
exact Nat.sub_pos_of_lt (hi.trans_le h)
State after:
no goals

State before:
case a.a.mpr.intro
α : Type u_1
β : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s d : ℕ
hd : d ≠ 0
h : d ≤ s
j : ℕ
hj : j < s
hi : j % d < d
⊢ j % d ≤ s
Tactic:
exact hi.le.trans h
State after:
no goals