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

tactic: obtain rfl | hA : A = ⊥ ∨ _ := A.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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
⊢ ↑(P.parts.biUnion offDiag).card ≤ ε / 2 * ↑A.card ^ 2
state_after: case inl
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hε : 0 < ε
P : Finpartition ⊥
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
⊢ ↑(P.parts.biUnion offDiag).card ≤ ε / 2 * ↑⊥.card ^ 2

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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑(P.parts.biUnion offDiag).card ≤ ε / 2 * ↑A.card ^ 2

tactic: apply hP.card_biUnion_offDiag_le'.trans
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑(P.parts.biUnion offDiag).card ≤ ε / 2 * ↑A.card ^ 2
state_after: 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card ≤ ε / 2 * ↑A.card ^ 2

tactic: rw [div_le_iff (Nat.cast_pos.2 (P.parts_nonempty hA.ne_empty).card_pos)]
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑A.card * (↑A.card + ↑P.parts.card) / ↑P.parts.card ≤ ε / 2 * ↑A.card ^ 2
state_after: 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑A.card * (↑A.card + ↑P.parts.card) ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card

tactic: have : (A.card : 𝕜) + P.parts.card ≤ 2 * A.card := by
  rw [two_mul]; exact add_le_add_left (Nat.cast_le.2 P.card_parts_le_card) _
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑A.card * (↑A.card + ↑P.parts.card) ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card
state_after: 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ ↑A.card * (↑A.card + ↑P.parts.card) ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card

tactic: refine (mul_le_mul_of_nonneg_left this $ by positivity).trans ?_
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ ↑A.card * (↑A.card + ↑P.parts.card) ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card
state_after: 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ ↑A.card * (2 * ↑A.card) ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card

tactic: suffices 1 ≤ ε/4 * P.parts.card by
  rw [mul_left_comm, ← sq]
  convert mul_le_mul_of_nonneg_left this (mul_nonneg zero_le_two $ sq_nonneg (A.card : 𝕜))
    using 1 <;> ring
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ ↑A.card * (2 * ↑A.card) ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card
state_after: 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ 1 ≤ ε / 4 * ↑P.parts.card

tactic: rwa [← div_le_iff', one_div_div]
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ 1 ≤ ε / 4 * ↑P.parts.card
state_after: 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ 0 < ε / 4

tactic: positivity
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ 0 < ε / 4
state_after: no goals

tactic: simp [Subsingleton.elim P ⊥]
state_before: case inl
α : Type u_1
𝕜 : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
G : SimpleGraph α
inst✝ : DecidableRel G.Adj
ε δ : 𝕜
u v s t : Finset α
hε : 0 < ε
P : Finpartition ⊥
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
⊢ ↑(P.parts.biUnion offDiag).card ≤ ε / 2 * ↑⊥.card ^ 2
state_after: no goals

tactic: rw [two_mul]
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
state_after: α : 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑A.card + ↑P.parts.card ≤ ↑A.card + ↑A.card

tactic: exact add_le_add_left (Nat.cast_le.2 P.card_parts_le_card) _
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
⊢ ↑A.card + ↑P.parts.card ≤ ↑A.card + ↑A.card
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
⊢ 0 ≤ ↑A.card
state_after: no goals

tactic: rw [mul_left_comm, ← sq]
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this✝ : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
this : 1 ≤ ε / 4 * ↑P.parts.card
⊢ ↑A.card * (2 * ↑A.card) ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card
state_after: α : 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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this✝ : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
this : 1 ≤ ε / 4 * ↑P.parts.card
⊢ 2 * ↑A.card ^ 2 ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card

tactic: convert mul_le_mul_of_nonneg_left this (mul_nonneg zero_le_two $ sq_nonneg (A.card : 𝕜))
  using 1 <;> ring
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 α
hε : 0 < ε
hP : P.IsEquipartition
hP' : 4 / ε ≤ ↑P.parts.card
hA : A.Nonempty
this✝ : ↑A.card + ↑P.parts.card ≤ 2 * ↑A.card
this : 1 ≤ ε / 4 * ↑P.parts.card
⊢ 2 * ↑A.card ^ 2 ≤ ε / 2 * ↑A.card ^ 2 * ↑P.parts.card
state_after: no goals