Theorem: NNReal.isGreatest_Lp
File: Mathlib/Analysis/MeanInequalities.lean

tactic: constructor
state_before: ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
⊢ IsGreatest ((fun g => ∑ i ∈ s, f i * g i) '' {g | ∑ i ∈ s, g i ^ q ≤ 1}) ((∑ i ∈ s, f i ^ p) ^ (1 / p))
state_after: case left
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / p) ∈ (fun g => ∑ i ∈ s, f i * g i) '' {g | ∑ i ∈ s, g i ^ q ≤ 1}

case right
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / p) ∈ upperBounds ((fun g => ∑ i ∈ s, f i * g i) '' {g | ∑ i ∈ s, g i ^ q ≤ 1})

tactic: use fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)
state_before: case left
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / p) ∈ (fun g => ∑ i ∈ s, f i * g i) '' {g | ∑ i ∈ s, g i ^ q ≤ 1}
state_after: case h
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)

tactic: by_cases hf : ∑ i ∈ s, f i ^ p = 0
state_before: case h
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: case pos
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ∑ i ∈ s, f i ^ p = 0
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)

case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)

tactic: simp [hf, hpq.ne_zero, hpq.symm.ne_zero]
state_before: case pos
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ∑ i ∈ s, f i ^ p = 0
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: no goals

tactic: have A : p + q - q ≠ 0 := by simp [hpq.ne_zero]
state_before: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)

tactic: have B : ∀ y : ℝ≥0, y * y ^ p / y = y ^ p := by
  refine fun y => mul_div_cancel_left_of_imp fun h => ?_
  simp [h, hpq.ne_zero]
state_before: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
B : ∀ (y : ℝ≥0), y * y ^ p / y = y ^ p
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)

tactic: simp only [Set.mem_setOf_eq, div_rpow, ← sum_div, ← rpow_mul,
  div_mul_cancel₀ _ hpq.symm.ne_zero, rpow_one, div_le_iff hf, one_mul, hpq.mul_eq_add, ←
  rpow_sub' _ A, add_sub_cancel_right, le_refl, true_and_iff, ← mul_div_assoc, B]
state_before: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
B : ∀ (y : ℝ≥0), y * y ^ p / y = y ^ p
⊢ (fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1} ∧
    ((fun g => ∑ i ∈ s, f i * g i) fun i => f i ^ p / f i / (∑ i ∈ s, f i ^ p) ^ (1 / q)) = (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
B : ∀ (y : ℝ≥0), y * y ^ p / y = y ^ p
⊢ (∑ i ∈ s, f i ^ p) / (∑ i ∈ s, f i ^ p) ^ (1 / q) = (∑ i ∈ s, f i ^ p) ^ (1 / p)

tactic: rw [div_eq_iff, ← rpow_add hf, one_div, one_div, hpq.inv_add_inv_conj, rpow_one]
state_before: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
B : ∀ (y : ℝ≥0), y * y ^ p / y = y ^ p
⊢ (∑ i ∈ s, f i ^ p) / (∑ i ∈ s, f i ^ p) ^ (1 / q) = (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
B : ∀ (y : ℝ≥0), y * y ^ p / y = y ^ p
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / q) ≠ 0

tactic: simpa [hpq.symm.ne_zero] using hf
state_before: case neg
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
B : ∀ (y : ℝ≥0), y * y ^ p / y = y ^ p
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / q) ≠ 0
state_after: no goals

tactic: simp [hpq.ne_zero]
state_before: ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
⊢ p + q - q ≠ 0
state_after: no goals

tactic: refine fun y => mul_div_cancel_left_of_imp fun h => ?_
state_before: ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
⊢ ∀ (y : ℝ≥0), y * y ^ p / y = y ^ p
state_after: ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
y : ℝ≥0
h : y = 0
⊢ y ^ p = 0

tactic: simp [h, hpq.ne_zero]
state_before: ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
hf : ¬∑ i ∈ s, f i ^ p = 0
A : p + q - q ≠ 0
y : ℝ≥0
h : y = 0
⊢ y ^ p = 0
state_after: no goals

tactic: rintro _ ⟨g, hg, rfl⟩
state_before: case right
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / p) ∈ upperBounds ((fun g => ∑ i ∈ s, f i * g i) '' {g | ∑ i ∈ s, g i ^ q ≤ 1})
state_after: case right.intro.intro
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
g : ι → ℝ≥0
hg : g ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1}
⊢ (fun g => ∑ i ∈ s, f i * g i) g ≤ (∑ i ∈ s, f i ^ p) ^ (1 / p)

tactic: apply le_trans (inner_le_Lp_mul_Lq s f g hpq)
state_before: case right.intro.intro
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
g : ι → ℝ≥0
hg : g ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1}
⊢ (fun g => ∑ i ∈ s, f i * g i) g ≤ (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: case right.intro.intro
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
g : ι → ℝ≥0
hg : g ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1}
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / p) * (∑ i ∈ s, g i ^ q) ^ (1 / q) ≤ (∑ i ∈ s, f i ^ p) ^ (1 / p)

tactic: simpa only [mul_one] using
  mul_le_mul_left' (NNReal.rpow_le_one hg (le_of_lt hpq.symm.one_div_pos)) _
state_before: case right.intro.intro
ι : Type u
s : Finset ι
f : ι → ℝ≥0
p q : ℝ
hpq : p.IsConjExponent q
g : ι → ℝ≥0
hg : g ∈ {g | ∑ i ∈ s, g i ^ q ≤ 1}
⊢ (∑ i ∈ s, f i ^ p) ^ (1 / p) * (∑ i ∈ s, g i ^ q) ^ (1 / q) ≤ (∑ i ∈ s, f i ^ p) ^ (1 / p)
state_after: no goals