Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - feat(Analysis/Analytic): some more API for analytic functions #7552

Closed
wants to merge 5 commits into from

Conversation

loefflerd
Copy link
Collaborator

This PR adds some basic results about analytic functions: products of analytic functions are analytic, and the inverse map on a normed field is analytic away from 0.


Open in Gitpod

Comment on lines -60 to -65
@[simp] -- porting note: new; was not needed in Lean 3
theorem zero_apply (n : ℕ) : (0 : FormalMultilinearSeries 𝕜 E F) n = 0 := rfl

@[simp] -- porting note: new; was not needed in Lean 3
theorem neg_apply (f : FormalMultilinearSeries 𝕜 E F) (n : ℕ) : (-f) n = - f n := rfl

Copy link
Collaborator Author

@loefflerd loefflerd Oct 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I moved these simp lemmas inside the FormalMultilinearSeries namespace (where I think they really belong).

Comment on lines +351 to +386

section Linear

variable [NontriviallyNormedField 𝕜]
[NormedAddCommGroup E] [NormedSpace 𝕜 E]
[NormedAddCommGroup F] [NormedSpace 𝕜 F]

namespace ContinuousLinearMap

/-- Formal power series of a continuous linear map `f : E →L[𝕜] F` at `x : E`:
`f y = f x + f (y - x)`. -/
def fpowerSeries (f : E →L[𝕜] F) (x : E) : FormalMultilinearSeries 𝕜 E F
| 0 => ContinuousMultilinearMap.curry0 𝕜 _ (f x)
| 1 => (continuousMultilinearCurryFin1 𝕜 E F).symm f
| _ => 0
#align continuous_linear_map.fpower_series ContinuousLinearMap.fpowerSeries

theorem fpower_series_apply_zero (f : E →L[𝕜] F) (x : E) :
f.fpowerSeries x 0 = ContinuousMultilinearMap.curry0 𝕜 _ (f x) :=
rfl

theorem fpower_series_apply_one (f : E →L[𝕜] F) (x : E) :
f.fpowerSeries x 1 = (continuousMultilinearCurryFin1 𝕜 E F).symm f :=
rfl

theorem fpowerSeries_apply_add_two (f : E →L[𝕜] F) (x : E) (n : ℕ) : f.fpowerSeries x (n + 2) = 0 :=
rfl
#align continuous_linear_map.fpower_series_apply_add_two ContinuousLinearMap.fpowerSeries_apply_add_two

attribute
[eqns fpower_series_apply_zero fpower_series_apply_one fpowerSeries_apply_add_two] fpowerSeries
attribute [simp] fpowerSeries

end ContinuousLinearMap

end Linear
Copy link
Collaborator Author

@loefflerd loefflerd Oct 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This material is moved (verbatim) from Analytic/Linear.lean (it seems to belong better here since it is purely algebraic, without mentioning radius of convergence, and the other file is very very long).

Comment on lines -30 to -53
/-- Formal power series of a continuous linear map `f : E →L[𝕜] F` at `x : E`:
`f y = f x + f (y - x)`. -/
def fpowerSeries (f : E →L[𝕜] F) (x : E) : FormalMultilinearSeries 𝕜 E F
| 0 => ContinuousMultilinearMap.curry0 𝕜 _ (f x)
| 1 => (continuousMultilinearCurryFin1 𝕜 E F).symm f
| _ => 0
#align continuous_linear_map.fpower_series ContinuousLinearMap.fpowerSeries

theorem fpower_series_apply_zero (f : E →L[𝕜] F) (x : E) :
f.fpowerSeries x 0 = ContinuousMultilinearMap.curry0 𝕜 _ (f x) :=
rfl

theorem fpower_series_apply_one (f : E →L[𝕜] F) (x : E) :
f.fpowerSeries x 1 = (continuousMultilinearCurryFin1 𝕜 E F).symm f :=
rfl

theorem fpowerSeries_apply_add_two (f : E →L[𝕜] F) (x : E) (n : ℕ) : f.fpowerSeries x (n + 2) = 0 :=
rfl
#align continuous_linear_map.fpower_series_apply_add_two ContinuousLinearMap.fpowerSeries_apply_add_two

attribute
[eqns fpower_series_apply_zero fpower_series_apply_one fpowerSeries_apply_add_two] fpowerSeries
attribute [simp] fpowerSeries

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I moved this to FormalMultlinearSeries.lean (it is purely algebraic so it seems to belong better there)

Comment on lines +367 to +394
/-- The radius of the Cartesian product of two formal series is the minimum of their radii. --/
lemma radius_prod_eq_min
(p : FormalMultilinearSeries 𝕜 E F) (q : FormalMultilinearSeries 𝕜 E G) :
(p.prod q).radius = min p.radius q.radius := by
apply le_antisymm
· refine ENNReal.le_of_forall_nnreal_lt fun r hr => ?_
rw [le_min_iff]
have := (p.prod q).isLittleO_one_of_lt_radius hr
constructor
all_goals { -- kludge, there is no "work_on_goal" in Lean 4?
apply FormalMultilinearSeries.le_radius_of_isBigO
refine (isBigO_of_le _ fun n ↦ ?_).trans this.isBigO
rw [norm_mul, norm_norm, norm_mul, norm_norm]
refine mul_le_mul_of_nonneg_right ?_ (norm_nonneg _)
rw [FormalMultilinearSeries.prod, ContinuousMultilinearMap.op_norm_prod]
try apply le_max_left
try apply le_max_right }
· refine ENNReal.le_of_forall_nnreal_lt fun r hr => ?_
rw [lt_min_iff] at hr
have := ((p.isLittleO_one_of_lt_radius hr.1).add
(q.isLittleO_one_of_lt_radius hr.2)).isBigO
refine (p.prod q).le_radius_of_isBigO ((isBigO_of_le _ λ n ↦ ?_).trans this)
rw [norm_mul, norm_norm, ←add_mul, norm_mul]
refine mul_le_mul_of_nonneg_right ?_ (norm_nonneg _)
rw [FormalMultilinearSeries.prod, ContinuousMultilinearMap.op_norm_prod]
refine (max_le_add_of_nonneg (norm_nonneg _) (norm_nonneg _)).trans ?_
apply Real.le_norm_self

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This proof and the next are a bit convoluted, but I couldn't find a nicer way of doing it.

Mathlib/Analysis/Analytic/Linear.lean Outdated Show resolved Hide resolved
Mathlib/Analysis/Analytic/Linear.lean Outdated Show resolved Hide resolved
Mathlib/Analysis/Analytic/Linear.lean Outdated Show resolved Hide resolved
Co-authored-by: Johan Commelin <johan@commelin.net>
@loefflerd
Copy link
Collaborator Author

Thanks for the review!

@loefflerd
Copy link
Collaborator Author

The previous CI run failed because of the (unrelated, sporadic) lean4checker ReduceBool glitch. I've merged master to force a new CI cycle.

@jcommelin
Copy link
Member

Thanks 🎉

bors merge

@github-actions github-actions bot added ready-to-merge This PR has been sent to bors. and removed awaiting-review The author would like community review of the PR labels Oct 18, 2023
bors bot pushed a commit that referenced this pull request Oct 18, 2023
This PR adds some basic results about analytic functions: products of analytic functions are analytic, and the inverse map on a normed field is analytic away from 0.
@bors
Copy link

bors bot commented Oct 18, 2023

Pull request successfully merged into master.

Build succeeded!

The publicly hosted instance of bors-ng is deprecated and will go away soon.

If you want to self-host your own instance, instructions are here.
For more help, visit the forum.

If you want to switch to GitHub's built-in merge queue, visit their help page.

@bors bors bot changed the title feat(Analysis/Analytic): some more API for analytic functions [Merged by Bors] - feat(Analysis/Analytic): some more API for analytic functions Oct 18, 2023
@bors bors bot closed this Oct 18, 2023
@bors bors bot deleted the DL_analyticAt branch October 18, 2023 12:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ready-to-merge This PR has been sent to bors.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants