feat: integral presentation of the proximity function of value distribution theory#38500
feat: integral presentation of the proximity function of value distribution theory#38500kebekus wants to merge 10 commits into
Conversation
PR summary 7f007d8a78Import changes for modified filesNo significant changes to the import graph Import changes for all files
|
Co-authored-by: Weiyi Wang <wwylele@gmail.com>
|
@wwylele Thank you for your helpful comments. I implemented all of them. |
j-loreaux
left a comment
There was a problem hiding this comment.
looks pretty good!
The main thing I would have looked for here is where the automation could have been better. fun_prop was able to do some things, as was positivity, but it's important to try and make them work for you by tagging the correct lemmas, for example.
|
|
||
| private lemma integral_norm_eq_two_mul_integral_max_sub | ||
| {α : Type*} [MeasurableSpace α] {μ : Measure α} {g : α → ℝ} | ||
| (hg : Integrable g μ) (hmax : Integrable (fun x ↦ max (g x) 0) μ) : |
There was a problem hiding this comment.
The hmax condition is redundant (see MeasureTheory.Integrable.sup). Note also that max (g x) 0 is the same thing as (g x)⁺. In fact, I just realized we have MeasureTheory.Integrable.pos_part.
It might be reasonable to write this as a lemma about |g x| and (g x)⁺, and not mark it private. In that case, it would belong in a different file. We could also have the corresponding lemma about |g x| and (g x)⁻.
| ((continuous_circleMap 0 1).measurable.comp measurable_fst) | ||
|
|
||
| /- Formula for the `L¹` norm of an angular slice of the Cartan kernel. -/ | ||
| private lemma integral_norm_cartanKernel_eq (f : ℂ → ℂ) (R β : ℝ) : |
There was a problem hiding this comment.
Again, I don't think this needs to be private
| theorem measurable_cartanKernel (hf : Measurable f) : | ||
| Measurable (fun p : ℝ × ℝ ↦ cartanKernel f R p.1 p.2) := by | ||
| apply measurable_log.comp (continuous_norm.measurable.comp _) | ||
| exact (hf.comp ((continuous_circleMap 0 R).measurable.comp measurable_snd)).sub | ||
| ((continuous_circleMap 0 1).measurable.comp measurable_fst) |
There was a problem hiding this comment.
| theorem measurable_cartanKernel (hf : Measurable f) : | |
| Measurable (fun p : ℝ × ℝ ↦ cartanKernel f R p.1 p.2) := by | |
| apply measurable_log.comp (continuous_norm.measurable.comp _) | |
| exact (hf.comp ((continuous_circleMap 0 R).measurable.comp measurable_snd)).sub | |
| ((continuous_circleMap 0 1).measurable.comp measurable_fst) | |
| @[fun_prop] | |
| theorem measurable_cartanKernel (hf : Measurable f) : | |
| Measurable (fun p : ℝ × ℝ ↦ cartanKernel f R p.1 p.2) := by | |
| unfold cartanKernel; fun_prop |
| have h_meas_K : Measurable (fun p : ℝ × ℝ => cartanKernel f R p.1 p.2) := | ||
| measurable_cartanKernel h.measurable |
There was a problem hiding this comment.
I'm not sure we should have it, but with attribute [fun_prop] Meromorphic.measurable this is provable by fun_prop. I think maybe we shouldn't have it because it is creating a transition theorem "between many layers". While investigating this and other measurability proofs here, I realized we should have the following things:
section PosPart
open MeasureTheory
variable {α M : Type*} {m : MeasurableSpace α} {μ : Measure α} {f g : α → M}
variable [Lattice M] [AddGroup M]
section MeasurableSup
variable [MeasurableSpace M] [MeasurableSup M]
@[fun_prop]
theorem Measurable.posPart (hf : Measurable f) :
Measurable fun x ↦ (f x)⁺ :=
hf.sup_const 0
@[fun_prop]
theorem Measurable.negPart [MeasurableNeg M] (hf : Measurable f) :
Measurable fun x ↦ (f x)⁻ :=
hf.neg.sup_const 0
@[fun_prop]
theorem AEMeasurable.posPart (hf : AEMeasurable f μ) :
AEMeasurable (fun x ↦ (f x)⁺) μ :=
hf.sup_const 0
@[fun_prop]
theorem AEMeasurable.negPart [MeasurableNeg M] (hf : AEMeasurable f μ) :
AEMeasurable (fun x ↦ (f x)⁻) μ :=
hf.neg.sup_const 0
end MeasurableSup
section ContinuousSup
variable [TopologicalSpace M] [ContinuousSup M]
namespace MeasureTheory
@[fun_prop]
theorem StronglyMeasurable.posPart (hf : StronglyMeasurable f) :
StronglyMeasurable fun x ↦ (f x)⁺ :=
hf.sup stronglyMeasurable_const
@[fun_prop]
theorem StronglyMeasurable.negPart [ContinuousNeg M] (hf : StronglyMeasurable f) :
StronglyMeasurable fun x ↦ (f x)⁻ :=
hf.neg.sup stronglyMeasurable_const
@[fun_prop]
theorem AEStronglyMeasurable.posPart (hf : AEStronglyMeasurable f μ) :
AEStronglyMeasurable (fun x ↦ (f x)⁺) μ :=
hf.sup aestronglyMeasurable_const
@[fun_prop]
theorem AEStronglyMeasurable.negPart [ContinuousNeg M] (hf : AEStronglyMeasurable f μ) :
AEStronglyMeasurable (fun x ↦ (f x)⁻) μ :=
hf.neg.sup aestronglyMeasurable_const
end MeasureTheory
end ContinuousSup
end PosPartIf you would like to open a separate PR with these, that would be great.
There was a problem hiding this comment.
@j-loreaux I implemented the theorem you suggested in PR #40209. If you can find the time, I would appreciate it if you could have a look.
| simpa [uIoc_of_le two_pi_pos.le] using (integrable_prod_iff' | ||
| (measurable_cartanKernel h.measurable).stronglyMeasurable.aestronglyMeasurable).2 |
There was a problem hiding this comment.
| simpa [uIoc_of_le two_pi_pos.le] using (integrable_prod_iff' | |
| (measurable_cartanKernel h.measurable).stronglyMeasurable.aestronglyMeasurable).2 | |
| have := h.measurable | |
| simpa [uIoc_of_le two_pi_pos.le] using (integrable_prod_iff' (by fun_prop)).2 |
| simp only [circleAverage, mul_comm, mul_inv_rev, smul_eq_mul, mul_assoc, | ||
| intervalIntegral.integral_const_mul, mul_left_comm, mul_eq_mul_left_iff, inv_eq_zero, | ||
| OfNat.ofNat_ne_zero, or_false, pi_ne_zero, F] | ||
| aesop |
There was a problem hiding this comment.
| simp only [circleAverage, mul_comm, mul_inv_rev, smul_eq_mul, mul_assoc, | |
| intervalIntegral.integral_const_mul, mul_left_comm, mul_eq_mul_left_iff, inv_eq_zero, | |
| OfNat.ofNat_ne_zero, or_false, pi_ne_zero, F] | |
| aesop | |
| simp [circleAverage, F, Cartan.cartanKernel, mul_assoc] |
| calc ∫ x in 0..2 * π, ∫ y in 0..2 * π, F x y | ||
| _ = ∫ x, ∫ y, F x y ∂μ ∂μ := by | ||
| simp [μ, intervalIntegral.integral_of_le two_pi_pos.le] | ||
| _ = ∫ y, ∫ x, F x y ∂μ ∂μ := by | ||
| apply MeasureTheory.integral_integral_swap | ||
| simp only [← uIoc_of_le two_pi_pos.le, F, μ] | ||
| exact Cartan.integrable_cartanKernel h | ||
| _ = ∫ y in 0..2 * π, ∫ x in 0..2 * π, F x y := by | ||
| simp [μ, intervalIntegral.integral_of_le two_pi_pos.le] |
There was a problem hiding this comment.
I feel like we should have a version of MeasureTheory.integral_integral_swap for interval integrals (we have a version already for mixed ones), so that we don't need to do this dance back and forth.
| have integrable_intervalIntegral_cartanKernel_left : | ||
| Integrable (∫ β in 0..2 * π, Cartan.cartanKernel f R · β) | ||
| (volume.restrict (Ioc 0 (2 * π))) := by | ||
| have h_int := Cartan.integrable_cartanKernel (R := R) h | ||
| rw [uIoc_of_le two_pi_pos.le] at h_int | ||
| simpa [intervalIntegral.integral_of_le two_pi_pos.le, Cartan.cartanKernel] | ||
| using h_int.integral_prod_left |
There was a problem hiding this comment.
Should this be a convenience lemma?
If
f : ℂ → ℂis meromorphic, establish a presentation of the proximity functionproximity f ⊤as iterated circle averages. This statement can be used to compare the proximity- and logarithmic counting functions, and is one of the key ingredients in the proof of Cartan's classic formula for the characteristic function.This is the first section of a multi-part PR, establishing Cartan's formula.