Theorem: _private.Mathlib.Combinatorics.Additive.PluenneckeRuzsa.0.Finset.card_add_nsmul_le
File: Mathlib/Combinatorics/Additive/PluenneckeRuzsa.lean

Proof steps:
state_before: α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
n : ℕ
⊢ ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
state_after: case inl
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
B C : Finset α
n : ℕ
hAB : ∀ A' ⊆ ∅, (∅ * B).card * A'.card ≤ (A' * B).card * ∅.card
⊢ ↑(∅ * B ^ n).card ≤ (↑(∅ * B).card / ↑∅.card) ^ n * ↑∅.card

case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
n : ℕ
hA : A.Nonempty
⊢ ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
tactic: obtain rfl | hA := A.eq_empty_or_nonempty
state_before: case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
n : ℕ
hA : A.Nonempty
⊢ ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
state_after: case inr.zero
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
⊢ ↑(A * B ^ 0).card ≤ (↑(A * B).card / ↑A.card) ^ 0 * ↑A.card

case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A * B ^ (n + 1)).card ≤ (↑(A * B).card / ↑A.card) ^ (n + 1) * ↑A.card
tactic: induction' n with n ih
state_before: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A * B ^ (n + 1)).card ≤ (↑(A * B).card / ↑A.card) ^ (n + 1) * ↑A.card
state_after: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A * B * B ^ n).card * A.card) ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)

case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ 0 < ↑A.card
tactic: rw [_root_.pow_succ', ← mul_assoc, _root_.pow_succ', @mul_assoc ℚ≥0, ← mul_div_right_comm,
    le_div_iff, ← cast_mul]
state_before: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A * B * B ^ n).card * A.card) ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)

case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ 0 < ↑A.card
state_after: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ 0 < ↑A.card

case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A * B * B ^ n).card * A.card) ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)
tactic: swap
state_before: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A * B * B ^ n).card * A.card) ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)
state_after: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A * B).card * (A * B ^ n).card) ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)
tactic: refine (Nat.cast_le.2 <| pluennecke_petridis_inequality_mul _ hAB).trans ?_
state_before: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A * B).card * (A * B ^ n).card) ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)
state_after: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A * B).card * ↑(A * B ^ n).card ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)
tactic: rw [cast_mul]
state_before: case inr.succ
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hAB : ∀ A' ⊆ A, (A * B).card * A'.card ≤ (A' * B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A * B ^ n).card ≤ (↑(A * B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A * B).card * ↑(A * B ^ n).card ≤ ↑(A * B).card * ((↑(A * B).card / ↑A.card) ^ n * ↑A.card)
state_after: no goals
tactic: gcongr