Theorem: Finpartition.IsEquipartition.card_biUnion_offDiag_le'
File: Mathlib/Combinatorics/SimpleGraph/Regularity/Uniform.lean

tactic: obtain h | h := P.parts.eq_empty_or_nonempty
state_before: α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
⊢ ↑(P.parts.biUnion offDiag).card ≤ ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card
state_after: case inl
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts = ∅
⊢ ↑(P.parts.biUnion offDiag).card ≤ ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card

case inr
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ ↑(P.parts.biUnion offDiag).card ≤ ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card

tactic: calc
  _ ≤ (P.parts.card : 𝕜) * (↑(A.card / P.parts.card) * ↑(A.card / P.parts.card + 1)) :=
      mod_cast card_biUnion_le_card_mul _ _ _ fun U hU ↦ ?_
  _ = P.parts.card * ↑(A.card / P.parts.card) * ↑(A.card / P.parts.card + 1) := by rw [mul_assoc]
  _ ≤ A.card * (A.card / P.parts.card + 1) :=
      mul_le_mul (mod_cast Nat.mul_div_le _ _) ?_ (by positivity) (by positivity)
  _ = _ := by rw [← div_add_same (mod_cast h.card_pos.ne'), mul_div_assoc]
state_before: case inr
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ ↑(P.parts.biUnion offDiag).card ≤ ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card
state_after: case inr.calc_1
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ ↑(A.card / P.parts.card + 1) ≤ ↑A.card / ↑P.parts.card + 1

case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
⊢ U.offDiag.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)

tactic: suffices (U.card - 1) * U.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1) by
  rwa [Nat.mul_sub_right_distrib, one_mul, ← offDiag_card] at this
state_before: case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
⊢ U.offDiag.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)
state_after: case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
⊢ (U.card - 1) * U.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)

tactic: have := hP.card_part_le_average_add_one hU
state_before: case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
⊢ (U.card - 1) * U.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)
state_after: case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
this : U.card ≤ A.card / P.parts.card + 1
⊢ (U.card - 1) * U.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)

tactic: refine Nat.mul_le_mul ((Nat.sub_le_sub_right this 1).trans ?_) this
state_before: case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
this : U.card ≤ A.card / P.parts.card + 1
⊢ (U.card - 1) * U.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)
state_after: case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
this : U.card ≤ A.card / P.parts.card + 1
⊢ A.card / P.parts.card + 1 - 1 ≤ A.card / P.parts.card

tactic: simp only [Nat.add_succ_sub_one, add_zero, card_univ, le_rfl]
state_before: case inr.calc_2
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
this : U.card ≤ A.card / P.parts.card + 1
⊢ A.card / P.parts.card + 1 - 1 ≤ A.card / P.parts.card
state_after: no goals

tactic: simp [h]
state_before: case inl
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts = ∅
⊢ ↑(P.parts.biUnion offDiag).card ≤ ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card
state_after: no goals

tactic: rw [mul_assoc]
state_before: α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ ↑P.parts.card * (↑(A.card / P.parts.card) * ↑(A.card / P.parts.card + 1)) =
    ↑P.parts.card * ↑(A.card / P.parts.card) * ↑(A.card / P.parts.card + 1)
state_after: no goals

tactic: positivity
state_before: α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ 0 ≤ ↑(A.card / P.parts.card + 1)
state_after: no goals

tactic: positivity
state_before: α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ 0 ≤ ↑A.card
state_after: no goals

tactic: rw [← div_add_same (mod_cast h.card_pos.ne'), mul_div_assoc]
state_before: α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ ↑A.card * (↑A.card / ↑P.parts.card + 1) = ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card
state_after: no goals

tactic: simpa using Nat.cast_div_le
state_before: case inr.calc_1
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
⊢ ↑(A.card / P.parts.card + 1) ≤ ↑A.card / ↑P.parts.card + 1
state_after: no goals

tactic: rwa [Nat.mul_sub_right_distrib, one_mul, ← offDiag_card] at this
state_before: α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
A : Finset α
P : Finpartition A
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hP : P.IsEquipartition
h : P.parts.Nonempty
U : Finset α
hU : U ∈ P.parts
this : (U.card - 1) * U.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)
⊢ U.offDiag.card ≤ A.card / P.parts.card * (A.card / P.parts.card + 1)
state_after: no goals