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

tactic: calc
  _ ≤ ∑ UV ∈ P.sparsePairs G ε, ((G.interedges UV.1 UV.2).card : 𝕜) := mod_cast card_biUnion_le
  _ ≤ ∑ UV ∈ P.sparsePairs G ε, ε * (UV.1.card * UV.2.card) := ?_
  _ ≤ _ := sum_le_sum_of_subset_of_nonneg (filter_subset _ _) fun i _ _ ↦ by positivity
  _ = _ := (mul_sum _ _ _).symm
  _ ≤ _ := mul_le_mul_of_nonneg_left ?_ hε
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ε : 0 ≤ ε
⊢ ↑((P.sparsePairs G ε).biUnion fun x =>
          match x with
          | (U, V) => G.interedges U V).card ≤
    ε * (↑A.card + ↑P.parts.card) ^ 2
state_after: case 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ε : 0 ≤ ε
⊢ ∑ UV ∈ P.sparsePairs G ε, ↑(G.interedges UV.1 UV.2).card ≤ ∑ UV ∈ P.sparsePairs G ε, ε * (↑UV.1.card * ↑UV.2.card)

case 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ε : 0 ≤ ε
⊢ ∑ i ∈ P.parts.offDiag, ↑i.1.card * ↑i.2.card ≤ (↑A.card + ↑P.parts.card) ^ 2

tactic: norm_cast
state_before: case 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ε : 0 ≤ ε
⊢ ∑ i ∈ P.parts.offDiag, ↑i.1.card * ↑i.2.card ≤ (↑A.card + ↑P.parts.card) ^ 2
state_after: case 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ε : 0 ≤ ε
⊢ ∑ x ∈ P.parts.offDiag, x.1.card * x.2.card ≤ (A.card + P.parts.card) ^ 2

tactic: calc
  (_ : ℕ) ≤ _ := sum_le_card_nsmul P.parts.offDiag (fun i ↦ i.1.card * i.2.card)
          ((A.card / P.parts.card + 1)^2 : ℕ) ?_
  _ ≤ (P.parts.card * (A.card / P.parts.card) + P.parts.card) ^ 2 := ?_
  _ ≤ _ := Nat.pow_le_pow_of_le_left (add_le_add_right (Nat.mul_div_le _ _) _) _
state_before: case 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ε : 0 ≤ ε
⊢ ∑ x ∈ P.parts.offDiag, x.1.card * x.2.card ≤ (A.card + P.parts.card) ^ 2
state_after: case calc_2.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ε : 0 ≤ ε
⊢ ∀ x ∈ P.parts.offDiag, (fun i => i.1.card * i.2.card) x ≤ (A.card / P.parts.card + 1) ^ 2

case calc_2.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ε : 0 ≤ ε
⊢ P.parts.offDiag.card • (A.card / P.parts.card + 1) ^ 2 ≤ (P.parts.card * (A.card / P.parts.card) + P.parts.card) ^ 2

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ε : 0 ≤ ε
i : Finset α × Finset α
x✝¹ : i ∈ P.parts.offDiag
x✝ : i ∉ P.sparsePairs G ε
⊢ 0 ≤ ε * (↑i.1.card * ↑i.2.card)
state_after: no goals

tactic: gcongr with UV hUV
state_before: case 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ε : 0 ≤ ε
⊢ ∑ UV ∈ P.sparsePairs G ε, ↑(G.interedges UV.1 UV.2).card ≤ ∑ UV ∈ P.sparsePairs G ε, ε * (↑UV.1.card * ↑UV.2.card)
state_after: case calc_1.h
α : 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ε : 0 ≤ ε
UV : Finset α × Finset α
hUV : UV ∈ P.sparsePairs G ε
⊢ ↑(G.interedges UV.1 UV.2).card ≤ ε * (↑UV.1.card * ↑UV.2.card)

tactic: obtain ⟨U, V⟩ := UV
state_before: case calc_1.h
α : 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ε : 0 ≤ ε
UV : Finset α × Finset α
hUV : UV ∈ P.sparsePairs G ε
⊢ ↑(G.interedges UV.1 UV.2).card ≤ ε * (↑UV.1.card * ↑UV.2.card)
state_after: case calc_1.h.mk
α : 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ε : 0 ≤ ε
U V : Finset α
hUV : (U, V) ∈ P.sparsePairs G ε
⊢ ↑(G.interedges (U, V).1 (U, V).2).card ≤ ε * (↑(U, V).1.card * ↑(U, V).2.card)

tactic: simp [mk_mem_sparsePairs, ← card_interedges_div_card] at hUV
state_before: case calc_1.h.mk
α : 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ε : 0 ≤ ε
U V : Finset α
hUV : (U, V) ∈ P.sparsePairs G ε
⊢ ↑(G.interedges (U, V).1 (U, V).2).card ≤ ε * (↑(U, V).1.card * ↑(U, V).2.card)
state_after: case calc_1.h.mk
α : 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ε : 0 ≤ ε
U V : Finset α
hUV : U ∈ P.parts ∧ V ∈ P.parts ∧ ¬U = V ∧ ↑(G.interedges U V).card / (↑U.card * ↑V.card) < ε
⊢ ↑(G.interedges (U, V).1 (U, V).2).card ≤ ε * (↑(U, V).1.card * ↑(U, V).2.card)

tactic: refine ((div_lt_iff ?_).1 hUV.2.2.2).le
state_before: case calc_1.h.mk
α : 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ε : 0 ≤ ε
U V : Finset α
hUV : U ∈ P.parts ∧ V ∈ P.parts ∧ ¬U = V ∧ ↑(G.interedges U V).card / (↑U.card * ↑V.card) < ε
⊢ ↑(G.interedges (U, V).1 (U, V).2).card ≤ ε * (↑(U, V).1.card * ↑(U, V).2.card)
state_after: case calc_1.h.mk
α : 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ε : 0 ≤ ε
U V : Finset α
hUV : U ∈ P.parts ∧ V ∈ P.parts ∧ ¬U = V ∧ ↑(G.interedges U V).card / (↑U.card * ↑V.card) < ε
⊢ 0 < ↑U.card * ↑V.card

tactic: exact mul_pos (Nat.cast_pos.2 (P.nonempty_of_mem_parts hUV.1).card_pos)
  (Nat.cast_pos.2 (P.nonempty_of_mem_parts hUV.2.1).card_pos)
state_before: case calc_1.h.mk
α : 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ε : 0 ≤ ε
U V : Finset α
hUV : U ∈ P.parts ∧ V ∈ P.parts ∧ ¬U = V ∧ ↑(G.interedges U V).card / (↑U.card * ↑V.card) < ε
⊢ 0 < ↑U.card * ↑V.card
state_after: no goals

tactic: simp only [Prod.forall, Finpartition.mk_mem_nonUniforms, and_imp, mem_offDiag, sq]
state_before: case calc_2.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ε : 0 ≤ ε
⊢ ∀ x ∈ P.parts.offDiag, (fun i => i.1.card * i.2.card) x ≤ (A.card / P.parts.card + 1) ^ 2
state_after: case calc_2.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ε : 0 ≤ ε
⊢ ∀ (a b : Finset α),
    a ∈ P.parts → b ∈ P.parts → a ≠ b → a.card * b.card ≤ (A.card / P.parts.card + 1) * (A.card / P.parts.card + 1)

tactic: rintro U V hU hV -
state_before: case calc_2.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ε : 0 ≤ ε
⊢ ∀ (a b : Finset α),
    a ∈ P.parts → b ∈ P.parts → a ≠ b → a.card * b.card ≤ (A.card / P.parts.card + 1) * (A.card / P.parts.card + 1)
state_after: case calc_2.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ε : 0 ≤ ε
U V : Finset α
hU : U ∈ P.parts
hV : V ∈ P.parts
⊢ U.card * V.card ≤ (A.card / P.parts.card + 1) * (A.card / P.parts.card + 1)

tactic: exact_mod_cast Nat.mul_le_mul (hP.card_part_le_average_add_one hU)
  (hP.card_part_le_average_add_one hV)
state_before: case calc_2.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ε : 0 ≤ ε
U V : Finset α
hU : U ∈ P.parts
hV : V ∈ P.parts
⊢ U.card * V.card ≤ (A.card / P.parts.card + 1) * (A.card / P.parts.card + 1)
state_after: no goals

tactic: rw [smul_eq_mul, offDiag_card, Nat.mul_sub_right_distrib, ← sq, ← mul_pow, mul_add_one (α := ℕ)]
state_before: case calc_2.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ε : 0 ≤ ε
⊢ P.parts.offDiag.card • (A.card / P.parts.card + 1) ^ 2 ≤ (P.parts.card * (A.card / P.parts.card) + P.parts.card) ^ 2
state_after: case calc_2.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ε : 0 ≤ ε
⊢ (P.parts.card * (A.card / P.parts.card) + P.parts.card) ^ 2 - P.parts.card * (A.card / P.parts.card + 1) ^ 2 ≤
    (P.parts.card * (A.card / P.parts.card) + P.parts.card) ^ 2

tactic: exact Nat.sub_le _ _
state_before: case calc_2.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ε : 0 ≤ ε
⊢ (P.parts.card * (A.card / P.parts.card) + P.parts.card) ^ 2 - P.parts.card * (A.card / P.parts.card + 1) ^ 2 ≤
    (P.parts.card * (A.card / P.parts.card) + P.parts.card) ^ 2
state_after: no goals