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

Proof steps:
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: 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: 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: 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 ≤ ε
⊢ ∑ 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: 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 _ _) _) _