Compare commits

...

183 Commits

Author SHA1 Message Date
Stefan Kebekus
0526a8c367 Update README 2025-01-08 11:12:38 +01:00
Stefan Kebekus
d391ebe1ba Update README.md 2025-01-07 08:26:52 +01:00
Stefan Kebekus
b26cde43a1 Update README.md 2025-01-06 12:52:49 +01:00
Stefan Kebekus
325736f1e9 Update README.md 2025-01-06 12:46:25 +01:00
Stefan Kebekus
b4d2f46595 Add README 2025-01-06 10:36:44 +01:00
Stefan Kebekus
9341f6a24f Update specialFunctions_Integral_log_sin.lean 2025-01-03 20:08:33 +01:00
Stefan Kebekus
6329e081a3 Add leftovers 2025-01-03 18:08:55 +01:00
Stefan Kebekus
f5a835764b Update 2025-01-03 17:45:22 +01:00
Stefan Kebekus
ce3b3d8bd1 Working… 2025-01-03 16:48:53 +01:00
Stefan Kebekus
08e963e801 Working… 2025-01-03 14:07:53 +01:00
Stefan Kebekus
054edd49a7 Working… 2025-01-03 11:32:28 +01:00
Stefan Kebekus
e7320231e9 Working… 2025-01-03 11:09:51 +01:00
Stefan Kebekus
4c4ed3d2b8 Working… 2025-01-03 10:38:06 +01:00
Stefan Kebekus
5f3f7173f5 Update mathlib 2025-01-01 20:40:43 +01:00
Stefan Kebekus
726ac9e93d Update firstMain.lean 2024-12-24 06:50:23 +01:00
Stefan Kebekus
b189664211 Update meromorphicAt.lean 2024-12-21 11:53:04 +01:00
Stefan Kebekus
e488068a7c Working… 2024-12-21 07:04:13 +01:00
Stefan Kebekus
402128875f Update logpos.lean 2024-12-20 20:52:06 +01:00
Stefan Kebekus
c218c59225 Update logpos.lean 2024-12-20 15:27:06 +01:00
Stefan Kebekus
0139e9c95a Update firstMain.lean 2024-12-20 11:54:02 +01:00
Stefan Kebekus
22d2eae3f6 Working 2024-12-20 11:30:06 +01:00
Stefan Kebekus
93006a2a7e Working… 2024-12-20 09:42:56 +01:00
Stefan Kebekus
6e9cb9e62b working… 2024-12-20 08:16:22 +01:00
Stefan Kebekus
1e28302c17 Working… 2024-12-19 21:24:13 +01:00
Stefan Kebekus
4cc853a5d9 Working… 2024-12-19 16:10:51 +01:00
Stefan Kebekus
e5b49993b7 Update specialFunctions_CircleIntegral_affine.lean 2024-12-18 13:07:36 +01:00
Stefan Kebekus
a2b084f535 Update meromorphicOn_integrability.lean 2024-12-18 11:04:36 +01:00
Stefan Kebekus
cc7d96124c Update lake-manifest.json 2024-12-18 08:47:40 +01:00
Stefan Kebekus
309724de36 Working… 2024-12-16 17:17:43 +01:00
Stefan Kebekus
12397c3055 Working… 2024-12-16 12:43:00 +01:00
Stefan Kebekus
cf301d65d6 Working… 2024-12-16 07:36:01 +01:00
Stefan Kebekus
e80aebfe38 Update stronglyMeromorphicOn_eliminate.lean 2024-12-13 16:24:24 +01:00
Stefan Kebekus
1c02007e1e Working… 2024-12-13 16:03:00 +01:00
Stefan Kebekus
39c70be68c Working… 2024-12-13 12:26:05 +01:00
Stefan Kebekus
84abab6b78 Working 2024-12-13 07:58:40 +01:00
Stefan Kebekus
1d1ae779cc Working 2024-12-12 13:49:33 +01:00
Stefan Kebekus
7dcc6e209c Update lean 2024-12-12 12:23:19 +01:00
Stefan Kebekus
ee7f20c593 Working… 2024-12-11 12:36:44 +01:00
Stefan Kebekus
c7a3804b0c Implementing… 2024-12-09 19:58:56 +01:00
Stefan Kebekus
3b2d1434f7 Update firstMain.lean 2024-12-09 16:00:26 +01:00
Stefan Kebekus
9068ad406e Update firstMain.lean 2024-12-05 16:53:48 +01:00
Stefan Kebekus
c6e72864c8 Update firstMain.lean 2024-12-05 13:51:00 +01:00
Stefan Kebekus
dce2f57135 Move unused files to junk 2024-12-05 13:43:58 +01:00
Stefan Kebekus
20a0d664b7 Update stronglyMeromorphic_JensenFormula.lean 2024-12-05 13:42:47 +01:00
Stefan Kebekus
734ea1a8f4 Working… 2024-12-05 12:00:49 +01:00
Stefan Kebekus
5e244a732a Working… 2024-12-05 07:12:32 +01:00
Stefan Kebekus
ae3e64c83b Working… 2024-12-03 17:21:22 +01:00
Stefan Kebekus
ad298459ee working 2024-12-03 16:54:13 +01:00
Stefan Kebekus
ebfa0e9bd0 Update stronglyMeromorphic_JensenFormula.lean 2024-12-03 12:05:00 +01:00
Stefan Kebekus
8d72fae4dc Update mathlib and work on Jensen Formula 2024-12-03 10:21:38 +01:00
Stefan Kebekus
7e3ccaf7d5 Fix compilations 2024-12-03 09:08:14 +01:00
Stefan Kebekus
9aa2604c18 Fix compilation 2024-12-03 08:00:55 +01:00
Stefan Kebekus
084841c35a working… 2024-12-02 17:46:48 +01:00
Stefan Kebekus
4320db0533 Update stronglyMeromorphic_JensenFormula.lean 2024-12-02 16:49:16 +01:00
Stefan Kebekus
7fa50d47e9 Create stronglyMeromorphic_JensenFormula.lean 2024-11-29 13:45:05 +01:00
Stefan Kebekus
580ea61f96 Done with elimination 2024-11-29 13:24:20 +01:00
Stefan Kebekus
eec4cd1ffa Update mathlib 2024-11-29 09:55:22 +01:00
Stefan Kebekus
e20dcdbd19 Working. 2024-11-29 07:09:01 +01:00
Stefan Kebekus
3f24072412 Working… 2024-11-28 18:57:43 +01:00
Stefan Kebekus
2b7ab1af9d Working 2024-11-28 18:24:08 +01:00
Stefan Kebekus
8bc84748a3 Working… 2024-11-28 16:52:56 +01:00
Stefan Kebekus
8525ae1ece Working… 2024-11-27 11:54:31 +01:00
Stefan Kebekus
9be57a898c Update stronglyMeromorphicOn_eliminate.lean 2024-11-27 10:43:13 +01:00
Stefan Kebekus
37359a319f working… 2024-11-26 20:04:58 +01:00
Stefan Kebekus
46740a0f17 Update stronglyMeromorphicOn_eliminate.lean 2024-11-26 14:14:03 +01:00
Stefan Kebekus
092bfd85a3 Update stronglyMeromorphicOn_ratlPolynomial.lean 2024-11-26 11:20:02 +01:00
Stefan Kebekus
0e88e97295 Update stronglyMeromorphicOn_ratlPolynomial.lean 2024-11-25 15:33:44 +01:00
Stefan Kebekus
5f85934bbe Working… 2024-11-25 14:25:00 +01:00
Stefan Kebekus
8c1fefb0be Update lake-manifest.json 2024-11-25 12:15:45 +01:00
Stefan Kebekus
6fb627dad3 working... 2024-11-21 17:15:32 +01:00
Stefan Kebekus
b038a5f47f Update stronglyMeromorphicOn.lean 2024-11-20 16:08:59 +01:00
Stefan Kebekus
6294e3c4ea Update stronglyMeromorphicOn_eliminate.lean 2024-11-20 12:01:52 +01:00
Stefan Kebekus
b3eefceb39 working… 2024-11-20 11:43:09 +01:00
Stefan Kebekus
f65785b62b Working… 2024-11-20 08:12:12 +01:00
Stefan Kebekus
25d0e2086a working 2024-11-19 16:33:33 +01:00
Stefan Kebekus
971b7cc23c Working! 2024-11-19 15:54:28 +01:00
Stefan Kebekus
ab02fe715e Update stronglyMeromorphicOn_eliminate.lean 2024-11-19 13:57:08 +01:00
Stefan Kebekus
513c122036 working 2024-11-19 13:20:19 +01:00
Stefan Kebekus
32f0bdf6e1 Update stronglyMeromorphicOn_eliminate.lean 2024-11-19 12:06:03 +01:00
Stefan Kebekus
81f1c6ae94 working… 2024-11-19 11:31:24 +01:00
Stefan Kebekus
69b9ad6d3b working… 2024-11-19 10:07:20 +01:00
Stefan Kebekus
226609f9c0 Working… 2024-11-19 08:45:20 +01:00
Stefan Kebekus
c5dc9ea786 Working… 2024-11-19 07:16:04 +01:00
Stefan Kebekus
68acec101e Update meromorphicOn.lean 2024-11-18 19:27:51 +01:00
Stefan Kebekus
12888b75fb Update meromorphicOn.lean 2024-11-18 18:44:42 +01:00
Stefan Kebekus
22d9b8aa95 Update meromorphicOn.lean 2024-11-17 16:56:27 +01:00
Stefan Kebekus
6e204a0348 Update meromorphicOn.lean 2024-11-16 13:24:50 +01:00
Stefan Kebekus
b6014409de Update meromorphicOn.lean 2024-11-15 12:16:41 +01:00
Stefan Kebekus
8bff0c782b Minor update 2024-11-15 09:01:55 +01:00
Stefan Kebekus
d7b78e8e33 working 2024-11-14 16:53:35 +01:00
Stefan Kebekus
fb642a4ed0 working 2024-11-14 16:18:32 +01:00
Stefan Kebekus
f22cea20a0 Update stronglyMeromorphicAt.lean 2024-11-14 15:54:21 +01:00
Stefan Kebekus
ccfc457c48 Update stronglyMeromorphicAt.lean 2024-11-14 15:36:36 +01:00
Stefan Kebekus
62abf21cfd Update stronglyMeromorphicAt.lean 2024-11-14 15:33:19 +01:00
Stefan Kebekus
9ebb1c5215 Update stronglyMeromorphicAt.lean 2024-11-14 15:32:19 +01:00
Stefan Kebekus
1a14bbbdd6 Update stronglyMeromorphicAt.lean 2024-11-14 14:08:06 +01:00
Stefan Kebekus
89abb9190f Working… 2024-11-14 13:47:24 +01:00
Stefan Kebekus
ebeba74314 Working… 2024-11-14 11:24:44 +01:00
Stefan Kebekus
f43674dedc working 2024-11-14 06:49:15 +01:00
Stefan Kebekus
24bd4f9ffa Working… 2024-11-13 16:12:25 +01:00
Stefan Kebekus
74ba95926e Working… 2024-11-13 14:31:45 +01:00
Stefan Kebekus
15fa18c52f working... 2024-11-12 16:58:07 +01:00
Stefan Kebekus
c6caffc53d Implementing... 2024-11-12 16:49:07 +01:00
Stefan Kebekus
7893050455 Update along with mathlib 2024-11-12 13:14:11 +01:00
Stefan Kebekus
a8ab8a5875 Working… 2024-11-11 16:50:49 +01:00
Stefan Kebekus
f3e951884f Update mathlib 2024-11-11 08:46:26 +01:00
Stefan Kebekus
6d403874e2 Update meromorphicOn_decompose.lean 2024-11-08 12:05:49 +01:00
Stefan Kebekus
4145a9ebc9 Update meromorphicOn_decompose.lean 2024-11-08 12:00:37 +01:00
Stefan Kebekus
de501a7384 Update meromorphicOn_decompose.lean 2024-11-08 08:40:58 +01:00
Stefan Kebekus
1c844b9978 Update meromorphicOn_decompose.lean 2024-11-07 16:10:37 +01:00
Stefan Kebekus
dfc67cec4a working 2024-11-07 12:08:52 +01:00
Stefan Kebekus
e843786097 Cleanup 2024-11-07 09:53:34 +01:00
Stefan Kebekus
a95c34fd05 Update divisor.lean 2024-11-06 16:15:27 +01:00
Stefan Kebekus
9d6801c329 Working… 2024-11-06 16:08:17 +01:00
Stefan Kebekus
5cdc786144 Working… 2024-11-06 15:33:48 +01:00
Stefan Kebekus
2146909338 Working (hard) 2024-11-04 13:22:12 +01:00
Stefan Kebekus
025b0a3db8 Create meromorphicOn_divisor.lean 2024-10-31 17:09:09 +01:00
Stefan Kebekus
30ad49b90d Working… 2024-10-31 16:59:22 +01:00
Stefan Kebekus
449de2e42a Update mathlib 2024-10-31 07:37:54 +01:00
Stefan Kebekus
279dcd32b9 Working… 2024-10-30 16:53:32 +01:00
Stefan Kebekus
a6defe8296 Update stronglyMeromorphicAt.lean 2024-10-25 14:14:07 +02:00
Stefan Kebekus
5bf670231f Update stronglyMeromorphicAt.lean 2024-10-24 16:05:44 +02:00
Stefan Kebekus
306ed1b083 Update stronglyMeromorphicOn.lean 2024-10-24 14:37:27 +02:00
Stefan Kebekus
ccdbb319f7 Create stronglyMeromorphicOn.lean 2024-10-24 14:05:16 +02:00
Stefan Kebekus
dd3384439e Rename 2024-10-24 13:49:58 +02:00
Stefan Kebekus
f373bf786b Update stronglyMeromorphic.lean 2024-10-24 13:46:27 +02:00
Stefan Kebekus
6aa5bc3b1c Update stronglyMeromorphic.lean 2024-10-24 13:12:03 +02:00
Stefan Kebekus
570a58aab7 Update 2024-10-24 12:50:08 +02:00
Stefan Kebekus
e7ca812ad8 Update stronglyMeromorphic.lean 2024-10-23 13:31:22 +02:00
Stefan Kebekus
d80894ea6f Update stronglyMeromorphic.lean 2024-10-23 13:03:41 +02:00
Stefan Kebekus
e1b948ad2c Update, working, … 2024-10-22 17:12:59 +02:00
Stefan Kebekus
25b0ffd899 Update stronglyMeromorphic.lean 2024-10-21 10:36:48 +02:00
Stefan Kebekus
8408172272 Update stronglyMeromorphic.lean 2024-10-14 13:41:05 +02:00
Stefan Kebekus
405b68924d Update stronglyMeromorphic.lean 2024-10-14 13:25:49 +02:00
Stefan Kebekus
24139d9d00 Update mathlib 2024-10-14 11:21:22 +02:00
Stefan Kebekus
b4fd53c8b7 Update 2024-10-09 12:13:22 +02:00
Stefan Kebekus
0298c9c97a Working… 2024-10-09 06:33:14 +02:00
Stefan Kebekus
1c31e68e2a Update stronglyMeromorphic.lean 2024-10-08 15:39:19 +02:00
Stefan Kebekus
67b78ad72d Add file 2024-10-08 09:35:17 +02:00
Stefan Kebekus
9498d9f203 Update mathlib 2024-10-07 13:06:55 +02:00
Stefan Kebekus
86da08ebc8 working 2024-10-07 07:56:42 +02:00
Stefan Kebekus
551b4a2463 Update divisor.lean 2024-10-01 06:51:18 +02:00
Stefan Kebekus
76c6aa1639 Updade mathlib 2024-09-30 16:40:56 +02:00
Stefan Kebekus
c8f4cf12ca Update to latest version of mathlib 2024-09-30 14:12:33 +02:00
Stefan Kebekus
1a8bde51eb Update divisor.lean 2024-09-17 11:03:44 +02:00
Stefan Kebekus
12d81cb0a9 Update divisor.lean 2024-09-17 10:43:46 +02:00
Stefan Kebekus
12f0543f47 Working… 2024-09-14 08:38:04 +02:00
Stefan Kebekus
6610fd49b0 working… 2024-09-13 09:21:57 +02:00
Stefan Kebekus
dba4e2d9c4 Rename file 2024-09-13 07:42:57 +02:00
Stefan Kebekus
fe0d8a5f5e Delete holomorphic_JensenFormula.lean 2024-09-13 07:42:07 +02:00
Stefan Kebekus
712be956d0 Jensen's formula is done! 2024-09-12 08:56:01 +02:00
Stefan Kebekus
5a984253c6 Update holomorphic_JensenFormula2.lean 2024-09-12 07:52:26 +02:00
Stefan Kebekus
42c1c14edf Delete diffOpGrothendieck.lean 2024-09-12 07:13:35 +02:00
Stefan Kebekus
b988031047 Update analyticAt.lean 2024-09-12 07:12:03 +02:00
Stefan Kebekus
dbea68061b Update analyticAt.lean 2024-09-12 07:04:00 +02:00
Stefan Kebekus
f83f772506 Update analyticAt.lean 2024-09-12 06:58:43 +02:00
Stefan Kebekus
dbeb631178 Update analyticAt.lean 2024-09-11 16:57:16 +02:00
Stefan Kebekus
1e8c5bad0f working 2024-09-11 15:48:43 +02:00
Stefan Kebekus
b91e3677c0 Update holomorphic_JensenFormula2.lean 2024-09-11 11:09:03 +02:00
Stefan Kebekus
47e1bfe35e working 2024-09-11 11:06:45 +02:00
Stefan Kebekus
6651c0852a Working… 2024-09-11 10:24:45 +02:00
Stefan Kebekus
3bead7a9bf Update holomorphic_JensenFormula2.lean 2024-09-11 09:07:49 +02:00
Stefan Kebekus
e901f241cc Working… 2024-09-10 16:50:29 +02:00
Stefan Kebekus
745e614016 Working… 2024-09-10 15:29:30 +02:00
Stefan Kebekus
8e5ada9a01 working… 2024-09-10 14:43:28 +02:00
Stefan Kebekus
ef7e1df191 Working… 2024-09-10 14:21:08 +02:00
Stefan Kebekus
fa2e431f4c Update analyticOn_zeroSet.lean 2024-09-10 12:53:34 +02:00
Stefan Kebekus
f732c82f92 Update analyticOn_zeroSet.lean 2024-09-10 11:30:27 +02:00
Stefan Kebekus
cd58c18a78 Update analyticOn_zeroSet.lean 2024-09-10 11:21:49 +02:00
Stefan Kebekus
5dc437751b Update analyticOn_zeroSet.lean 2024-09-10 11:06:00 +02:00
Stefan Kebekus
aa79fdb9eb Update analyticOn_zeroSet.lean 2024-09-10 10:55:53 +02:00
Stefan Kebekus
e41a08f1d5 Create analyticAt.lean 2024-09-10 10:45:53 +02:00
Stefan Kebekus
111fcea7af Update holomorphic_JensenFormula2.lean 2024-09-09 13:17:12 +02:00
Stefan Kebekus
e3853f1632 Update Mathlib 2024-09-09 12:45:07 +02:00
Stefan Kebekus
1ccc9679e5 Update lean 2024-09-09 06:50:28 +02:00
Stefan Kebekus
2ec1335521 Update Mathlib 2024-08-23 09:26:58 +02:00
Stefan Kebekus
42a6c439a9 Update holomorphic_JensenFormula2.lean 2024-08-22 14:52:52 +02:00
Stefan Kebekus
b818aa5c13 working… 2024-08-22 14:21:14 +02:00
Stefan Kebekus
371b90c1c6 working… 2024-08-22 13:09:03 +02:00
Stefan Kebekus
db9ce54bcf Update specialFunctions_CircleIntegral_affine.lean 2024-08-22 08:47:20 +02:00
Stefan Kebekus
77dea4115e working 2024-08-22 08:19:01 +02:00
Stefan Kebekus
567b08aa5b working… 2024-08-21 17:04:45 +02:00
Stefan Kebekus
960af65b57 Update holomorphic_JensenFormula.lean 2024-08-21 10:12:36 +02:00
46 changed files with 5592 additions and 1761 deletions

7
.vscode/ltex.dictionary.en-US.txt vendored Normal file
View File

@@ -0,0 +1,7 @@
Nevanlinna
holomorphic
integrability
codiscrete
meromorphy
prover
mathlib

View File

@@ -0,0 +1 @@
{"rule":"MORFOLOGIK_RULE_EN_US","sentence":"^\\QHarmonic functions in the complex plane\nLaplace operator and associated API\nDefinition and elementary properties of harmonic functions\nMean value properties of harmonic functions\nReal and imaginary parts of holomorphic functions as examples of harmonic functions\nHolomorphic functions in the complex plane\nExistence of primitives [duplication of work already under review at mathlib]\nExistence of holomorphic functions with given real part\nMeromorphic Functions in the complex plane\nAPI for continuous extension of meromorphic functions, normal form of meromorphic functions up to changes along a discrete set\nBehavior of pole/zero orders under standard operations\nZero/pole divisors attached to meromorphic functions and associated API\nExtraction of zeros and poles\nIntegrals and integrability of special functions\nInterval integrals and integrability of the logarithm and its combinations with trigonometric functions; circle integrability of log ‖z-a‖\nCircle integrability of log ‖meromorphic‖\nBasic functions of Value Distribution Theory\nThe positive part of the logarithm, API, standard inequalities and estimates\nLogarithmic counting functions of divisors\nNevanlinna heights of entire meromorphic functions\nProximity functions for entire meromorphic functions\nJensen's formula\nNevanlinna's First Main Theorem\\E$"}

View File

@@ -1 +1,28 @@
import Nevanlinna.cauchyRiemann
import Nevanlinna.analyticAt
import Nevanlinna.cauchyRiemann
import Nevanlinna.codiscreteWithin
import Nevanlinna.divisor
import Nevanlinna.firstMain
import Nevanlinna.harmonicAt
import Nevanlinna.harmonicAt_examples
import Nevanlinna.harmonicAt_meanValue
import Nevanlinna.holomorphicAt
import Nevanlinna.holomorphic_examples
import Nevanlinna.holomorphic_primitive
import Nevanlinna.intervalIntegrability
import Nevanlinna.laplace
import Nevanlinna.logpos
import Nevanlinna.mathlibAddOn
import Nevanlinna.meromorphicAt
import Nevanlinna.meromorphicOn
import Nevanlinna.meromorphicOn_divisor
import Nevanlinna.meromorphicOn_integrability
import Nevanlinna.partialDeriv
import Nevanlinna.periodic_integrability
import Nevanlinna.specialFunctions_CircleIntegral_affine
import Nevanlinna.specialFunctions_Integral_log_sin
import Nevanlinna.stronglyMeromorphicAt
import Nevanlinna.stronglyMeromorphicOn
import Nevanlinna.stronglyMeromorphicOn_eliminate
import Nevanlinna.stronglyMeromorphicOn_ratlPolynomial
import Nevanlinna.stronglyMeromorphic_JensenFormula

344
Nevanlinna/analyticAt.lean Normal file
View File

@@ -0,0 +1,344 @@
import Mathlib.Analysis.Analytic.IsolatedZeros
import Mathlib.Analysis.Complex.Basic
import Mathlib.Analysis.Analytic.Linear
open Topology
theorem AnalyticAt.order_neq_top_iff
{f : }
{z₀ : }
(hf : AnalyticAt f z₀) :
hf.order (g : ), AnalyticAt g z₀ g z₀ 0 (z : ) in nhds z₀, f z = (z - z₀) ^ (hf.order.toNat) g z := by
rw [ hf.order_eq_nat_iff]
constructor
· intro h₁f
exact Eq.symm (ENat.coe_toNat h₁f)
· intro h₁f
exact ENat.coe_toNat_eq_self.mp (id (Eq.symm h₁f))
theorem AnalyticAt.order_mul
{f₁ f₂ : }
{z₀ : }
(hf₁ : AnalyticAt f₁ z₀)
(hf₂ : AnalyticAt f₂ z₀) :
(hf₁.mul hf₂).order = hf₁.order + hf₂.order := by
by_cases h₂f₁ : hf₁.order =
· simp [h₂f₁]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff] at h₂f₁
obtain t, h₁t, h₂t, h₃t := h₂f₁
use t
constructor
· intro y hy
rw [h₁t y hy]
ring
· exact h₂t, h₃t
· by_cases h₂f₂ : hf₂.order =
· simp [h₂f₂]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff] at h₂f₂
obtain t, h₁t, h₂t, h₃t := h₂f₂
use t
constructor
· intro y hy
rw [h₁t y hy]
ring
· exact h₂t, h₃t
· obtain g₁, h₁g₁, h₂g₁, h₃g₁ := (AnalyticAt.order_eq_nat_iff hf₁ hf₁.order.toNat).1 (eq_comm.1 (ENat.coe_toNat h₂f₁))
obtain g₂, h₁g₂, h₂g₂, h₃g₂ := (AnalyticAt.order_eq_nat_iff hf₂ hf₂.order.toNat).1 (eq_comm.1 (ENat.coe_toNat h₂f₂))
rw [ ENat.coe_toNat h₂f₁, ENat.coe_toNat h₂f₂, ENat.coe_add]
rw [AnalyticAt.order_eq_nat_iff (AnalyticAt.mul hf₁ hf₂) (hf₁.order.toNat + hf₂.order.toNat)]
use g₁ * g₂
constructor
· exact AnalyticAt.mul h₁g₁ h₁g₂
· constructor
· simp; tauto
· obtain t₁, h₁t₁, h₂t₁, h₃t₁ := eventually_nhds_iff.1 h₃g₁
obtain t₂, h₁t₂, h₂t₂, h₃t₂ := eventually_nhds_iff.1 h₃g₂
rw [eventually_nhds_iff]
use t₁ t₂
constructor
· intro y hy
rw [h₁t₁ y hy.1, h₁t₂ y hy.2]
simp; ring
· constructor
· exact IsOpen.inter h₂t₁ h₂t₂
· exact Set.mem_inter h₃t₁ h₃t₂
theorem AnalyticAt.order_eq_zero_iff
{f : }
{z₀ : }
(hf : AnalyticAt f z₀) :
hf.order = 0 f z₀ 0 := by
have : (0 : ENat) = (0 : Nat) := by rfl
rw [this, AnalyticAt.order_eq_nat_iff hf 0]
constructor
· intro hz
obtain g, _, h₂g, h₃g := hz
simp at h₃g
rw [Filter.Eventually.self_of_nhds h₃g]
tauto
· intro hz
use f
constructor
· exact hf
· constructor
· exact hz
· simp
theorem AnalyticAt.order_pow
{f : }
{z₀ : }
{n : }
(hf : AnalyticAt f z₀) :
(hf.pow n).order = n * hf.order := by
induction' n with n hn
· simp; rw [AnalyticAt.order_eq_zero_iff]; simp
· simp
simp_rw [add_mul, pow_add]
simp
rw [AnalyticAt.order_mul (hf.pow n) hf]
rw [hn]
theorem AnalyticAt.supp_order_toNat
{f : }
{z₀ : }
(hf : AnalyticAt f z₀) :
hf.order.toNat 0 f z₀ = 0 := by
contrapose
intro h₁f
simp [hf.order_eq_zero_iff.2 h₁f]
theorem eventually_nhds_comp_composition
{f₁ f₂ : }
{z₀ : }
(hf : (z : ) in nhds ( z₀), f₁ z = f₂ z)
(h : Continuous ) :
(z : ) in nhds z₀, (f₁ ) z = (f₂ ) z := by
obtain t, h₁t, h₂t, h₃t := eventually_nhds_iff.1 hf
apply eventually_nhds_iff.2
use ⁻¹' t
constructor
· intro y hy
exact h₁t ( y) hy
· constructor
· apply IsOpen.preimage
exact h
exact h₂t
· exact h₃t
theorem AnalyticAt.order_congr
{f₁ f₂ : }
{z₀ : }
(hf₁ : AnalyticAt f₁ z₀)
(hf : f₁ =[nhds z₀] f₂) :
hf₁.order = (hf₁.congr hf).order := by
by_cases h₁f₁ : hf₁.order =
rw [h₁f₁, eq_comm, AnalyticAt.order_eq_top_iff]
rw [AnalyticAt.order_eq_top_iff] at h₁f₁
exact Filter.EventuallyEq.rw h₁f₁ (fun x => Eq (f₂ x)) (id (Filter.EventuallyEq.symm hf))
--
let n := hf₁.order.toNat
have hn : hf₁.order = n := Eq.symm (ENat.coe_toNat h₁f₁)
rw [hn, eq_comm, AnalyticAt.order_eq_nat_iff]
rw [AnalyticAt.order_eq_nat_iff] at hn
obtain g, h₁g, h₂g, h₃g := hn
use g
constructor
· assumption
· constructor
· assumption
· exact Filter.EventuallyEq.rw h₃g (fun x => Eq (f₂ x)) (id (Filter.EventuallyEq.symm hf))
theorem AnalyticAt.order_comp_CLE
( : L[] )
{f : }
{z₀ : }
(hf : AnalyticAt f ( z₀)) :
hf.order = (hf.comp (.analyticAt z₀)).order := by
by_cases h₁f : hf.order =
· rw [h₁f]
rw [AnalyticAt.order_eq_top_iff] at h₁f
let A := eventually_nhds_comp_composition h₁f .continuous
simp at A
rw [AnalyticAt.order_congr (hf.comp (.analyticAt z₀)) A]
have : AnalyticAt (0 : ) z₀ := by
apply analyticAt_const
have : this.order = := by
rw [AnalyticAt.order_eq_top_iff]
simp
rw [this]
· let n := hf.order.toNat
have hn : hf.order = n := Eq.symm (ENat.coe_toNat h₁f)
rw [hn]
rw [AnalyticAt.order_eq_nat_iff] at hn
obtain g, h₁g, h₂g, h₃g := hn
have A := eventually_nhds_comp_composition h₃g .continuous
have t₁ : AnalyticAt (fun z => z - z₀) z₀ := by
apply AnalyticAt.sub
exact ContinuousLinearEquiv.analyticAt z₀
exact analyticAt_const
have t₀ : AnalyticAt (fun z => ( z - z₀) ^ n) z₀ := by
exact pow t₁ n
have : AnalyticAt (fun z ( z - z₀) ^ n g ( z) : ) z₀ := by
apply AnalyticAt.mul
exact t₀
apply AnalyticAt.comp h₁g
exact ContinuousLinearEquiv.analyticAt z₀
rw [AnalyticAt.order_congr (hf.comp (.analyticAt z₀)) A]
simp
rw [AnalyticAt.order_mul t₀ ((h₁g.comp (.analyticAt z₀)))]
have : t₁.order = (1 : ) := by
rw [AnalyticAt.order_eq_nat_iff]
use (fun _ 1)
simp
constructor
· exact analyticAt_const
· apply Filter.Eventually.of_forall
intro x
calc x - z₀
_ = (x - z₀) := by
exact Eq.symm (ContinuousLinearEquiv.map_sub x z₀)
_ = ((x - z₀) * 1) := by
simp
_ = (x - z₀) * 1 := by
rw [ smul_eq_mul, smul_eq_mul]
exact ContinuousLinearEquiv.map_smul (x - z₀) 1
have : t₀.order = n := by
rw [AnalyticAt.order_pow t₁, this]
simp
rw [this]
have : (comp h₁g (ContinuousLinearEquiv.analyticAt z₀)).order = 0 := by
rwa [AnalyticAt.order_eq_zero_iff]
rw [this]
simp
theorem AnalyticAt.localIdentity
{f g : }
{z₀ : }
(hf : AnalyticAt f z₀)
(hg : AnalyticAt g z₀) :
f =[𝓝[] z₀] g f =[𝓝 z₀] g := by
intro h
let Δ := f - g
have : AnalyticAt Δ z₀ := AnalyticAt.sub hf hg
have t₁ : Δ =[𝓝[] z₀] 0 := by
exact Filter.eventuallyEq_iff_sub.mp h
have : Δ =[𝓝 z₀] 0 := by
rcases (AnalyticAt.eventually_eq_zero_or_eventually_ne_zero this) with h | h
· exact h
· have := Filter.EventuallyEq.eventually t₁
let A := Filter.eventually_and.2 this, h
let _ := Filter.Eventually.exists A
tauto
exact Filter.eventuallyEq_iff_sub.mpr this
theorem AnalyticAt.mul₁
{f g : }
{z : }
(hf : AnalyticAt f z)
(hg : AnalyticAt g z) :
AnalyticAt (f * g) z := by
rw [(by rfl : f * g = (fun x f x * g x))]
exact mul hf hg
theorem analyticAt_finprod
{α : Type}
{f : α }
{z : }
(hf : a, AnalyticAt (f a) z) :
AnalyticAt ( a, f a) z := by
by_cases h₁f : (Function.mulSupport f).Finite
· rw [finprod_eq_prod f h₁f]
rw [Finset.prod_fn h₁f.toFinset f]
exact Finset.analyticAt_prod h₁f.toFinset (fun a _ hf a)
· rw [finprod_of_infinite_mulSupport h₁f]
exact analyticAt_const
lemma AnalyticAt.zpow_nonneg
{f : }
{z₀ : }
{n : }
(hf : AnalyticAt f z₀)
(hn : 0 n) :
AnalyticAt (fun x (f x) ^ n) z₀ := by
simp_rw [(Eq.symm (Int.toNat_of_nonneg hn) : n = OfNat.ofNat n.toNat), zpow_ofNat]
apply AnalyticAt.pow hf
theorem AnalyticAt.zpow
{f : }
{z₀ : }
{n : }
(h₁f : AnalyticAt f z₀)
(h₂f : f z₀ 0) :
AnalyticAt (fun x (f x) ^ n) z₀ := by
by_cases hn : 0 n
· exact zpow_nonneg h₁f hn
· rw [(Int.eq_neg_comm.mp rfl : n = - (- n))]
conv =>
arg 2
intro x
rw [zpow_neg]
exact AnalyticAt.inv (zpow_nonneg h₁f (by linarith)) (zpow_ne_zero (-n) h₂f)
/- A function is analytic at a point iff it is analytic after multiplication
with a non-vanishing analytic function
-/
theorem analyticAt_of_mul_analytic
{f g : }
{z₀ : }
(h₁g : AnalyticAt g z₀)
(h₂g : g z₀ 0) :
AnalyticAt f z₀ AnalyticAt (f * g) z₀ := by
constructor
· exact fun a => AnalyticAt.mul₁ a h₁g
· intro hprod
let g' := fun z (g z)⁻¹
have h₁g' := h₁g.inv h₂g
have h₂g' : g' z₀ 0 := by
exact inv_ne_zero h₂g
have : f =[𝓝 z₀] f * g * fun x => (g x)⁻¹ := by
unfold Filter.EventuallyEq
apply Filter.eventually_iff_exists_mem.mpr
use g⁻¹' {0}
constructor
· apply ContinuousAt.preimage_mem_nhds
exact AnalyticAt.continuousAt h₁g
exact compl_singleton_mem_nhds_iff.mpr h₂g
· intro y hy
simp at hy
simp [hy]
rw [analyticAt_congr this]
apply hprod.mul
exact h₁g'

View File

@@ -31,7 +31,7 @@ theorem CauchyRiemann₃ : (DifferentiableAt f z)
have ContinuousLinearMap.comp_lineDeriv : w : , l : L[] , lineDeriv (l f) z w = l ((fderiv f z) w) := by
intro w l
rw [DifferentiableAt.lineDeriv_eq_fderiv]
rw [fderiv.comp]
rw [fderiv_comp]
simp
fun_prop
exact h.restrictScalars

View File

@@ -0,0 +1,11 @@
import Mathlib.Topology.DiscreteSubset
theorem codiscreteWithin_congr
{X : Type u_1} [TopologicalSpace X]
{S T U : Set X}
(hST : S U = T U) :
S Filter.codiscreteWithin U T Filter.codiscreteWithin U := by
repeat rw [mem_codiscreteWithin]
rw [ Set.diff_inter_self_eq_diff (t := S)]
rw [ Set.diff_inter_self_eq_diff (t := T)]
rw [hST]

View File

@@ -1,9 +0,0 @@
import Mathlib.Analysis.Calculus.ContDiff.Basic
import Mathlib.Analysis.InnerProductSpace.PiL2
/-
Here we would like to define differential operators, following EGA 4-1, §20.
This is work to be done in the future.
-/

107
Nevanlinna/divisor.lean Normal file
View File

@@ -0,0 +1,107 @@
import Mathlib.Analysis.SpecialFunctions.Integrals
import Mathlib.Analysis.SpecialFunctions.Log.NegMulLog
import Mathlib.Analysis.Convex.SpecificFunctions.Deriv
import Nevanlinna.analyticAt
import Nevanlinna.mathlibAddOn
open Interval Topology
open Real Filter MeasureTheory intervalIntegral
structure Divisor
(U : Set )
where
toFun :
supportInU : toFun.support U
locallyFiniteInU : x U, toFun =[𝓝[] x] 0
instance
(U : Set ) :
CoeFun (Divisor U) (fun _ ) where
coe := Divisor.toFun
attribute [coe] Divisor.toFun
theorem Divisor.discreteSupport
{U : Set }
(hU : IsClosed U)
(D : Divisor U) :
DiscreteTopology D.toFun.support := by
apply discreteTopology_subtype_iff.mpr
intro x hx
apply inf_principal_eq_bot.mpr
by_cases h₁x : x U
· let A := D.locallyFiniteInU x h₁x
refine mem_nhdsWithin.mpr ?_
rw [eventuallyEq_nhdsWithin_iff] at A
obtain U, h₁U, h₂U, h₃U := eventually_nhds_iff.1 A
use U
constructor
· exact h₂U
· constructor
· exact h₃U
· intro y hy
let C := h₁U y hy.1 hy.2
tauto
· refine mem_nhdsWithin.mpr ?_
use U
constructor
· simpa
· constructor
· tauto
· intro y _
let A := D.supportInU
simp at A
simp
exact False.elim (h₁x (A x hx))
theorem Divisor.closedSupport
{U : Set }
(hU : IsClosed U)
(D : Divisor U) :
IsClosed D.toFun.support := by
rw [ isOpen_compl_iff]
rw [isOpen_iff_eventually]
intro x hx
by_cases h₁x : x U
· have A := D.locallyFiniteInU x h₁x
simp [A]
simp at hx
let B := Mnhds A hx
simpa
· rw [eventually_iff_exists_mem]
use U
constructor
· exact IsClosed.compl_mem_nhds hU h₁x
· intro y hy
simp
exact Function.nmem_support.mp fun a => hy (D.supportInU a)
theorem Divisor.finiteSupport
{U : Set }
(hU : IsCompact U)
(D : Divisor U) :
Set.Finite D.toFun.support := by
apply IsCompact.finite
· apply IsCompact.of_isClosed_subset hU (D.closedSupport hU.isClosed)
exact D.supportInU
· exact D.discreteSupport hU.isClosed
theorem Divisor.codiscreteWithin
{U : Set }
(D : Divisor U) :
D.toFun.support Filter.codiscreteWithin U := by
simp_rw [mem_codiscreteWithin, disjoint_principal_right]
intro x hx
obtain s, hs := Filter.eventuallyEq_iff_exists_mem.1 (D.locallyFiniteInU x hx)
apply Filter.mem_of_superset hs.1
intro y hy
simp [hy]
tauto

435
Nevanlinna/firstMain.lean Normal file
View File

@@ -0,0 +1,435 @@
import Mathlib.MeasureTheory.Integral.CircleIntegral
import Nevanlinna.divisor
import Nevanlinna.meromorphicOn_divisor
import Nevanlinna.meromorphicOn_integrability
import Nevanlinna.stronglyMeromorphicOn
import Nevanlinna.stronglyMeromorphic_JensenFormula
open Real
-- Lang p. 164
theorem MeromorphicOn.restrict
{f : }
(h₁f : MeromorphicOn f )
(r : ) :
MeromorphicOn f (Metric.closedBall 0 r) := by
exact fun x a => h₁f x trivial
theorem MeromorphicOn.restrict_inv
{f : }
(h₁f : MeromorphicOn f )
(r : ) :
h₁f.inv.restrict r = (h₁f.restrict r).inv := by
funext x
simp
noncomputable def MeromorphicOn.N_zero
{f : }
(hf : MeromorphicOn f ) :
:=
fun r z, (max 0 ((hf.restrict |r|).divisor z)) * log (r * z⁻¹)
noncomputable def MeromorphicOn.N_infty
{f : }
(hf : MeromorphicOn f ) :
:=
fun r z, (max 0 (-((hf.restrict |r|).divisor z))) * log (r * z⁻¹)
theorem Nevanlinna_counting₁₁
{f : }
(hf : MeromorphicOn f )
(a : ) :
(hf.add (MeromorphicOn.const a)).N_infty = hf.N_infty := by
funext r
unfold MeromorphicOn.N_infty
let A := (hf.restrict |r|).divisor.finiteSupport (isCompact_closedBall 0 |r|)
repeat
rw [finsum_eq_sum_of_support_subset (s := A.toFinset)]
apply Finset.sum_congr rfl
intro x hx; simp at hx
congr 2
by_cases h : 0 (hf.restrict |r|).divisor x
· simp [h]
let A := (hf.restrict |r|).divisor_add_const₁ a h
exact A
· simp at h
have h' : 0 -((hf.restrict |r|).divisor x) := by
apply Int.le_neg_of_le_neg
simp
exact Int.le_of_lt h
simp [h']
clear h'
have A := (hf.restrict |r|).divisor_add_const₂ a h
have A' : 0 -((MeromorphicOn.add (MeromorphicOn.restrict hf |r|) (MeromorphicOn.const a)).divisor x) := by
apply Int.le_neg_of_le_neg
simp
exact Int.le_of_lt A
simp [A']
clear A A'
exact (hf.restrict |r|).divisor_add_const₃ a h
--
intro x
contrapose
simp
intro hx
rw [hx]
tauto
--
intro x
contrapose
simp
intro hx
have : 0 (hf.restrict |r|).divisor x := by
rw [hx]
have G := (hf.restrict |r|).divisor_add_const₁ a this
clear this
simp [G]
theorem Nevanlinna_counting'₁₁
{f : }
(hf : MeromorphicOn f )
(a : ) :
(hf.sub (MeromorphicOn.const a)).N_infty = hf.N_infty := by
have : (f - fun x => a) = (f + fun x => -a) := by
funext x
simp; ring
have : (hf.sub (MeromorphicOn.const a)).N_infty = (hf.add (MeromorphicOn.const (-a))).N_infty := by
simp
rw [this]
exact Nevanlinna_counting₁₁ hf (-a)
theorem Nevanlinna_counting₀
{f : }
(hf : MeromorphicOn f ) :
hf.inv.N_infty = hf.N_zero := by
funext r
unfold MeromorphicOn.N_zero MeromorphicOn.N_infty
let A := (hf.restrict |r|).divisor.finiteSupport (isCompact_closedBall 0 |r|)
repeat
rw [finsum_eq_sum_of_support_subset (s := A.toFinset)]
apply Finset.sum_congr rfl
intro x hx
congr
let B := hf.restrict_inv |r|
rw [MeromorphicOn.divisor_inv]
simp
--
exact fun x a => hf x trivial
--
intro x
contrapose
simp
intro hx
rw [hx]
tauto
--
intro x
contrapose
simp
intro hx h₁x
rw [MeromorphicOn.divisor_inv (hf.restrict |r|)] at h₁x
simp at h₁x
rw [hx] at h₁x
tauto
theorem Nevanlinna_counting
{f : }
(hf : MeromorphicOn f ) :
hf.N_zero - hf.N_infty = fun r z, ((hf.restrict |r|).divisor z) * log (r * z⁻¹) := by
funext r
simp only [Pi.sub_apply]
unfold MeromorphicOn.N_zero MeromorphicOn.N_infty
let A := (hf.restrict |r|).divisor.finiteSupport (isCompact_closedBall 0 |r|)
repeat
rw [finsum_eq_sum_of_support_subset (s := A.toFinset)]
rw [ Finset.sum_sub_distrib]
simp_rw [ sub_mul]
congr
funext x
congr
by_cases h : 0 (hf.restrict |r|).divisor x
· simp [h]
· have h' : 0 -((hf.restrict |r|).divisor x) := by
simp at h
apply Int.le_neg_of_le_neg
simp
exact Int.le_of_lt h
simp at h
simp [h']
linarith
--
repeat
intro x
contrapose
simp
intro hx
rw [hx]
tauto
--
noncomputable def MeromorphicOn.m_infty
{f : }
(_ : MeromorphicOn f ) :
:=
fun r (2 * π)⁻¹ * x in (0)..(2 * π), logpos f (circleMap 0 r x)
theorem Nevanlinna_proximity
{f : }
{r : }
(h₁f : MeromorphicOn f ) :
(2 * π)⁻¹ * x in (0)..(2 * π), log f (circleMap 0 r x) = (h₁f.m_infty r) - (h₁f.inv.m_infty r) := by
unfold MeromorphicOn.m_infty
rw [ mul_sub]; congr
rw [ intervalIntegral.integral_sub]; congr
funext x
simp_rw [loglogpos]; congr
exact Eq.symm (IsAbsoluteValue.abv_inv Norm.norm (f (circleMap 0 r x)))
--
apply MeromorphicOn.integrable_logpos_abs_f
intro z hx
exact h₁f z trivial
--
apply MeromorphicOn.integrable_logpos_abs_f
exact MeromorphicOn.inv_iff.mpr fun x a => h₁f x trivial
noncomputable def MeromorphicOn.T_infty
{f : }
(hf : MeromorphicOn f ) :
:=
hf.m_infty + hf.N_infty
theorem Nevanlinna_firstMain₁
{f : }
(h₁f : MeromorphicOn f )
(h₂f : StronglyMeromorphicAt f 0)
(h₃f : f 0 0) :
(fun _ log f 0) + h₁f.inv.T_infty = h₁f.T_infty := by
rw [add_eq_of_eq_sub]
unfold MeromorphicOn.T_infty
have {A B C D : } : A + B - (C + D) = A - C - (D - B) := by
ring
rw [this]
clear this
rw [Nevanlinna_counting₀ h₁f]
rw [Nevanlinna_counting h₁f]
funext r
simp
rw [ Nevanlinna_proximity h₁f]
by_cases h₁r : r = 0
rw [h₁r]
simp
have : π⁻¹ * 2⁻¹ * (2 * π * log (Complex.abs (f 0))) = (π⁻¹ * (2⁻¹ * 2) * π) * log (Complex.abs (f 0)) := by
ring
rw [this]
clear this
simp [pi_ne_zero]
by_cases hr : 0 < r
let A := jensen hr f (h₁f.restrict r) h₂f h₃f
simp at A
rw [A]
clear A
simp
have {A B : } : -A + B = B - A := by ring
rw [this]
have : |r| = r := by
rw [ abs_of_pos hr]
simp
rw [this]
-- case 0 < -r
have h₂r : 0 < -r := by
simp [h₁r, hr]
by_contra hCon
-- Assume ¬(r < 0), which means r >= 0
push_neg at hCon
-- Now h is r ≥ 0, so we split into cases
rcases lt_or_eq_of_le hCon with h|h
· tauto
· tauto
let A := jensen h₂r f (h₁f.restrict (-r)) h₂f h₃f
simp at A
rw [A]
clear A
simp
have {A B : } : -A + B = B - A := by ring
rw [this]
congr 1
congr 1
let A := integrabl_congr_negRadius (f := (fun z log (Complex.abs (f z)))) (r := r)
rw [A]
have : |r| = -r := by
rw [ abs_of_pos h₂r]
simp
rw [this]
theorem Nevanlinna_firstMain₂
{f : }
{a : }
{r : }
(h₁f : MeromorphicOn f ) :
|(h₁f.T_infty r) - ((h₁f.sub (MeromorphicOn.const a)).T_infty r)| logpos a + log 2 := by
-- See Lang, p. 168
have : (h₁f.T_infty r) - ((h₁f.sub (MeromorphicOn.const a)).T_infty r) = (h₁f.m_infty r) - ((h₁f.sub (MeromorphicOn.const a)).m_infty r) := by
unfold MeromorphicOn.T_infty
rw [Nevanlinna_counting'₁₁ h₁f a]
simp
rw [this]
clear this
unfold MeromorphicOn.m_infty
rw [mul_sub]
rw [intervalIntegral.integral_sub]
let g := f - (fun _ a)
have t₀₀ (x : ) : log f (circleMap 0 r x) log g (circleMap 0 r x) + log a + log 2 := by
unfold g
simp only [Pi.sub_apply]
calc log f (circleMap 0 r x)
_ = log g (circleMap 0 r x) + a := by
unfold g
simp
_ log (g (circleMap 0 r x) + a) := by
apply monoOn_logpos
refine Set.mem_Ici.mpr ?_
apply norm_nonneg
refine Set.mem_Ici.mpr ?_
apply add_nonneg
apply norm_nonneg
apply norm_nonneg
--
apply norm_add_le
_ log g (circleMap 0 r x) + log a + log 2 := by
apply logpos_add_le_add_logpos_add_log2
have t₁₀ (x : ) : log f (circleMap 0 r x) - log g (circleMap 0 r x) log a + log 2 := by
rw [sub_le_iff_le_add]
nth_rw 1 [add_comm]
rw [add_assoc]
apply t₀₀ x
clear t₀₀
have t₀₁ (x : ) : log g (circleMap 0 r x) log f (circleMap 0 r x) + log a + log 2 := by
unfold g
simp only [Pi.sub_apply]
calc log g (circleMap 0 r x)
_ = log f (circleMap 0 r x) - a := by
unfold g
simp
_ log (f (circleMap 0 r x) + a) := by
apply monoOn_logpos
refine Set.mem_Ici.mpr ?_
apply norm_nonneg
refine Set.mem_Ici.mpr ?_
apply add_nonneg
apply norm_nonneg
apply norm_nonneg
--
apply norm_sub_le
_ log f (circleMap 0 r x) + log a + log 2 := by
apply logpos_add_le_add_logpos_add_log2
have t₁₁ (x : ) : log g (circleMap 0 r x) - log f (circleMap 0 r x) log a + log 2 := by
rw [sub_le_iff_le_add]
nth_rw 1 [add_comm]
rw [add_assoc]
apply t₀₁ x
clear t₀₁
have t₂ {x : } : log f (circleMap 0 r x) - log g (circleMap 0 r x) log a + log 2 := by
by_cases h : 0 log f (circleMap 0 r x) - log g (circleMap 0 r x)
· rw [norm_of_nonneg h]
exact t₁₀ x
· rw [norm_of_nonpos (by linarith)]
rw [neg_sub]
exact t₁₁ x
clear t₁₀ t₁₁
have s₀ : (x : ) in (0)..(2 * π), log f (circleMap 0 r x) - log g (circleMap 0 r x) (log a + log 2) * |2 * π - 0| := by
apply intervalIntegral.norm_integral_le_of_norm_le_const
intro x hx
exact t₂
clear t₂
simp only [norm_eq_abs, sub_zero] at s₀
rw [abs_mul]
have s₁ : |(2 * π)⁻¹| * | (x : ) in (0)..(2 * π), log f (circleMap 0 r x) - log g (circleMap 0 r x)| |(2 * π)⁻¹| * ((log a + log 2) * |2 * π|) := by
apply mul_le_mul_of_nonneg_left
exact s₀
apply abs_nonneg
have : |(2 * π)⁻¹| * ((log a + log 2) * |2 * π|) = log a + log 2 := by
rw [mul_comm, mul_assoc]
have : |2 * π| * |(2 * π)⁻¹| = 1 := by
rw [abs_mul, abs_inv, abs_mul]
rw [abs_of_pos pi_pos]
simp [pi_ne_zero]
ring_nf
simp [pi_ne_zero]
rw [this]
simp
rw [this] at s₁
assumption
--
apply MeromorphicOn.integrable_logpos_abs_f
exact fun x a => h₁f x trivial
--
apply MeromorphicOn.integrable_logpos_abs_f
apply MeromorphicOn.sub
exact fun x a => h₁f x trivial
apply MeromorphicOn.const a
open Asymptotics
theorem Nevanlinna_firstMain'₂
{f : }
{a : }
(h₁f : MeromorphicOn f ) :
|(h₁f.T_infty) - ((h₁f.sub (MeromorphicOn.const a)).T_infty)| =O[Filter.atTop] (1 : ) := by
rw [Asymptotics.isBigO_iff']
use logpos a + log 2
constructor
· apply add_pos_of_nonneg_of_pos
apply logpos_nonneg
apply log_pos one_lt_two
· rw [Filter.eventually_atTop]
use 0
intro b hb
simp only [Pi.abs_apply, Pi.sub_apply, norm_eq_abs, abs_abs, Pi.one_apply,
norm_one, mul_one]
apply Nevanlinna_firstMain₂

View File

@@ -1,9 +1,9 @@
import Nevanlinna.laplace
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace F]
variable {F₁ : Type*} [NormedAddCommGroup F₁] [NormedSpace F₁] [CompleteSpace F₁]
variable {F₁ : Type*} [NormedAddCommGroup F₁] [NormedSpace F₁]
variable {G : Type*} [NormedAddCommGroup G] [NormedSpace G]
variable {G₁ : Type*} [NormedAddCommGroup G₁] [NormedSpace G₁] [CompleteSpace G₁]
variable {G₁ : Type*} [NormedAddCommGroup G₁] [NormedSpace G₁]
def Harmonic (f : F) : Prop :=
@@ -22,7 +22,7 @@ theorem HarmonicAt_iff
HarmonicAt f x s : Set , IsOpen s x s (ContDiffOn 2 f s) ( z s, Δ f z = 0) := by
constructor
· intro hf
obtain s₁, h₁s₁, h₂s₁, h₃s₁ := hf.1.contDiffOn' le_rfl
obtain s₁, h₁s₁, h₂s₁, h₃s₁ := hf.1.contDiffOn' le_rfl (by trivial)
simp at h₃s₁
obtain t₂, h₁t₂, h₂t₂ := (Filter.eventuallyEq_iff_exists_mem.1 hf.2)
obtain s₂, h₁s₂, h₂s₂, h₃s₂ := mem_nhds_iff.1 h₁t₂
@@ -261,7 +261,7 @@ theorem harmonicAt_comp_CLM_is_harmonicAt
apply ContDiffAt.continuousLinearMap_comp
exact h.1
· -- Δ (⇑l ∘ f) =ᶠ[nhds z] 0
obtain r, h₁r, h₂r := h.1.contDiffOn le_rfl
obtain r, h₁r, h₂r := h.1.contDiffOn le_rfl (by trivial)
obtain s, h₁s, h₂s, h₃s := mem_nhds_iff.1 h₁r
obtain t, h₁t, h₂t := Filter.eventuallyEq_iff_exists_mem.1 h.2
obtain u, h₁u, h₂u, h₃u := mem_nhds_iff.1 h₁t

View File

@@ -63,7 +63,7 @@ theorem harmonic_meanValue
nth_rw 1 [mul_comm]
rw [ mul_assoc]
simp
apply inv_mul_cancel
apply inv_mul_cancel
apply circleMap_ne_center
exact Ne.symm (ne_of_lt hR)
have t'₁ {θ : } : circleMap 0 R θ = circleMap z R θ - z := by

View File

@@ -1,4 +1,4 @@
import Mathlib.Analysis.Complex.TaylorSeries
import Mathlib.Analysis.Complex.CauchyIntegral
import Nevanlinna.cauchyRiemann
variable {E : Type*} [NormedAddCommGroup E] [NormedSpace E]
@@ -110,6 +110,38 @@ theorem HolomorphicAt_neg
exact h₂UF z hz
theorem HolomorphicAt.analyticAt
[CompleteSpace F]
{f : F}
{x : } :
HolomorphicAt f x AnalyticAt f x := by
intro hf
obtain s, h₁s, h₂s, h₃s := HolomorphicAt_iff.1 hf
apply DifferentiableOn.analyticAt (s := s)
intro z hz
apply DifferentiableAt.differentiableWithinAt
apply h₃s
exact hz
exact IsOpen.mem_nhds h₁s h₂s
theorem AnalyticAt.holomorphicAt
[CompleteSpace F]
{f : F}
{x : } :
AnalyticAt f x HolomorphicAt f x := by
intro hf
rw [HolomorphicAt_iff]
use {x : | AnalyticAt f x}
constructor
· exact isOpen_analyticAt f
· constructor
· simpa
· intro z hz
simp at hz
exact differentiableAt hz
theorem HolomorphicAt.contDiffAt
[CompleteSpace F]
{f : F}

View File

@@ -1,157 +0,0 @@
import Nevanlinna.harmonicAt_examples
import Nevanlinna.harmonicAt_meanValue
import Nevanlinna.specialFunctions_CircleIntegral_affine
theorem jensen_case_R_eq_one
(f : )
(h₁f : Differentiable f)
(h₂f : f 0 0)
(S : Finset )
(a : S )
(ha : s, a s Metric.ball 0 1)
(F : )
(h₁F : Differentiable F)
(h₂F : z, F z 0)
(h₃F : f = fun z (F z) * s : S, (z - a s))
:
Real.log f 0 = - s, Real.log (a s⁻¹) + (2 * Real.pi)⁻¹ * (x : ) in (0)..2 * Real.pi, Real.log f (circleMap 0 1 x) := by
let logAbsF := fun w Real.log F w
have t₀ : z Metric.ball 0 2, HarmonicAt logAbsF z := by
intro z _
apply logabs_of_holomorphicAt_is_harmonic
apply h₁F.holomorphicAt
exact h₂F z
have t₁ : ( (x : ) in (0)..2 * Real.pi, logAbsF (circleMap 0 1 x)) = 2 * Real.pi * logAbsF 0 := by
have hR : (0 : ) < (1 : ) := by apply Real.zero_lt_one
have hρ : (1 : ) < (2 : ) := by linarith
apply harmonic_meanValue 2 1 hR hρ t₀
have t₂ : s, f (a s) = 0 := by
intro s
rw [h₃F]
simp
right
apply Finset.prod_eq_zero_iff.2
use s
simp
let logAbsf := fun w Real.log f w
have s₀ : z, f z 0 logAbsf z = logAbsF z + s, Real.log z - a s := by
intro z hz
dsimp [logAbsf]
rw [h₃F]
simp_rw [Complex.abs.map_mul]
rw [Complex.abs_prod]
rw [Real.log_mul]
rw [Real.log_prod]
rfl
intro s hs
simp
by_contra ha'
rw [ha'] at hz
exact hz (t₂ s)
-- Complex.abs (F z) ≠ 0
simp
exact h₂F z
-- ∏ I : { x // x ∈ S }, Complex.abs (z - a I) ≠ 0
by_contra h'
obtain s, h's, h'' := Finset.prod_eq_zero_iff.1 h'
simp at h''
rw [h''] at hz
let A := t₂ s
exact hz A
have s₁ : z, f z 0 logAbsF z = logAbsf z - s, Real.log z - a s := by
intro z hz
rw [s₀ z hz]
simp
rw [s₁ 0 h₂f] at t₁
have h₀ {x : } : f (circleMap 0 1 x) 0 := by
rw [h₃F]
simp
constructor
· exact h₂F (circleMap 0 1 x)
· by_contra h'
obtain s, _, h₂s := Finset.prod_eq_zero_iff.1 h'
have : circleMap 0 1 x = a s := by
rw [ sub_zero (circleMap 0 1 x)]
nth_rw 2 [ h₂s]
simp
let A := ha s
rw [ this] at A
simp at A
simp_rw [s₁ (circleMap 0 1 _) h₀] at t₁
rw [intervalIntegral.integral_sub] at t₁
rw [intervalIntegral.integral_finset_sum] at t₁
simp_rw [int₀ (ha _)] at t₁
simp at t₁
rw [t₁]
simp
have {w : } : Real.pi⁻¹ * 2⁻¹ * (2 * Real.pi * w) = w := by
ring_nf
simp [mul_inv_cancel Real.pi_ne_zero]
rw [this]
simp
rfl
-- ∀ i ∈ Finset.univ, IntervalIntegrable (fun x => Real.log ‖circleMap 0 1 x - a i‖) MeasureTheory.volume 0 (2 * Real.pi)
intro i _
apply Continuous.intervalIntegrable
apply continuous_iff_continuousAt.2
intro x
have : (fun x => Real.log circleMap 0 1 x - a i) = Real.log Complex.abs (fun x circleMap 0 1 x - a i) :=
rfl
rw [this]
apply ContinuousAt.comp
apply Real.continuousAt_log
simp
by_contra ha'
let A := ha i
rw [ ha'] at A
simp at A
apply ContinuousAt.comp
apply Complex.continuous_abs.continuousAt
fun_prop
-- IntervalIntegrable (fun x => logAbsf (circleMap 0 1 x)) MeasureTheory.volume 0 (2 * Real.pi)
apply Continuous.intervalIntegrable
apply continuous_iff_continuousAt.2
intro x
have : (fun x => logAbsf (circleMap 0 1 x)) = Real.log Complex.abs f (fun x circleMap 0 1 x) :=
rfl
rw [this]
apply ContinuousAt.comp
simp
exact h₀
apply ContinuousAt.comp
apply Complex.continuous_abs.continuousAt
apply ContinuousAt.comp
apply h₁f.continuous.continuousAt
let A := continuous_circleMap 0 1
apply A.continuousAt
-- IntervalIntegrable (fun x => ∑ s : { x // x ∈ S }, Real.log ‖circleMap 0 1 x - a s‖) MeasureTheory.volume 0 (2 * Real.pi)
apply Continuous.intervalIntegrable
apply continuous_finset_sum
intro i _
apply continuous_iff_continuousAt.2
intro x
have : (fun x => Real.log circleMap 0 1 x - a i) = Real.log Complex.abs (fun x circleMap 0 1 x - a i) :=
rfl
rw [this]
apply ContinuousAt.comp
apply Real.continuousAt_log
simp
by_contra ha'
let A := ha i
rw [ ha'] at A
simp at A
apply ContinuousAt.comp
apply Complex.continuous_abs.continuousAt
fun_prop

View File

@@ -1,41 +0,0 @@
import Mathlib.Analysis.Complex.CauchyIntegral
import Nevanlinna.harmonicAt_examples
import Nevanlinna.harmonicAt_meanValue
import Mathlib.Analysis.Analytic.IsolatedZeros
lemma xx
{f : }
{S : Set }
(h₁S : IsPreconnected S)
(h₂S : IsCompact S)
(hf : s S, AnalyticAt f s) :
o : , F : , z S, (AnalyticAt F z) (F z 0) (f z = F z * s S, (z - s) ^ (o s)) := by
let o : := by
intro z
if hz : z S then
let A := hf z hz
let B := A.order
exact (A.order : )
else
exact 0
sorry
theorem jensen_case_R_eq_one'
(f : )
(h₁f : Differentiable f)
(h₂f : f 0 0)
(S : Finset )
(a : S )
(ha : s, a s Metric.ball 0 1)
(F : )
(h₁F : Differentiable F)
(h₂F : z, F z 0)
(h₃F : f = fun z (F z) * s : S, (z - a s))
:
Real.log f 0 = - s, Real.log (a s⁻¹) + (2 * Real.pi)⁻¹ * (x : ) in (0)..2 * Real.pi, Real.log f (circleMap 0 1 x) := by
sorry

View File

@@ -204,7 +204,7 @@ theorem harmonic_is_realOfHolomorphic
--DifferentiableAt (partialDeriv _ f)
repeat
apply ContDiffAt.differentiableAt
apply ContDiffAt.differentiableAt (n := 1)
apply partialDeriv_contDiffAt (hf x hx).1
apply le_rfl
@@ -277,7 +277,7 @@ theorem harmonic_is_realOfHolomorphic
intro x hx
rw [fderivWithin_eq_fderiv, fderivWithin_eq_fderiv]
rw [fderiv.comp]
rw [fderiv_comp]
simp
apply ContinuousLinearMap.ext
intro w

View File

@@ -666,10 +666,10 @@ theorem primitive_additivity'
dsimp [ε']; simp
have : |ε| = ε := by apply abs_of_pos h₁ε
rw [this]
apply (inv_mul_lt_iff zero_lt_two).mpr
apply (inv_mul_lt_iff zero_lt_two).mpr
linarith
have h₁ε' : 0 < ε' := by
apply Real.mul_pos _ h₁ε
apply mul_pos _ h₁ε
apply inv_pos.mpr
exact zero_lt_two

View File

@@ -1,358 +0,0 @@
import Init.Classical
import Mathlib.Analysis.Analytic.Meromorphic
import Mathlib.Topology.ContinuousOn
import Mathlib.Analysis.Analytic.IsolatedZeros
import Nevanlinna.holomorphic
import Nevanlinna.analyticOn_zeroSet
noncomputable def zeroDivisor
(f : ) :
:= by
intro z
by_cases hf : AnalyticAt f z
· exact hf.order.toNat
· exact 0
theorem analyticAtZeroDivisorSupport
{f : }
{z : }
(h : z Function.support (zeroDivisor f)) :
AnalyticAt f z := by
by_contra h₁f
simp at h
dsimp [zeroDivisor] at h
simp [h₁f] at h
theorem zeroDivisor_eq_ord_AtZeroDivisorSupport
{f : }
{z : }
(h : z Function.support (zeroDivisor f)) :
zeroDivisor f z = (analyticAtZeroDivisorSupport h).order.toNat := by
unfold zeroDivisor
simp [analyticAtZeroDivisorSupport h]
theorem zeroDivisor_eq_ord_AtZeroDivisorSupport'
{f : }
{z : }
(h : z Function.support (zeroDivisor f)) :
zeroDivisor f z = (analyticAtZeroDivisorSupport h).order := by
unfold zeroDivisor
simp [analyticAtZeroDivisorSupport h]
sorry
lemma toNatEqSelf_iff {n : } : n.toNat = n m : , m = n := by
constructor
· intro H₁
rw [ ENat.some_eq_coe, WithTop.ne_top_iff_exists]
by_contra H₂
rw [H₂] at H₁
simp at H₁
· intro H
obtain m, hm := H
rw [ hm]
simp
lemma natural_if_toNatNeZero {n : } : n.toNat 0 m : , m = n := by
rw [ ENat.some_eq_coe, WithTop.ne_top_iff_exists]
contrapose; simp; tauto
theorem zeroDivisor_localDescription
{f : }
{z₀ : }
(h : z₀ Function.support (zeroDivisor f)) :
(g : ), AnalyticAt g z₀ g z₀ 0 (z : ) in nhds z₀, f z = (z - z₀) ^ (zeroDivisor f z₀) g z := by
have A : zeroDivisor f z₀ 0 := by exact h
let B := zeroDivisor_eq_ord_AtZeroDivisorSupport h
rw [B] at A
have C := natural_if_toNatNeZero A
obtain m, hm := C
have h₂m : m 0 := by
rw [ hm] at A
simp at A
assumption
rw [eq_comm] at hm
let E := AnalyticAt.order_eq_nat_iff (analyticAtZeroDivisorSupport h) m
let F := hm
rw [E] at F
have : m = zeroDivisor f z₀ := by
rw [B, hm]
simp
rwa [this] at F
theorem zeroDivisor_zeroSet
{f : }
{z₀ : }
(h : z₀ Function.support (zeroDivisor f)) :
f z₀ = 0 := by
obtain g, _, _, h₃ := zeroDivisor_localDescription h
rw [Filter.Eventually.self_of_nhds h₃]
simp
left
exact h
theorem zeroDivisor_support_iff
{f : }
{z₀ : } :
z₀ Function.support (zeroDivisor f)
f z₀ = 0
AnalyticAt f z₀
(g : ), AnalyticAt g z₀ g z₀ 0 (z : ) in nhds z₀, f z = (z - z₀) ^ (zeroDivisor f z₀) g z := by
constructor
· intro hz
constructor
· exact zeroDivisor_zeroSet hz
· constructor
· exact analyticAtZeroDivisorSupport hz
· exact zeroDivisor_localDescription hz
· intro h₁, h₂, h₃
have : zeroDivisor f z₀ = (h₂.order).toNat := by
unfold zeroDivisor
simp [h₂]
simp [this]
simp [(h₂.order_eq_nat_iff (zeroDivisor f z₀)).2 h₃]
obtain g, h₁g, h₂g, h₃g := h₃
rw [Filter.Eventually.self_of_nhds h₃g] at h₁
simp [h₂g] at h₁
assumption
theorem topOnPreconnected
{f : }
{U : Set }
(hU : IsPreconnected U)
(h₁f : AnalyticOn f U)
(h₂f : z U, f z 0) :
(hz : z U), (h₁f z hz).order := by
by_contra H
push_neg at H
obtain z', hz' := H
rw [AnalyticAt.order_eq_top_iff] at hz'
rw [ AnalyticAt.frequently_zero_iff_eventually_zero (h₁f z z')] at hz'
have A := AnalyticOn.eqOn_zero_of_preconnected_of_frequently_eq_zero h₁f hU z' hz'
tauto
theorem supportZeroSet
{f : }
{U : Set }
(hU : IsPreconnected U)
(h₁f : AnalyticOn f U)
(h₂f : z U, f z 0) :
U Function.support (zeroDivisor f) = U f⁻¹' {0} := by
ext x
constructor
· intro hx
constructor
· exact hx.1
exact zeroDivisor_zeroSet hx.2
· simp
intro h₁x h₂x
constructor
· exact h₁x
· let A := zeroDivisor_support_iff (f := f) (z₀ := x)
simp at A
rw [A]
constructor
· exact h₂x
· constructor
· exact h₁f x h₁x
· have B := AnalyticAt.order_eq_nat_iff (h₁f x h₁x) (zeroDivisor f x)
simp at B
rw [ B]
dsimp [zeroDivisor]
simp [h₁f x h₁x]
refine Eq.symm (ENat.coe_toNat ?h.mpr.right.right.right.a)
exact topOnPreconnected hU h₁f h₂f h₁x
theorem discreteZeros
{f : } :
DiscreteTopology (Function.support (zeroDivisor f)) := by
simp_rw [ singletons_open_iff_discrete, Metric.isOpen_singleton_iff]
intro z
have A : zeroDivisor f z 0 := by exact z.2
let B := zeroDivisor_eq_ord_AtZeroDivisorSupport z.2
rw [B] at A
have C := natural_if_toNatNeZero A
obtain m, hm := C
have h₂m : m 0 := by
rw [ hm] at A
simp at A
assumption
rw [eq_comm] at hm
let E := AnalyticAt.order_eq_nat_iff (analyticAtZeroDivisorSupport z.2) m
rw [E] at hm
obtain g, h₁g, h₂g, h₃g := hm
rw [Metric.eventually_nhds_iff_ball] at h₃g
have : ε > 0, y Metric.ball (z) ε, g y 0 := by
have h₄g : ContinuousAt g z := AnalyticAt.continuousAt h₁g
have : {0} nhds (g z) := by
exact compl_singleton_mem_nhds_iff.mpr h₂g
let F := h₄g.preimage_mem_nhds this
rw [Metric.mem_nhds_iff] at F
obtain ε, h₁ε, h₂ε := F
use ε
constructor; exact h₁ε
intro y hy
let G := h₂ε hy
simp at G
exact G
obtain ε₁, h₁ε₁ := this
obtain ε₂, h₁ε₂, h₂ε₂ := h₃g
use min ε₁ ε₂
constructor
· have : 0 < min ε₁ ε₂ := by
rw [lt_min_iff]
exact And.imp_right (fun _ => h₁ε₂) h₁ε₁
exact this
intro y
intro h₁y
have h₂y : y Metric.ball (z) ε₂ := by
simp
calc dist y z
_ < min ε₁ ε₂ := by assumption
_ ε₂ := by exact min_le_right ε₁ ε₂
have h₃y : y Metric.ball (z) ε₁ := by
simp
calc dist y z
_ < min ε₁ ε₂ := by assumption
_ ε₁ := by exact min_le_left ε₁ ε₂
let F := h₂ε₂ y.1 h₂y
rw [zeroDivisor_zeroSet y.2] at F
simp at F
simp [h₂m] at F
have : g y.1 0 := by
exact h₁ε₁.2 y h₃y
simp [this] at F
ext
rwa [sub_eq_zero] at F
theorem zeroDivisor_finiteOnCompact
{f : }
{U : Set }
(hU : IsPreconnected U)
(h₁f : AnalyticOn f U)
(h₂f : z U, f z 0) -- not needed!
(h₂U : IsCompact U) :
Set.Finite (U Function.support (zeroDivisor f)) := by
have hinter : IsCompact (U Function.support (zeroDivisor f)) := by
apply IsCompact.of_isClosed_subset h₂U
rw [supportZeroSet]
apply h₁f.continuousOn.preimage_isClosed_of_isClosed
exact IsCompact.isClosed h₂U
exact isClosed_singleton
assumption
assumption
assumption
exact Set.inter_subset_left
apply hinter.finite
apply DiscreteTopology.of_subset (s := Function.support (zeroDivisor f))
exact discreteZeros (f := f)
exact Set.inter_subset_right
noncomputable def zeroDivisorDegree
{f : }
{U : Set }
(h₁U : IsPreconnected U) -- not needed!
(h₂U : IsCompact U)
(h₁f : AnalyticOn f U)
(h₂f : z U, f z 0) : -- not needed!
:= (zeroDivisor_finiteOnCompact h₁U h₁f h₂f h₂U).toFinset.card
lemma zeroDivisorDegreeZero
{f : }
{U : Set }
(h₁U : IsPreconnected U) -- not needed!
(h₂U : IsCompact U)
(h₁f : AnalyticOn f U)
(h₂f : z U, f z 0) : -- not needed!
0 = zeroDivisorDegree h₁U h₂U h₁f h₂f U (zeroDivisor f).support = := by
sorry
lemma eliminatingZeros₀
{U : Set }
(h₁U : IsPreconnected U)
(h₂U : IsCompact U) :
n : , f : , (h₁f : AnalyticOn f U) (h₂f : z U, f z 0)
(n = zeroDivisorDegree h₁U h₂U h₁f h₂f)
F : , (AnalyticOn F U) (f = F * a (U (zeroDivisor f).support), fun z (z - a) ^ (zeroDivisor f a)) := by
intro n
induction' n with n ih
-- case zero
intro f h₁f h₂f h₃f
use f
rw [zeroDivisorDegreeZero] at h₃f
rw [h₃f]
simpa
-- case succ
intro f h₁f h₂f h₃f
let Supp := (zeroDivisor_finiteOnCompact h₁U h₁f h₂f h₂U).toFinset
have : Supp.Nonempty := by
rw [ Finset.one_le_card]
calc 1
_ n + 1 := by exact Nat.le_add_left 1 n
_ = zeroDivisorDegree h₁U h₂U h₁f h₂f := by exact h₃f
_ = Supp.card := by rfl
obtain z₀, hz₀ := this
dsimp [Supp] at hz₀
simp only [Set.Finite.mem_toFinset, Set.mem_inter_iff] at hz₀
let A := AnalyticOn.order_eq_nat_iff h₁f hz₀.1 (zeroDivisor f z₀)
let B := zeroDivisor_eq_ord_AtZeroDivisorSupport hz₀.2
let B := zeroDivisor_eq_ord_AtZeroDivisorSupport' hz₀.2
rw [eq_comm] at B
let C := A B
obtain g₀, h₁g₀, h₂g₀, h₃g₀ := C
have h₄g₀ : z U, g₀ z 0 := by sorry
have h₅g₀ : n = zeroDivisorDegree h₁U h₂U h₁g₀ h₄g₀ := by sorry
obtain F, h₁F, h₂F := ih g₀ h₁g₀ h₄g₀ h₅g₀
use F
constructor
· assumption
·
sorry

View File

@@ -0,0 +1,148 @@
import Mathlib.MeasureTheory.Integral.CircleIntegral
import Nevanlinna.periodic_integrability
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
/- Integral and Integrability up to changes on codiscrete sets -/
theorem d
{U S : Set }
{c : }
{r : }
(hr : r 0)
(hU : Metric.sphere c |r| U)
(hS : S Filter.codiscreteWithin U) :
Countable ((circleMap c r)⁻¹' S) := by
have : (circleMap c r)⁻¹' (S U) = (circleMap c r)⁻¹' S := by
simp [(by simpa : (circleMap c r)⁻¹' U = )]
rw [ this]
apply Set.Countable.preimage_circleMap _ c hr
have : DiscreteTopology ((S U) : Set ) := by
rw [discreteTopology_subtype_iff]
rw [mem_codiscreteWithin] at hS; simp at hS
intro x hx
rw [ mem_iff_inf_principal_compl, (by ext z; simp; tauto : S U = (U \ S))]
rw [Set.compl_union, compl_compl] at hx
exact hS x hx.2
apply TopologicalSpace.separableSpace_iff_countable.1
exact TopologicalSpace.SecondCountableTopology.to_separableSpace
theorem integrability_congr_changeDiscrete₀
{f₁ f₂ : }
{U : Set }
{r : }
(hU : Metric.sphere 0 |r| U)
(hf : f₁ =[Filter.codiscreteWithin U] f₂) :
IntervalIntegrable (f₁ (circleMap 0 r)) MeasureTheory.volume 0 (2 * π) IntervalIntegrable (f₂ (circleMap 0 r)) MeasureTheory.volume 0 (2 * π) := by
intro hf₁
by_cases hr : r = 0
· unfold circleMap
rw [hr]
simp
have : f₂ (fun (θ : ) 0) = (fun r f₂ 0) := by
exact rfl
rw [this]
simp
· apply IntervalIntegrable.congr hf₁
rw [Filter.eventuallyEq_iff_exists_mem]
use (circleMap 0 r)⁻¹' {z | f₁ z = f₂ z}
constructor
· apply Set.Countable.measure_zero (d hr hU hf)
· tauto
theorem integrability_congr_changeDiscrete
{f₁ f₂ : }
{U : Set }
{r : }
(hU : Metric.sphere (0 : ) |r| U)
(hf : f₁ =[Filter.codiscreteWithin U] f₂) :
IntervalIntegrable (f₁ (circleMap 0 r)) MeasureTheory.volume 0 (2 * π) IntervalIntegrable (f₂ (circleMap 0 r)) MeasureTheory.volume 0 (2 * π) := by
constructor
· exact integrability_congr_changeDiscrete₀ hU hf
· exact integrability_congr_changeDiscrete₀ hU (EventuallyEq.symm hf)
theorem integral_congr_changeDiscrete
{f₁ f₂ : }
{U : Set }
{r : }
(hr : r 0)
(hU : Metric.sphere 0 |r| U)
(hf : f₁ =[Filter.codiscreteWithin U] f₂) :
(x : ) in (0)..(2 * π), f₁ (circleMap 0 r x) = (x : ) in (0)..(2 * π), f₂ (circleMap 0 r x) := by
apply intervalIntegral.integral_congr_ae
rw [eventually_iff_exists_mem]
use (circleMap 0 r)⁻¹' {z | f₁ z = f₂ z}
constructor
· apply Set.Countable.measure_zero (d hr hU hf)
· tauto
lemma circleMap_neg
{r x : } :
circleMap 0 (-r) x = circleMap 0 r (x + π) := by
unfold circleMap
simp
rw [add_mul]
rw [Complex.exp_add]
simp
theorem integrability_congr_negRadius
{f : }
{r : } :
IntervalIntegrable (fun (θ : ) f (circleMap 0 r θ)) MeasureTheory.volume 0 (2 * π)
IntervalIntegrable (fun (θ : ) f (circleMap 0 (-r) θ)) MeasureTheory.volume 0 (2 * π) := by
intro h
simp_rw [circleMap_neg]
let A := IntervalIntegrable.comp_add_right h π
have t₀ : Function.Periodic (fun (θ : ) f (circleMap 0 r θ)) (2 * π) := by
intro x
simp
congr 1
exact periodic_circleMap 0 r x
rw [ zero_add (2 * π)] at h
have B := periodic_integrability4 (a₁ := π) (a₂ := 3 * π) t₀ two_pi_pos h
let A := IntervalIntegrable.comp_add_right B π
simp at A
have : 3 * π - π = 2 * π := by
ring
rw [this] at A
exact A
theorem integrabl_congr_negRadius
{f : }
{r : } :
(x : ) in (0)..(2 * π), f (circleMap 0 r x) = (x : ) in (0)..(2 * π), f (circleMap 0 (-r) x) := by
simp_rw [circleMap_neg]
have t₀ : Function.Periodic (fun (θ : ) f (circleMap 0 r θ)) (2 * π) := by
intro x
simp
congr 1
exact periodic_circleMap 0 r x
--rw [← zero_add (2 * π)] at h
--have B := periodic_integrability4 (a₁ := π) (a₂ := 3 * π) t₀ two_pi_pos h
have B := intervalIntegral.integral_comp_add_right (a := 0) (b := 2 * π) (fun θ => f (circleMap 0 r θ)) π
rw [B]
let X := t₀.intervalIntegral_add_eq 0 (0 + π)
simp at X
rw [X]
simp
rw [add_comm]

View File

@@ -1,666 +0,0 @@
import Mathlib.Analysis.Complex.TaylorSeries
import Mathlib.Analysis.SpecialFunctions.Integrals
import Mathlib.MeasureTheory.Integral.DivergenceTheorem
import Mathlib.MeasureTheory.Integral.IntervalIntegral
import Mathlib.MeasureTheory.Function.LocallyIntegrable
import Nevanlinna.partialDeriv
import Nevanlinna.cauchyRiemann
/-
noncomputable def partialDeriv
{E : Type*} [NormedAddCommGroup E] [NormedSpace E]
{F : Type*} [NormedAddCommGroup F] [NormedSpace F] : E → (E → F) → (E → F) :=
fun v ↦ (fun f ↦ (fun w ↦ fderiv f w v))
theorem partialDeriv_compContLinAt
{E : Type*} [NormedAddCommGroup E] [NormedSpace E]
{F : Type*} [NormedAddCommGroup F] [NormedSpace F]
{G : Type*} [NormedAddCommGroup G] [NormedSpace G]
{f : E → F}
{l : F →L[] G}
{v : E}
{x : E}
(h : DifferentiableAt f x) :
(partialDeriv v (l ∘ f)) x = (l ∘ partialDeriv v f) x:= by
unfold partialDeriv
rw [fderiv.comp x (ContinuousLinearMap.differentiableAt l) h]
simp
theorem partialDeriv_compCLE
{E : Type*} [NormedAddCommGroup E] [NormedSpace E]
{F : Type*} [NormedAddCommGroup F] [NormedSpace F]
{G : Type*} [NormedAddCommGroup G] [NormedSpace G]
{f : E → F}
{l : F ≃L[] G} {v : E} : partialDeriv v (l ∘ f) = l ∘ partialDeriv v f := by
funext x
by_cases hyp : DifferentiableAt f x
· let lCLM : F →L[] G := l
suffices shyp : partialDeriv v (lCLM ∘ f) x = (lCLM ∘ partialDeriv v f) x from by tauto
apply partialDeriv_compContLinAt
exact hyp
· unfold partialDeriv
rw [fderiv_zero_of_not_differentiableAt]
simp
rw [fderiv_zero_of_not_differentiableAt]
simp
exact hyp
rw [ContinuousLinearEquiv.comp_differentiableAt_iff]
exact hyp
theorem partialDeriv_smul'₂
{E : Type*} [NormedAddCommGroup E] [NormedSpace E]
{F : Type*} [NormedAddCommGroup F] [NormedSpace F]
{f : E → F} {a : } {v : E} :
partialDeriv v (a • f) = a • partialDeriv v f := by
funext w
by_cases ha : a = 0
· unfold partialDeriv
have : a • f = fun y ↦ a • f y := by rfl
rw [this, ha]
simp
· -- Now a is not zero. We present scalar multiplication with a as a continuous linear equivalence.
let smulCLM : F ≃L[] F :=
{
toFun := fun x ↦ a • x
map_add' := fun x y => DistribSMul.smul_add a x y
map_smul' := fun m x => (smul_comm ((RingHom.id ) m) a x).symm
invFun := fun x ↦ a⁻¹ • x
left_inv := by
intro x
simp
rw [← smul_assoc, smul_eq_mul, mul_comm, mul_inv_cancel ha, one_smul]
right_inv := by
intro x
simp
rw [← smul_assoc, smul_eq_mul, mul_inv_cancel ha, one_smul]
continuous_toFun := continuous_const_smul a
continuous_invFun := continuous_const_smul a⁻¹
}
have : a • f = smulCLM ∘ f := by tauto
rw [this]
rw [partialDeriv_compCLE]
tauto
theorem CauchyRiemann₄
{F : Type*} [NormedAddCommGroup F] [NormedSpace F]
{f : → F} :
(Differentiable f) → partialDeriv Complex.I f = Complex.I • partialDeriv 1 f := by
intro h
unfold partialDeriv
conv =>
left
intro w
rw [DifferentiableAt.fderiv_restrictScalars (h w)]
simp
rw [← mul_one Complex.I]
rw [← smul_eq_mul]
conv =>
right
right
intro w
rw [DifferentiableAt.fderiv_restrictScalars (h w)]
funext w
simp
-/
theorem MeasureTheory.integral2_divergence₃
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f g : × E)
(h₁f : ContDiff 1 f)
(h₁g : ContDiff 1 g)
(a₁ : )
(a₂ : )
(b₁ : )
(b₂ : ) :
(x : ) in a₁..b₁, (y : ) in a₂..b₂, ((fderiv f) (x, y)) (1, 0) + ((fderiv g) (x, y)) (0, 1) = ((( (x : ) in a₁..b₁, g (x, b₂)) - (x : ) in a₁..b₁, g (x, a₂)) + (y : ) in a₂..b₂, f (b₁, y)) - (y : ) in a₂..b₂, f (a₁, y) := by
apply integral2_divergence_prod_of_hasFDerivWithinAt_off_countable f g (fderiv f) (fderiv g) a₁ a₂ b₁ b₂
exact Set.countable_empty
-- ContinuousOn f (Set.uIcc a₁ b₁ ×ˢ Set.uIcc a₂ b₂)
exact h₁f.continuous.continuousOn
--
exact h₁g.continuous.continuousOn
--
rw [Set.diff_empty]
intro x _
exact DifferentiableAt.hasFDerivAt ((h₁f.differentiable le_rfl) x)
--
rw [Set.diff_empty]
intro y _
exact DifferentiableAt.hasFDerivAt ((h₁g.differentiable le_rfl) y)
--
apply ContinuousOn.integrableOn_compact
apply IsCompact.prod
exact isCompact_uIcc
exact isCompact_uIcc
apply ContinuousOn.add
apply Continuous.continuousOn
exact Continuous.clm_apply (ContDiff.continuous_fderiv h₁f le_rfl) continuous_const
apply Continuous.continuousOn
exact Continuous.clm_apply (ContDiff.continuous_fderiv h₁g le_rfl) continuous_const
theorem integral_divergence₄
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f g : E)
(h₁f : ContDiff 1 f)
(h₁g : ContDiff 1 g)
(a₁ : )
(a₂ : )
(b₁ : )
(b₂ : ) :
(x : ) in a₁..b₁, (y : ) in a₂..b₂, ((fderiv f) x, y ) 1 + ((fderiv g) x, y) Complex.I = ((( (x : ) in a₁..b₁, g x, b₂) - (x : ) in a₁..b₁, g x, a₂) + (y : ) in a₂..b₂, f b₁, y) - (y : ) in a₂..b₂, f a₁, y := by
let fr : × E := f Complex.equivRealProdCLM.symm
let gr : × E := g Complex.equivRealProdCLM.symm
have sfr {x y : } : f { re := x, im := y } = fr (x, y) := by exact rfl
have sgr {x y : } : g { re := x, im := y } = gr (x, y) := by exact rfl
repeat (conv in f { re := _, im := _ } => rw [sfr])
repeat (conv in g { re := _, im := _ } => rw [sgr])
have sfr' {x y : } {z : } : (fderiv f { re := x, im := y }) z = fderiv fr (x, y) (Complex.equivRealProdCLM z) := by
rw [fderiv.comp]
rw [Complex.equivRealProdCLM.symm.fderiv]
tauto
apply Differentiable.differentiableAt
exact h₁f.differentiable le_rfl
exact Complex.equivRealProdCLM.symm.differentiableAt
conv in (fderiv f { re := _, im := _ }) _ => rw [sfr']
have sgr' {x y : } {z : } : (fderiv g { re := x, im := y }) z = fderiv gr (x, y) (Complex.equivRealProdCLM z) := by
rw [fderiv.comp]
rw [Complex.equivRealProdCLM.symm.fderiv]
tauto
apply Differentiable.differentiableAt
exact h₁g.differentiable le_rfl
exact Complex.equivRealProdCLM.symm.differentiableAt
conv in (fderiv g { re := _, im := _ }) _ => rw [sgr']
apply MeasureTheory.integral2_divergence₃ fr gr _ _ a₁ a₂ b₁ b₂
-- ContDiff 1 fr
exact (ContinuousLinearEquiv.contDiff_comp_iff (ContinuousLinearEquiv.symm Complex.equivRealProdCLM)).mpr h₁f
-- ContDiff 1 gr
exact (ContinuousLinearEquiv.contDiff_comp_iff (ContinuousLinearEquiv.symm Complex.equivRealProdCLM)).mpr h₁g
theorem integral_divergence₅
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(F : E)
(hF : Differentiable F)
(lowerLeft upperRight : ) :
( (x : ) in lowerLeft.re..upperRight.re, F x, lowerLeft.im) + Complex.I (x : ) in lowerLeft.im..upperRight.im, F upperRight.re, x =
( (x : ) in lowerLeft.re..upperRight.re, F x, upperRight.im) + Complex.I (x : ) in lowerLeft.im..upperRight.im, F lowerLeft.re, x := by
let h₁f : ContDiff 1 F := (hF.contDiff : ContDiff 1 F).restrict_scalars
let h₁g : ContDiff 1 (-Complex.I F) := by
have : -Complex.I F = fun x -Complex.I F x := by rfl
rw [this]
apply ContDiff.comp
exact contDiff_const_smul _
exact h₁f
let A := integral_divergence₄ (-Complex.I F) F h₁g h₁f lowerLeft.re upperRight.im upperRight.re lowerLeft.im
have {z : } : fderiv F z Complex.I = partialDeriv Complex.I F z := by rfl
conv at A in (fderiv F _) _ => rw [this]
have {z : } : fderiv (-Complex.I F) z 1 = partialDeriv 1 (-Complex.I F) z := by rfl
conv at A in (fderiv (-Complex.I F) _) _ => rw [this]
conv at A =>
left
arg 1
intro x
arg 1
intro y
rw [CauchyRiemann₄ hF]
rw [partialDeriv_smul'₂]
simp
simp at A
have {t₁ t₂ t₃ t₄ : E} : 0 = (t₁ - t₂) + t₃ + t₄ t₁ + t₃ = t₂ - t₄ := by
intro hyp
calc
t₁ + t₃ = t₁ + t₃ - 0 := by rw [sub_zero (t₁ + t₃)]
_ = t₁ + t₃ - (t₁ - t₂ + t₃ + t₄) := by rw [hyp]
_ = t₂ - t₄ := by abel
let B := this A
repeat
rw [intervalIntegral.integral_symm lowerLeft.im upperRight.im] at B
simp at B
exact B
noncomputable def primitive
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E] :
( E) ( E) := by
intro z₀
intro f
exact fun z ( (x : ) in z₀.re..z.re, f x, z₀.im) + Complex.I (x : ) in z₀.im..z.im, f z.re, x
theorem primitive_zeroAtBasepoint
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f : E)
(z₀ : ) :
(primitive z₀ f) z₀ = 0 := by
unfold primitive
simp
theorem primitive_fderivAtBasepointZero
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f : E)
(hf : Continuous f) :
HasDerivAt (primitive 0 f) (f 0) 0 := by
unfold primitive
simp
apply hasDerivAt_iff_isLittleO.2
simp
rw [Asymptotics.isLittleO_iff]
intro c hc
have {z : } {e : E} : z e = ( (_ : ) in (0)..(z.re), e) + Complex.I (_ : ) in (0)..(z.im), e:= by
simp
rw [smul_comm]
rw [ smul_assoc]
simp
have : z.re e = (z.re : ) e := by exact rfl
rw [this, add_smul]
simp
conv =>
left
intro x
left
arg 1
arg 2
rw [this]
have {A B C D :E} : (A + B) - (C + D) = (A - C) + (B - D) := by
abel
have t₀ {r : } : IntervalIntegrable (fun x => f { re := x, im := 0 }) MeasureTheory.volume 0 r := by
apply Continuous.intervalIntegrable
apply Continuous.comp
exact hf
have : (fun x => ({ re := x, im := 0 } : )) = Complex.ofRealLI := by rfl
rw [this]
continuity
have t₁ {r : } : IntervalIntegrable (fun _ => f 0) MeasureTheory.volume 0 r := by
apply Continuous.intervalIntegrable
apply Continuous.comp
exact hf
fun_prop
have t₂ {a b : } : IntervalIntegrable (fun x_1 => f { re := a, im := x_1 }) MeasureTheory.volume 0 b := by
apply Continuous.intervalIntegrable
apply Continuous.comp hf
have : (Complex.mk a) = (fun x => Complex.I Complex.ofRealCLM x + { re := a, im := 0 }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
simp
rw [this]
apply Continuous.add
continuity
fun_prop
have t₃ {a : } : IntervalIntegrable (fun _ => f 0) MeasureTheory.volume 0 a := by
apply Continuous.intervalIntegrable
apply Continuous.comp
exact hf
fun_prop
conv =>
left
intro x
left
arg 1
rw [this]
rw [ smul_sub]
rw [ intervalIntegral.integral_sub t₀ t₁]
rw [ intervalIntegral.integral_sub t₂ t₃]
rw [Filter.eventually_iff_exists_mem]
let s := f⁻¹' Metric.ball (f 0) (c / (4 : ))
have h₁s : IsOpen s := IsOpen.preimage hf Metric.isOpen_ball
have h₂s : 0 s := by
apply Set.mem_preimage.mpr
apply Metric.mem_ball_self
linarith
obtain ε, h₁ε, h₂ε := Metric.isOpen_iff.1 h₁s 0 h₂s
have h₃ε : y Metric.ball 0 ε, (f y) - (f 0) < (c / (4 : )) := by
intro y hy
apply mem_ball_iff_norm.mp (h₂ε hy)
use Metric.ball 0 (ε / (4 : ))
constructor
· apply Metric.ball_mem_nhds 0
linarith
· intro y hy
have h₁y : |y.re| < ε / 4 := by
calc |y.re|
_ Complex.abs y := by apply Complex.abs_re_le_abs
_ < ε / 4 := by
let A := mem_ball_iff_norm.1 hy
simp at A
linarith
have h₂y : |y.im| < ε / 4 := by
calc |y.im|
_ Complex.abs y := by apply Complex.abs_im_le_abs
_ < ε / 4 := by
let A := mem_ball_iff_norm.1 hy
simp at A
linarith
have intervalComputation {x' y' : } (h : x' Ι 0 y') : |x'| |y'| := by
let A := h.1
let B := h.2
rcases le_total 0 y' with hy | hy
· simp [hy] at A
simp [hy] at B
rw [abs_of_nonneg hy]
rw [abs_of_nonneg (le_of_lt A)]
exact B
· simp [hy] at A
simp [hy] at B
rw [abs_of_nonpos hy]
rw [abs_of_nonpos]
linarith [h.1]
exact B
have t₁ : ( (x : ) in (0)..(y.re), f { re := x, im := 0 } - f 0) (c / (4 : )) * |y.re - 0| := by
apply intervalIntegral.norm_integral_le_of_norm_le_const
intro x hx
have h₁x : |x| < ε / 4 := by
calc |x|
_ |y.re| := intervalComputation hx
_ < ε / 4 := h₁y
apply le_of_lt
apply h₃ε { re := x, im := 0 }
rw [mem_ball_iff_norm]
simp
have : { re := x, im := 0 } = (x : ) := by rfl
rw [this]
rw [Complex.abs_ofReal]
linarith
have t₂ : (x : ) in (0)..(y.im), f { re := y.re, im := x } - f 0 (c / (4 : )) * |y.im - 0| := by
apply intervalIntegral.norm_integral_le_of_norm_le_const
intro x hx
have h₁x : |x| < ε / 4 := by
calc |x|
_ |y.im| := intervalComputation hx
_ < ε / 4 := h₂y
apply le_of_lt
apply h₃ε { re := y.re, im := x }
simp
calc Complex.abs { re := y.re, im := x }
_ |y.re| + |x| := by
apply Complex.abs_le_abs_re_add_abs_im { re := y.re, im := x }
_ < ε := by
linarith
calc ( (x : ) in (0)..(y.re), f { re := x, im := 0 } - f 0) + Complex.I (x : ) in (0)..(y.im), f { re := y.re, im := x } - f 0
_ ( (x : ) in (0)..(y.re), f { re := x, im := 0 } - f 0) + Complex.I (x : ) in (0)..(y.im), f { re := y.re, im := x } - f 0 := by
apply norm_add_le
_ ( (x : ) in (0)..(y.re), f { re := x, im := 0 } - f 0) + (x : ) in (0)..(y.im), f { re := y.re, im := x } - f 0 := by
simp
rw [norm_smul]
simp
_ (c / (4 : )) * |y.re - 0| + (c / (4 : )) * |y.im - 0| := by
apply add_le_add
exact t₁
exact t₂
_ (c / (4 : )) * (|y.re| + |y.im|) := by
simp
rw [mul_add]
_ (c / (4 : )) * (4 * y) := by
have : |y.re| + |y.im| 4 * y := by
calc |y.re| + |y.im|
_ y + y := by
apply add_le_add
apply Complex.abs_re_le_abs
apply Complex.abs_im_le_abs
_ 4 * y := by
rw [ two_mul]
apply mul_le_mul
linarith
rfl
exact norm_nonneg y
linarith
apply mul_le_mul
rfl
exact this
apply add_nonneg
apply abs_nonneg
apply abs_nonneg
linarith
_ c * y := by
linarith
theorem primitive_translation
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f : E)
(z₀ t : ) :
primitive z₀ (f fun z (z - t)) = ((primitive (z₀ - t) f) fun z (z - t)) := by
funext z
unfold primitive
simp
let g : E := fun x f ( {re := x, im := z₀.im - t.im} )
have {x : } : f ({ re := x, im := z₀.im } - t) = g (1*x - t.re) := by
congr 1
apply Complex.ext <;> simp
conv =>
left
left
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_mul_sub g one_ne_zero (t.re)]
simp
congr 1
let g : E := fun x f ( {re := z.re - t.re, im := x} )
have {x : } : f ({ re := z.re, im := x} - t) = g (1*x - t.im) := by
congr 1
apply Complex.ext <;> simp
conv =>
left
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_mul_sub g one_ne_zero (t.im)]
simp
theorem primitive_hasDerivAtBasepoint
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
{f : E}
(hf : Continuous f)
(z₀ : ) :
HasDerivAt (primitive z₀ f) (f z₀) z₀ := by
let g := f fun z z + z₀
have : Continuous g := by continuity
let A := primitive_fderivAtBasepointZero g this
simp at A
let B := primitive_translation g z₀ z₀
simp at B
have : (g fun z (z - z₀)) = f := by
funext z
dsimp [g]
simp
rw [this] at B
rw [B]
have : f z₀ = (1 : ) (f z₀) := by
exact (MulAction.one_smul (f z₀)).symm
conv =>
arg 2
rw [this]
apply HasDerivAt.scomp
simp
have : g 0 = f z₀ := by simp [g]
rw [ this]
exact A
apply HasDerivAt.sub_const
have : (fun (x : ) x) = id := by
funext x
simp
rw [this]
exact hasDerivAt_id z₀
lemma integrability₁
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f : E)
(hf : Differentiable f)
(a₁ a₂ b : ) :
IntervalIntegrable (fun x => f { re := x, im := b }) MeasureTheory.volume a₁ a₂ := by
apply Continuous.intervalIntegrable
apply Continuous.comp
exact Differentiable.continuous hf
have : ((fun x => { re := x, im := b }) : ) = (fun x => Complex.ofRealCLM x + { re := 0, im := b }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
rw [Complex.add_im]
simp
rw [this]
continuity
lemma integrability₂
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f : E)
(hf : Differentiable f)
(a₁ a₂ b : ) :
IntervalIntegrable (fun x => f { re := b, im := x }) MeasureTheory.volume a₁ a₂ := by
apply Continuous.intervalIntegrable
apply Continuous.comp
exact Differentiable.continuous hf
have : (Complex.mk b) = (fun x => Complex.I Complex.ofRealCLM x + { re := b, im := 0 }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
simp
rw [this]
apply Continuous.add
continuity
fun_prop
theorem primitive_additivity
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
(f : E)
(hf : Differentiable f)
(z₀ z₁ : ) :
primitive z₀ f = fun z (primitive z₁ f) z + (primitive z₀ f z₁) := by
funext z
unfold primitive
have : ( (x : ) in z₀.re..z.re, f { re := x, im := z₀.im }) = ( (x : ) in z₀.re..z₁.re, f { re := x, im := z₀.im }) + ( (x : ) in z₁.re..z.re, f { re := x, im := z₀.im }) := by
rw [intervalIntegral.integral_add_adjacent_intervals]
apply integrability₁ f hf
apply integrability₁ f hf
rw [this]
have : ( (x : ) in z₀.im..z.im, f { re := z.re, im := x }) = ( (x : ) in z₀.im..z₁.im, f { re := z.re, im := x }) + ( (x : ) in z₁.im..z.im, f { re := z.re, im := x }) := by
rw [intervalIntegral.integral_add_adjacent_intervals]
apply integrability₂ f hf
apply integrability₂ f hf
rw [this]
simp
let A := integral_divergence₅ f hf z₁.re, z₀.im z.re, z₁.im
simp at A
have {a b c d : E} : (b + a) + (c + d) = (a + c) + (b + d) := by
abel
rw [this]
rw [A]
abel
theorem primitive_hasDerivAt
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
{f : E}
(hf : Differentiable f)
(z₀ z : ) :
HasDerivAt (primitive z₀ f) (f z) z := by
rw [primitive_additivity f hf z₀ z]
rw [ add_zero (f z)]
apply HasDerivAt.add
apply primitive_hasDerivAtBasepoint
exact hf.continuous
apply hasDerivAt_const
theorem primitive_differentiable
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
{f : E}
(hf : Differentiable f)
(z₀ : ) :
Differentiable (primitive z₀ f) := by
intro z
exact (primitive_hasDerivAt hf z₀ z).differentiableAt
theorem primitive_hasFderivAt
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
{f : E}
(hf : Differentiable f)
(z₀ : ) :
z, HasFDerivAt (primitive z₀ f) ((ContinuousLinearMap.lsmul ).flip (f z)) z := by
intro z
rw [hasFDerivAt_iff_hasDerivAt]
simp
exact primitive_hasDerivAt hf z₀ z
theorem primitive_hasFderivAt'
{f : }
(hf : Differentiable f)
(z₀ : ) :
z, HasFDerivAt (primitive z₀ f) (ContinuousLinearMap.lsmul (f z)) z := by
intro z
rw [hasFDerivAt_iff_hasDerivAt]
simp
exact primitive_hasDerivAt hf z₀ z
theorem primitive_fderiv
{E : Type u} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E]
{f : E}
(hf : Differentiable f)
(z₀ : ) :
z, (fderiv (primitive z₀ f) z) = (ContinuousLinearMap.lsmul ).flip (f z) := by
intro z
apply HasFDerivAt.fderiv
exact primitive_hasFderivAt hf z₀ z
theorem primitive_fderiv'
{f : }
(hf : Differentiable f)
(z₀ : ) :
z, (fderiv (primitive z₀ f) z) = ContinuousLinearMap.lsmul (f z) := by
intro z
apply HasFDerivAt.fderiv
exact primitive_hasFderivAt' hf z₀ z

View File

@@ -85,11 +85,11 @@ theorem laplace_add_ContDiffOn
have t₁ : DifferentiableAt (partialDeriv 1 f₁) x := by
let B₀ := (h₁ x hx).contDiffAt (IsOpen.mem_nhds hs hx)
let A₀ := partialDeriv_contDiffAt B₀ 1
exact A₀.differentiableAt (Submonoid.oneLE.proof_2 )
apply A₀.differentiableAt (Preorder.le_refl 1)
have t₂ : DifferentiableAt (partialDeriv 1 f₂) x := by
let B₀ := (h₂ x hx).contDiffAt (IsOpen.mem_nhds hs hx)
let A₀ := partialDeriv_contDiffAt B₀ 1
exact A₀.differentiableAt (Submonoid.oneLE.proof_2 )
exact A₀.differentiableAt (Preorder.le_refl 1)
rw [partialDeriv_add₂_differentiableAt t₁ t₂]
have : partialDeriv Complex.I (f₁ + f₂) =[nhds x] (partialDeriv Complex.I f₁) + (partialDeriv Complex.I f₂) := by
@@ -105,11 +105,11 @@ theorem laplace_add_ContDiffOn
have t₃ : DifferentiableAt (partialDeriv Complex.I f₁) x := by
let B₀ := (h₁ x hx).contDiffAt (IsOpen.mem_nhds hs hx)
let A₀ := partialDeriv_contDiffAt B₀ Complex.I
exact A₀.differentiableAt (Submonoid.oneLE.proof_2 )
exact A₀.differentiableAt (Preorder.le_refl 1)
have t₄ : DifferentiableAt (partialDeriv Complex.I f₂) x := by
let B₀ := (h₂ x hx).contDiffAt (IsOpen.mem_nhds hs hx)
let A₀ := partialDeriv_contDiffAt B₀ Complex.I
exact A₀.differentiableAt (Submonoid.oneLE.proof_2 )
exact A₀.differentiableAt (Preorder.le_refl 1)
rw [partialDeriv_add₂_differentiableAt t₃ t₄]
-- I am super confused at this point because the tactic 'ring' does not work.
@@ -219,6 +219,7 @@ theorem laplace_compCLMAt
obtain u, hu₁, hu₂ : u nhds x, ContDiffOn 2 f u := by
apply ContDiffAt.contDiffOn h
rfl
simp
obtain v, hv₁, hv₂, hv₃ := mem_nhds_iff.1 hu₁
use v
constructor

View File

@@ -1,285 +0,0 @@
import Mathlib.Analysis.InnerProductSpace.Basic
import Mathlib.Analysis.InnerProductSpace.Dual
import Mathlib.Analysis.InnerProductSpace.PiL2
--import Mathlib.Algebra.BigOperators.Basic
import Mathlib.Analysis.Calculus.ContDiff.Bounds
import Mathlib.Analysis.Calculus.FDeriv.Symmetric
import Mathlib.LinearAlgebra.Basis
import Mathlib.LinearAlgebra.Contraction
open BigOperators
open Finset
variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace E] [FiniteDimensional E]
noncomputable def realInnerAsElementOfDualTensorprod
{E : Type*} [NormedAddCommGroup E] [InnerProductSpace E]
: TensorProduct E E [] := TensorProduct.lift bilinFormOfRealInner
instance
{E : Type*} [NormedAddCommGroup E] [InnerProductSpace E] [CompleteSpace E] [FiniteDimensional E]
: NormedAddCommGroup (TensorProduct E E) where
norm := by
sorry
dist_self := by
sorry
sorry
/-
instance
{E : Type*} [NormedAddCommGroup E] [InnerProductSpace E] [CompleteSpace E] [FiniteDimensional E]
: InnerProductSpace (TensorProduct E E) where
smul := _
one_smul := _
mul_smul := _
smul_zero := _
smul_add := _
add_smul := _
zero_smul := _
norm_smul_le := _
inner := _
norm_sq_eq_inner := _
conj_symm := _
add_left := _
smul_left := _
-/
noncomputable def dual'
{E : Type*} [NormedAddCommGroup E] [InnerProductSpace E] [CompleteSpace E] [FiniteDimensional E]
: (TensorProduct E E [] ) [] TensorProduct E E := by
let d := InnerProductSpace.toDual E
let e := d.toLinearEquiv
let a := TensorProduct.congr e e
let b := homTensorHomEquiv E E
sorry
variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace E] [FiniteDimensional E]
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace F]
theorem InvariantTensor
[Fintype ι]
(v : Basis ι E)
(c : ι )
(L : ContinuousMultilinearMap (fun (_ : Fin 2) E) F) :
L (fun _ => j : ι, c j v j) = x : Fin 2 ι, (c (x 0) * c (x 1)) L ((fun i => v (x i))) := by
rw [L.map_sum]
simp_rw [L.map_smul_univ]
sorry
theorem BilinearCalc
[Fintype ι]
(v : Basis ι E)
(c : ι )
(L : ContinuousMultilinearMap (fun (_ : Fin 2) E) F) :
L (fun _ => j : ι, c j v j) = x : Fin 2 ι, (c (x 0) * c (x 1)) L ((fun i => v (x i))) := by
rw [L.map_sum]
simp_rw [L.map_smul_univ]
sorry
/-
lemma c2
[Fintype ι]
(b : Basis ι E)
(hb : Orthonormal b)
(x y : E) :
⟪x, y⟫_ = ∑ i : ι, ⟪x, b i⟫_ * ⟪y, b i⟫_ := by
rw [vectorPresentation b hb x]
rw [vectorPresentation b hb y]
rw [Orthonormal.inner_sum hb]
simp
conv =>
right
arg 2
intro i'
rw [Orthonormal.inner_left_fintype hb]
rw [Orthonormal.inner_left_fintype hb]
-/
lemma fin_sum
[Fintype ι]
(f : ι ι F) :
r : Fin 2 ι, f (r 0) (r 1) = r₀ : ι, ( r₁ : ι, f r₀ r₁) := by
rw [ Fintype.sum_prod_type']
apply Fintype.sum_equiv (finTwoArrowEquiv ι)
intro x
dsimp
theorem LaplaceIndep
[Fintype ι] [DecidableEq ι]
(v₁ : OrthonormalBasis ι E)
(v₂ : OrthonormalBasis ι E)
(L : ContinuousMultilinearMap (fun (_ : Fin 2) E) F) :
i, L (fun _ v₁ i) = i, L (fun _ => v₂ i) := by
have vector_vs_function
{y : Fin 2 ι}
{v : ι E}
: (fun i => v (y i)) = ![v (y 0), v (y 1)] := by
funext i
by_cases h : i = 0
· rw [h]
simp
· rw [Fin.eq_one_of_neq_zero i h]
simp
conv =>
right
arg 2
intro i
rw [v₁.sum_repr' (v₂ i)]
rw [BilinearCalc]
rw [Finset.sum_comm]
conv =>
right
arg 2
intro y
rw [ Finset.sum_smul]
rw [ c2 v₂ hv₂ (v₁ (y 0)) (v₁ (y 1))]
rw [vector_vs_function]
simp
rw [fin_sum (fun i₀ (fun i₁ v₁ i₀, v₁ i₁_ L ![v₁ i₀, v₁ i₁]))]
have xx {r₀ : ι} : r₁ : ι, r₁ r₀ v₁ r₀, v₁ r₁_ L ![v₁ r₀, v₁ r₁] = 0 := by
intro r₁ hr₁
rw [orthonormal_iff_ite.1 hv₁]
simp
tauto
conv =>
right
arg 2
intro r₀
rw [Fintype.sum_eq_single r₀ xx]
rw [orthonormal_iff_ite.1 hv₁]
apply sum_congr
rfl
intro x _
rw [vector_vs_function]
simp
noncomputable def Laplace_wrt_basis
[Fintype ι]
(v : Basis ι E)
(_ : Orthonormal v)
(f : E F) :
E F :=
fun z i, iteratedFDeriv 2 f z ![v i, v i]
theorem LaplaceIndep'
[Fintype ι] [DecidableEq ι]
(v₁ : OrthonormalBasis ι E)
(v₂ : OrthonormalBasis ι E)
(f : E F)
: (Laplace_wrt_basis v₁ hv₁ f) = (Laplace_wrt_basis v₂ hv₂ f) := by
funext z
unfold Laplace_wrt_basis
let XX := LaplaceIndep v₁ hv₁ v₂ hv₂ (iteratedFDeriv 2 f z)
have vector_vs_function
{v : E}
: ![v, v] = (fun _ => v) := by
funext i
by_cases h : i = 0
· rw [h]
simp
· rw [Fin.eq_one_of_neq_zero i h]
simp
conv =>
left
arg 2
intro i
rw [vector_vs_function]
conv =>
right
arg 2
intro i
rw [vector_vs_function]
assumption
theorem LaplaceIndep''
[Fintype ι₁] [DecidableEq ι₁]
(v₁ : Basis ι₁ E)
(hv₁ : Orthonormal v₁)
[Fintype ι₂] [DecidableEq ι₂]
(v₂ : Basis ι₂ E)
(hv₂ : Orthonormal v₂)
(f : E F)
: (Laplace_wrt_basis v₁ hv₁ f) = (Laplace_wrt_basis v₂ hv₂ f) := by
have b : ι₁ ι₂ := by
apply Fintype.equivOfCardEq
rw [ FiniteDimensional.finrank_eq_card_basis v₁]
rw [ FiniteDimensional.finrank_eq_card_basis v₂]
let v'₁ := Basis.reindex v₁ b
have hv'₁ : Orthonormal v'₁ := by
let A := Basis.reindex_apply v₁ b
have : v'₁ = v₁ b.symm := by
funext i
exact A i
rw [this]
let B := Orthonormal.comp hv₁ b.symm
apply B
exact Equiv.injective b.symm
rw [ LaplaceIndep' v'₁ hv'₁ v₂ hv₂ f]
unfold Laplace_wrt_basis
simp
funext z
rw [ Equiv.sum_comp b.symm]
apply Fintype.sum_congr
intro i₂
congr
rw [Basis.reindex_apply v₁ b i₂]
noncomputable def Laplace
(f : E F)
: E F := by
exact Laplace_wrt_basis (stdOrthonormalBasis E).toBasis (stdOrthonormalBasis E).orthonormal f
theorem LaplaceIndep'''
[Fintype ι] [DecidableEq ι]
(v : Basis ι E)
(hv : Orthonormal v)
(f : E F)
: (Laplace f) = (Laplace_wrt_basis v hv f) := by
unfold Laplace
apply LaplaceIndep'' (stdOrthonormalBasis E).toBasis (stdOrthonormalBasis E).orthonormal v hv f
theorem Complex.Laplace'
(f : F)
: (Laplace f) = fun z (iteratedFDeriv 2 f z) ![1, 1] + (iteratedFDeriv 2 f z) ![Complex.I, Complex.I] := by
rw [LaplaceIndep''' Complex.orthonormalBasisOneI.toBasis Complex.orthonormalBasisOneI.orthonormal f]
unfold Laplace_wrt_basis
simp

View File

@@ -0,0 +1,59 @@
import Nevanlinna.analyticAt
import Nevanlinna.divisor
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
noncomputable def AnalyticOnNhd.zeroDivisor
{f : }
{U : Set }
(hf : AnalyticOnNhd f U) :
Divisor U where
toFun := by
intro z
if hz : z U then
exact ((hf z hz).order.toNat : )
else
exact 0
supportInU := by
intro z hz
simp at hz
by_contra h₂z
simp [h₂z] at hz
locallyFiniteInU := by
intro z hz
apply eventually_nhdsWithin_iff.2
rw [eventually_nhds_iff]
rcases AnalyticAt.eventually_eq_zero_or_eventually_ne_zero (hf z hz) with h|h
· rw [eventually_nhds_iff] at h
obtain N, h₁N, h₂N, h₃N := h
use N
constructor
· intro y h₁y _
by_cases h₃y : y U
· simp [h₃y]
right
rw [AnalyticAt.order_eq_top_iff (hf y h₃y)]
rw [eventually_nhds_iff]
use N
· simp [h₃y]
· tauto
· rw [eventually_nhdsWithin_iff, eventually_nhds_iff] at h
obtain N, h₁N, h₂N, h₃N := h
use N
constructor
· intro y h₁y h₂y
by_cases h₃y : y U
· simp [h₃y]
left
rw [AnalyticAt.order_eq_zero_iff (hf y h₃y)]
exact h₁N y h₁y h₂y
· simp [h₃y]
· tauto

View File

@@ -1,21 +1,25 @@
import Mathlib.Analysis.Analytic.Constructions
import Mathlib.Analysis.Analytic.IsolatedZeros
import Mathlib.Analysis.Complex.Basic
import Nevanlinna.analyticAt
theorem AnalyticOn.order_eq_nat_iff
noncomputable def AnalyticOnNhd.order
{f : } {U : Set } (hf : AnalyticOnNhd f U) : U := fun u (hf u u.2).order
theorem AnalyticOnNhd.order_eq_nat_iff
{f : }
{U : Set }
{z₀ : }
(hf : AnalyticOn f U)
(hz₀ : z₀ U)
{z₀ : U}
(hf : AnalyticOnNhd f U)
(n : ) :
(hf z₀ hz₀).order = n (g : ), AnalyticOn g U g z₀ 0 z, f z = (z - z₀) ^ n g z := by
hf.order z₀ = n (g : ), AnalyticOnNhd g U g z₀ 0 z, f z = (z - z₀) ^ n g z := by
constructor
-- Direction →
intro hn
obtain gloc, h₁gloc, h₂gloc, h₃gloc := (AnalyticAt.order_eq_nat_iff (hf z₀ hz₀) n).1 hn
obtain gloc, h₁gloc, h₂gloc, h₃gloc := (AnalyticAt.order_eq_nat_iff (hf z₀ z₀.2) n).1 hn
-- Define a candidate function; this is (f z) / (z - z₀) ^ n with the
-- removable singularity removed
@@ -44,7 +48,7 @@ theorem AnalyticOn.order_eq_nat_iff
have g_near_z₁ {z₁ : } : z₁ z₀ (z : ) in nhds z₁, g z = f z / (z - z₀) ^ n := by
intro hz₁
rw [eventually_nhds_iff]
use {z₀}
use {z₀.1}
constructor
· intro y hy
simp at hy
@@ -79,7 +83,7 @@ theorem AnalyticOn.order_eq_nat_iff
exact h₃gloc.self_of_nhds
· rw [(g_near_z₁ h₂z).self_of_nhds]
simp [h₂z]
rw [div_eq_mul_inv, mul_comm, mul_assoc, inv_mul_cancel]
rw [div_eq_mul_inv, mul_comm, mul_assoc, inv_mul_cancel]
simp; norm_num
rw [sub_eq_zero]
tauto
@@ -87,70 +91,31 @@ theorem AnalyticOn.order_eq_nat_iff
-- direction ←
intro h
obtain g, h₁g, h₂g, h₃g := h
dsimp [AnalyticOnNhd.order]
rw [AnalyticAt.order_eq_nat_iff]
use g
exact h₁g z₀ hz₀, h₂g, Filter.eventually_of_forall h₃g
exact h₁g z₀ z₀.2, h₂g, Filter.Eventually.of_forall h₃g
theorem AnalyticAt.order_mul
{f f₂ : }
{z₀ : }
(hf : AnalyticAt f z₀)
(hf₂ : AnalyticAt f₂ z₀) :
(AnalyticAt.mul hf₁ hf₂).order = hf₁.order + hf₂.order := by
by_cases h₂f₁ : hf₁.order =
· simp [h₂f₁]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff] at h₂f₁
obtain t, h₁t, h₂t, h₃t := h₂f₁
use t
constructor
· intro y hy
rw [h₁t y hy]
ring
· exact h₂t, h₃t
· by_cases h₂f₂ : hf₂.order =
· simp [h₂f₂]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff]
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff] at h₂f₂
obtain t, h₁t, h₂t, h₃t := h₂f₂
use t
constructor
· intro y hy
rw [h₁t y hy]
ring
· exact h₂t, h₃t
· obtain g₁, h₁g₁, h₂g₁, h₃g₁ := (AnalyticAt.order_eq_nat_iff hf₁ hf₁.order.toNat).1 (eq_comm.1 (ENat.coe_toNat h₂f₁))
obtain g₂, h₁g₂, h₂g₂, h₃g₂ := (AnalyticAt.order_eq_nat_iff hf₂ hf₂.order.toNat).1 (eq_comm.1 (ENat.coe_toNat h₂f₂))
rw [ ENat.coe_toNat h₂f₁, ENat.coe_toNat h₂f₂, ENat.coe_add]
rw [AnalyticAt.order_eq_nat_iff (AnalyticAt.mul hf₁ hf₂) (hf₁.order.toNat + hf₂.order.toNat)]
use g₁ * g₂
constructor
· exact AnalyticAt.mul h₁g₁ h₁g₂
· constructor
· simp; tauto
· obtain t₁, h₁t₁, h₂t₁, h₃t₁ := eventually_nhds_iff.1 h₃g₁
obtain t₂, h₁t₂, h₂t₂, h₃t₂ := eventually_nhds_iff.1 h₃g₂
rw [eventually_nhds_iff]
use t₁ t₂
constructor
· intro y hy
rw [h₁t₁ y hy.1, h₁t₂ y hy.2]
simp; ring
· constructor
· exact IsOpen.inter h₂t₁ h₂t₂
· exact Set.mem_inter h₃t₁ h₃t₂
theorem AnalyticOnNhd.support_of_order
{f : }
{U : Set }
(hf : AnalyticOnNhd f U) :
Function.support hf.order = U.restrict f⁻¹' {0} := by
ext u
simp [AnalyticOnNhd.order]
rw [not_iff_comm, (hf u u.2).order_eq_zero_iff]
theorem AnalyticOn.eliminateZeros
theorem AnalyticOnNhd.eliminateZeros
{f : }
{U : Set }
{A : Finset U}
(hf : AnalyticOn f U)
(n : ) :
( a A, (hf a.1 a.2).order = n a) (g : ), AnalyticOn g U ( a A, g a 0) z, f z = ( a A, (z - a) ^ (n a)) g z := by
(hf : AnalyticOnNhd f U)
(n : U ) :
( a A, hf.order a = n a) (g : ), AnalyticOnNhd g U ( a A, g a 0) z, f z = ( a A, (z - a) ^ (n a)) g z := by
apply Finset.induction (α := U) (p := fun A ( a A, (hf a.1 a.2).order = n a) (g : ), AnalyticOn g U ( a A, g a 0) z, f z = ( a A, (z - a) ^ (n a)) g z)
apply Finset.induction (α := U) (p := fun A ( a A, (hf a.1 a.2).order = n a) (g : ), AnalyticOnNhd g U ( a A, g a 0) z, f z = ( a A, (z - a) ^ (n a)) g z)
-- case empty
simp
@@ -167,7 +132,7 @@ theorem AnalyticOn.eliminateZeros
rw [ hBinsert b₀ (Finset.mem_insert_self b₀ B)]
let φ := fun z ( a B, (z - a.1) ^ n a.1)
let φ := fun z ( a B, (z - a.1) ^ n a)
have : f = fun z φ z * g₀ z := by
funext z
@@ -181,7 +146,7 @@ theorem AnalyticOn.eliminateZeros
intro b _
apply AnalyticAt.pow
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_id
exact analyticAt_const
have h₂φ : h₁φ.order = (0 : ) := by
@@ -208,8 +173,7 @@ theorem AnalyticOn.eliminateZeros
rw [h₂φ]
simp
obtain g₁, h₁g₁, h₂g₁, h₃g₁ := (AnalyticOn.order_eq_nat_iff h₁g₀ b₀.2 (n b₀)).1 this
obtain g₁, h₁g₁, h₂g₁, h₃g₁ := (AnalyticOnNhd.order_eq_nat_iff h₁g₀ (n b₀)).1 this
use g₁
constructor
@@ -239,7 +203,7 @@ theorem XX
{f : }
{U : Set }
(hU : IsPreconnected U)
(h₁f : AnalyticOn f U)
(h₁f : AnalyticOnNhd f U)
(h₂f : u U, f u 0) :
(hu : u U), (h₁f u hu).order.toNat = (h₁f u hu).order := by
@@ -257,16 +221,16 @@ theorem discreteZeros
{f : }
{U : Set }
(hU : IsPreconnected U)
(h₁f : AnalyticOn f U)
(h₁f : AnalyticOnNhd f U)
(h₂f : u U, f u 0) :
DiscreteTopology (U f⁻¹' {0}) := by
DiscreteTopology ((U.restrict f)⁻¹' {0}) := by
simp_rw [ singletons_open_iff_discrete]
simp_rw [Metric.isOpen_singleton_iff]
intro z
let A := XX hU h₁f h₂f z.2.1
let A := XX hU h₁f h₂f z.1.2
rw [eq_comm] at A
rw [AnalyticAt.order_eq_nat_iff] at A
obtain g, h₁g, h₂g, h₃g := A
@@ -311,9 +275,9 @@ theorem discreteZeros
_ < min ε₁ ε₂ := by assumption
_ ε₁ := by exact min_le_left ε₁ ε₂
have F := h₂ε₂ y.1 h₂y
rw [y.2.2] at F
have : f y = 0 := by exact y.2
rw [this] at F
simp at F
have : g y.1 0 := by
@@ -329,68 +293,51 @@ theorem finiteZeros
{U : Set }
(h₁U : IsPreconnected U)
(h₂U : IsCompact U)
(h₁f : AnalyticOn f U)
(h₁f : AnalyticOnNhd f U)
(h₂f : u U, f u 0) :
Set.Finite (U f⁻¹' {0}) := by
Set.Finite (U.restrict f⁻¹' {0}) := by
have hinter : IsCompact (U f⁻¹' {0}) := by
apply IsCompact.of_isClosed_subset h₂U
apply h₁f.continuousOn.preimage_isClosed_of_isClosed
exact IsCompact.isClosed h₂U
have closedness : IsClosed (U.restrict f⁻¹' {0}) := by
apply IsClosed.preimage
apply continuousOn_iff_continuous_restrict.1
exact h₁f.continuousOn
exact isClosed_singleton
exact Set.inter_subset_left
apply hinter.finite
apply DiscreteTopology.of_subset (s := (U f⁻¹' {0}))
have : CompactSpace U := by
exact isCompact_iff_compactSpace.mp h₂U
apply (IsClosed.isCompact closedness).finite
exact discreteZeros h₁U h₁f h₂f
rfl
theorem AnalyticOnCompact.eliminateZeros
theorem AnalyticOnNhdCompact.eliminateZeros
{f : }
{U : Set }
(h₁U : IsPreconnected U)
(h₂U : IsCompact U)
(h₁f : AnalyticOn f U)
(h₁f : AnalyticOnNhd f U)
(h₂f : u U, f u 0) :
(g : ) (A : Finset U), AnalyticOn g U ( z U, g z 0) z, f z = ( a A, (z - a) ^ (h₁f a a.2).order.toNat) g z := by
(g : ) (A : Finset U), AnalyticOnNhd g U ( z U, g z 0) z, f z = ( a A, (z - a) ^ (h₁f.order a).toNat) g z := by
let ι : U := Subtype.val
let A := (finiteZeros h₁U h₂U h₁f h₂f).toFinset
let A₁ := ι⁻¹' (U f⁻¹' {0})
have : A₁.Finite := by
apply Set.Finite.preimage
exact Set.injOn_subtype_val
exact finiteZeros h₁U h₂U h₁f h₂f
let A := this.toFinset
let n : := by
intro z
by_cases hz : z U
· exact (h₁f z hz).order.toNat
· exact 0
let n : U := fun z (h₁f z z.2).order.toNat
have hn : a A, (h₁f a a.2).order = n a := by
intro a _
dsimp [n]
simp
dsimp [n, AnalyticOnNhd.order]
rw [eq_comm]
apply XX h₁U
exact h₂f
obtain g, h₁g, h₂g, h₃g := AnalyticOn.eliminateZeros (A := A) h₁f n hn
obtain g, h₁g, h₂g, h₃g := AnalyticOnNhd.eliminateZeros (A := A) h₁f n hn
use g
use A
have inter : (z : ), f z = ( a A, (z - a) ^ (h₁f (a) a.property).order.toNat) g z := by
intro z
rw [h₃g z]
congr
funext a
congr
dsimp [n]
simp [a.2]
constructor
· exact h₁g
@@ -400,15 +347,115 @@ theorem AnalyticOnCompact.eliminateZeros
· exact h₂g z, h₁z h₂z
· have : f z 0 := by
by_contra C
have : z, h₁z A₁ := by
dsimp [A₁, ι]
simp
exact C
have : z, h₁z A.toSet := by
dsimp [A]
simp
exact this
exact C
tauto
rw [inter z] at this
exact right_ne_zero_of_smul this
· exact inter
theorem AnalyticOnNhdCompact.eliminateZeros₂
{f : }
{U : Set }
(h₁U : IsPreconnected U)
(h₂U : IsCompact U)
(h₁f : AnalyticOnNhd f U)
(h₂f : u U, f u 0) :
(g : ), AnalyticOnNhd g U ( z U, g z 0) z, f z = ( a (finiteZeros h₁U h₂U h₁f h₂f).toFinset, (z - a) ^ (h₁f.order a).toNat) g z := by
let A := (finiteZeros h₁U h₂U h₁f h₂f).toFinset
let n : U := fun z (h₁f z z.2).order.toNat
have hn : a A, (h₁f a a.2).order = n a := by
intro a _
dsimp [n, AnalyticOnNhd.order]
rw [eq_comm]
apply XX h₁U
exact h₂f
obtain g, h₁g, h₂g, h₃g := AnalyticOnNhd.eliminateZeros (A := A) h₁f n hn
use g
have inter : (z : ), f z = ( a A, (z - a) ^ (h₁f (a) a.property).order.toNat) g z := by
intro z
rw [h₃g z]
constructor
· exact h₁g
· constructor
· intro z h₁z
by_cases h₂z : z, h₁z A.toSet
· exact h₂g z, h₁z h₂z
· have : f z 0 := by
by_contra C
have : z, h₁z A.toSet := by
dsimp [A]
simp
exact C
tauto
rw [inter z] at this
exact right_ne_zero_of_smul this
· exact h₃g
theorem AnalyticOnNhdCompact.eliminateZeros₁
{f : }
{U : Set }
(h₁U : IsPreconnected U)
(h₂U : IsCompact U)
(h₁f : AnalyticOnNhd f U)
(h₂f : u U, f u 0) :
(g : ), AnalyticOnNhd g U ( z U, g z 0) z, f z = ( a, (z - a) ^ (h₁f.order a).toNat) g z := by
let A := (finiteZeros h₁U h₂U h₁f h₂f).toFinset
let n : U := fun z (h₁f z z.2).order.toNat
have hn : a A, (h₁f a a.2).order = n a := by
intro a _
dsimp [n, AnalyticOnNhd.order]
rw [eq_comm]
apply XX h₁U
exact h₂f
obtain g, h₁g, h₂g, h₃g := AnalyticOnNhd.eliminateZeros (A := A) h₁f n hn
use g
have inter : (z : ), f z = ( a A, (z - a) ^ (h₁f (a) a.property).order.toNat) g z := by
intro z
rw [h₃g z]
constructor
· exact h₁g
· constructor
· intro z h₁z
by_cases h₂z : z, h₁z A.toSet
· exact h₂g z, h₁z h₂z
· have : f z 0 := by
by_contra C
have : z, h₁z A.toSet := by
dsimp [A]
simp
exact C
tauto
rw [inter z] at this
exact right_ne_zero_of_smul this
· intro z
let φ : U := fun a (z - a) ^ (h₁f.order a).toNat
have : Function.mulSupport φ A := by
intro x hx
simp [φ] at hx
have : (h₁f.order x).toNat 0 := by
by_contra C
rw [C] at hx
simp at hx
simp [A]
exact AnalyticAt.supp_order_toNat (h₁f x x.2) this
rw [finprod_eq_prod_of_mulSupport_subset φ ]
rw [inter z]
rfl

View File

@@ -28,7 +28,7 @@ orthonormal basis `v` as `∑ i, (v i) ⊗ₜ[] (v i)`.
-/
open InnerProductSpace
open TensorProduct
@@ -41,12 +41,11 @@ noncomputable def InnerProductSpace.canonicalCovariantTensor
(E : Type*) [NormedAddCommGroup E] [InnerProductSpace E] [FiniteDimensional E]
: E [] E := i, ((stdOrthonormalBasis E) i) [] ((stdOrthonormalBasis E) i)
theorem InnerProductSpace.canonicalCovariantTensorRepresentation
(E : Type*) [NormedAddCommGroup E] [InnerProductSpace E] [FiniteDimensional E]
[Fintype ι]
(v : OrthonormalBasis ι E)
: InnerProductSpace.canonicalCovariantTensor E = i, (v i) [] (v i) := by
(v : OrthonormalBasis ι E) :
InnerProductSpace.canonicalCovariantTensor E = i, (v i) [] (v i) := by
let w := stdOrthonormalBasis E
conv =>

View File

@@ -69,7 +69,7 @@ noncomputable def Laplace
simp
apply continuous_finset_sum
intro i _
exact ContinuousMultilinearMap.continuous_eval_const ![v i, v i]
exact ContinuousEvalConst.continuous_eval_const ![v i, v i]
}
@@ -97,7 +97,7 @@ noncomputable def Gradient
apply continuous_finset_sum
intro i _
apply Continuous.smul
exact ContinuousMultilinearMap.continuous_eval_const ![v i]
exact ContinuousEvalConst.continuous_eval_const ![v i]
exact continuous_const
}

View File

@@ -2,8 +2,8 @@ import Mathlib.Analysis.Complex.TaylorSeries
import Nevanlinna.cauchyRiemann
variable {E : Type*} [NormedAddCommGroup E] [NormedSpace E]
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace F] [CompleteSpace F]
variable {G : Type*} [NormedAddCommGroup G] [NormedSpace G] [CompleteSpace G]
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace F]
variable {G : Type*} [NormedAddCommGroup G] [NormedSpace G]
def HolomorphicAt (f : E F) (x : E) : Prop :=
s nhds x, z s, DifferentiableAt f z
@@ -33,6 +33,21 @@ theorem HolomorphicAt_iff
· assumption
theorem HolomorphicAt_analyticAt
[CompleteSpace F]
{f : F}
{x : } :
HolomorphicAt f x AnalyticAt f x := by
intro hf
obtain s, h₁s, h₂s, h₃s := HolomorphicAt_iff.1 hf
apply DifferentiableOn.analyticAt (s := s)
intro z hz
apply DifferentiableAt.differentiableWithinAt
apply h₃s
exact hz
exact IsOpen.mem_nhds h₁s h₂s
theorem HolomorphicAt_differentiableAt
{f : E F}
{x : E} :
@@ -105,6 +120,7 @@ theorem HolomorphicAt_neg
theorem HolomorphicAt_contDiffAt
[CompleteSpace F]
{f : F}
{z : }
(hf : HolomorphicAt f z) :

View File

@@ -0,0 +1,171 @@
import Init.Classical
import Mathlib.Analysis.Analytic.Meromorphic
import Mathlib.Topology.ContinuousOn
import Mathlib.Analysis.Analytic.IsolatedZeros
import Nevanlinna.leftovers.holomorphic
import Nevanlinna.leftovers.analyticOnNhd_zeroSet
noncomputable def zeroDivisor
(f : ) :
:= by
intro z
by_cases hf : AnalyticAt f z
· exact hf.order.toNat
· exact 0
theorem analyticAtZeroDivisorSupport
{f : }
{z : }
(h : z Function.support (zeroDivisor f)) :
AnalyticAt f z := by
by_contra h₁f
simp at h
dsimp [zeroDivisor] at h
simp [h₁f] at h
theorem zeroDivisor_eq_ord_AtZeroDivisorSupport
{f : }
{z : }
(h : z Function.support (zeroDivisor f)) :
zeroDivisor f z = (analyticAtZeroDivisorSupport h).order.toNat := by
unfold zeroDivisor
simp [analyticAtZeroDivisorSupport h]
lemma toNatEqSelf_iff {n : } : n.toNat = n m : , m = n := by
constructor
· intro H₁
rw [ ENat.some_eq_coe, WithTop.ne_top_iff_exists]
by_contra H₂
rw [H₂] at H₁
simp at H₁
· intro H
obtain m, hm := H
rw [ hm]
simp
lemma natural_if_toNatNeZero {n : } : n.toNat 0 m : , m = n := by
rw [ ENat.some_eq_coe, WithTop.ne_top_iff_exists]
contrapose; simp; tauto
theorem zeroDivisor_localDescription
{f : }
{z₀ : }
(h : z₀ Function.support (zeroDivisor f)) :
(g : ), AnalyticAt g z₀ g z₀ 0 (z : ) in nhds z₀, f z = (z - z₀) ^ (zeroDivisor f z₀) g z := by
have A : zeroDivisor f z₀ 0 := by exact h
let B := zeroDivisor_eq_ord_AtZeroDivisorSupport h
rw [B] at A
have C := natural_if_toNatNeZero A
obtain m, hm := C
have h₂m : m 0 := by
rw [ hm] at A
simp at A
assumption
rw [eq_comm] at hm
let E := AnalyticAt.order_eq_nat_iff (analyticAtZeroDivisorSupport h) m
let F := hm
rw [E] at F
have : m = zeroDivisor f z₀ := by
rw [B, hm]
simp
rwa [this] at F
theorem zeroDivisor_zeroSet
{f : }
{z₀ : }
(h : z₀ Function.support (zeroDivisor f)) :
f z₀ = 0 := by
obtain g, _, _, h₃ := zeroDivisor_localDescription h
rw [Filter.Eventually.self_of_nhds h₃]
simp
left
exact h
theorem zeroDivisor_support_iff
{f : }
{z₀ : } :
z₀ Function.support (zeroDivisor f)
f z₀ = 0
AnalyticAt f z₀
(g : ), AnalyticAt g z₀ g z₀ 0 (z : ) in nhds z₀, f z = (z - z₀) ^ (zeroDivisor f z₀) g z := by
constructor
· intro hz
constructor
· exact zeroDivisor_zeroSet hz
· constructor
· exact analyticAtZeroDivisorSupport hz
· exact zeroDivisor_localDescription hz
· intro h₁, h₂, h₃
have : zeroDivisor f z₀ = (h₂.order).toNat := by
unfold zeroDivisor
simp [h₂]
simp [this]
simp [(h₂.order_eq_nat_iff (zeroDivisor f z₀)).2 h₃]
obtain g, h₁g, h₂g, h₃g := h₃
rw [Filter.Eventually.self_of_nhds h₃g] at h₁
simp [h₂g] at h₁
assumption
theorem topOnPreconnected
{f : }
{U : Set }
(hU : IsPreconnected U)
(h₁f : AnalyticOnNhd f U)
(h₂f : z U, f z 0) :
(hz : z U), (h₁f z hz).order := by
by_contra H
push_neg at H
obtain z', hz' := H
rw [AnalyticAt.order_eq_top_iff] at hz'
rw [ AnalyticAt.frequently_zero_iff_eventually_zero (h₁f z z')] at hz'
have A := AnalyticOnNhd.eqOn_zero_of_preconnected_of_frequently_eq_zero h₁f hU z' hz'
tauto
theorem supportZeroSet
{f : }
{U : Set }
(hU : IsPreconnected U)
(h₁f : AnalyticOnNhd f U)
(h₂f : z U, f z 0) :
U Function.support (zeroDivisor f) = U f⁻¹' {0} := by
ext x
constructor
· intro hx
constructor
· exact hx.1
exact zeroDivisor_zeroSet hx.2
· simp
intro h₁x h₂x
constructor
· exact h₁x
· let A := zeroDivisor_support_iff (f := f) (z₀ := x)
simp at A
rw [A]
constructor
· exact h₂x
· constructor
· exact h₁f x h₁x
· have B := AnalyticAt.order_eq_nat_iff (h₁f x h₁x) (zeroDivisor f x)
simp at B
rw [ B]
dsimp [zeroDivisor]
simp [h₁f x h₁x]
refine Eq.symm (ENat.coe_toNat ?h.mpr.right.right.right.a)
exact topOnPreconnected hU h₁f h₂f h₁x

159
Nevanlinna/logpos.lean Normal file
View File

@@ -0,0 +1,159 @@
import Mathlib.Analysis.SpecialFunctions.Log.Basic
open Real
noncomputable def logpos : := fun r max 0 (log r)
notation "log⁺" => logpos
theorem loglogpos {r : } : log r = log r - log r⁻¹ := by
unfold logpos
rw [log_inv]
by_cases h : 0 log r
· simp [h]
· simp at h
have : 0 -log r := Left.nonneg_neg_iff.2 (le_of_lt h)
simp [h, this]
exact neg_nonneg.mp this
theorem logpos_norm {r : } : log r = 2⁻¹ * (log r + log r) := by
by_cases hr : 0 log r
· rw [norm_of_nonneg hr]
have : logpos r = log r := by
unfold logpos
simp [hr]
rw [this]
ring
· rw [norm_of_nonpos (le_of_not_ge hr)]
have : logpos r = 0 := by
unfold logpos
simp
exact le_of_not_ge hr
rw [this]
ring
theorem logpos_nonneg
{x : } :
0 log x := by
unfold logpos
simp
theorem logpos_abs
{x : } :
log x = log |x| := by
unfold logpos
simp
-- Warning: This should be fixed in Mathlib
theorem log_pos_iff' (hx : 0 x) : 0 < log x 1 < x := by
by_cases h₁x : x = 0
· rw [h₁x]; simp
· exact log_pos_iff (lt_of_le_of_ne hx (Ne.symm h₁x))
theorem Real.monotoneOn_logpos :
MonotoneOn logpos (Set.Ici 0) := by
intro x hx y hy hxy
unfold logpos
simp
by_cases h : log x 0
· tauto
· simp [h]
simp at h
have : log x log y := by
apply log_le_log
--
rw [log_pos_iff' hx] at h
have : (0 : ) < 1 := by exact Real.zero_lt_one
exact lt_trans this h
assumption
constructor
· linarith
· linarith
theorem logpos_add_le_add_logpos_add_log2₀
{a b : }
(h : |a| |b|) :
log (a + b) log a + log b + log 2 := by
nth_rw 1 [logpos_abs]
nth_rw 2 [logpos_abs]
nth_rw 3 [logpos_abs]
calc log |a + b|
_ log (|a| + |b|) := by
apply Real.monotoneOn_logpos
simp [abs_nonneg]; simp [abs_nonneg]
apply add_nonneg
simp [abs_nonneg]; simp [abs_nonneg]
exact abs_add_le a b
_ log (|b| + |b|) := by
apply Real.monotoneOn_logpos
simp [abs_nonneg]
apply add_nonneg
simp [abs_nonneg]; simp [abs_nonneg]
simp [h]
linarith
_ = log (2 * |b|) := by
congr; ring
_ log |b| + log 2 := by
unfold logpos; simp
constructor
· apply add_nonneg
simp
exact log_nonneg one_le_two
· by_cases hb: b = 0
· rw [hb]; simp
exact log_nonneg one_le_two
· rw [log_mul, log_abs, add_comm]
simp
exact Ne.symm (NeZero.ne' 2)
exact abs_ne_zero.mpr hb
_ log |a| + log |b| + log 2 := by
unfold logpos; simp
theorem logpos_add_le_add_logpos_add_log2
{a b : } :
log (a + b) log a + log b + log 2 := by
by_cases h : |a| |b|
· exact logpos_add_le_add_logpos_add_log2₀ h
· rw [add_comm a b, add_comm (log a) (log b)]
apply logpos_add_le_add_logpos_add_log2₀
exact le_of_not_ge h
theorem monoOn_logpos :
MonotoneOn log (Set.Ici 0) := by
intro x hx y hy hxy
by_cases h₁x : x = 0
· rw [h₁x]
unfold logpos
simp
simp at hx hy
unfold logpos
simp
by_cases h₂x : log x 0
· tauto
· simp [h₂x]
simp at h₂x
have : log x log y := by
apply log_le_log
exact lt_of_le_of_ne hx fun a => h₁x (id (Eq.symm a))
assumption
simp [this]
calc 0
_ log x := by exact le_of_lt h₂x
_ log y := this

View File

@@ -1,5 +1,7 @@
import Mathlib.Analysis.Analytic.Meromorphic
import Mathlib.Analysis.Calculus.ContDiff.Basic
import Mathlib.Analysis.Calculus.FDeriv.Add
import Nevanlinna.analyticAt
variable {𝕜 : Type*} [NontriviallyNormedField 𝕜]
variable {E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E]
@@ -33,3 +35,68 @@ theorem ContDiff.const_smul' {f : E → F} (c : R) (hf : ContDiff 𝕜 n f) :
have : c f = fun x c f x := rfl
rw [this]
exact ContDiff.const_smul c hf
open Topology Filter
lemma Mnhds
{α : Type}
{f g : α}
{z₀ : }
(h₁ : f =[𝓝[] z₀] g)
(h₂ : f z₀ = g z₀) :
f =[𝓝 z₀] g := by
apply eventually_nhds_iff.2
obtain t, h₁t, h₂t := eventually_nhds_iff.1 (eventually_nhdsWithin_iff.1 h₁)
use t
constructor
· intro y hy
by_cases h₂y : y ({z₀} : Set )
· exact h₁t y hy h₂y
· simp at h₂y
rwa [h₂y]
· exact h₂t
-- unclear where this should go
lemma WithTopCoe
{n : WithTop } :
WithTop.map (Nat.cast : ) n = 0 n = 0 := by
rcases n with h|h
· intro h
contradiction
· intro h₁
simp only [WithTop.map, Option.map] at h₁
have : (h : ) = 0 := by
exact WithTop.coe_eq_zero.mp h₁
have : h = 0 := by
exact Int.ofNat_eq_zero.mp this
rw [this]
rfl
lemma rwx
{a b : WithTop }
(ha : a )
(hb : b ) :
a + b := by
simp; tauto
lemma untop_add
{a b : WithTop }
(ha : a )
(hb : b ) :
(a + b).untop (rwx ha hb) = a.untop ha + (b.untop hb) := by
rw [WithTop.untop_eq_iff]
rw [WithTop.coe_add]
rw [WithTop.coe_untop]
rw [WithTop.coe_untop]
lemma untop'_of_ne_top
{a : WithTop }
{d : }
(ha : a ) :
WithTop.untop' d a = a := by
obtain b, hb := WithTop.ne_top_iff_exists.1 ha
rw [ hb]
simp

View File

@@ -0,0 +1,492 @@
import Mathlib.Analysis.Analytic.Meromorphic
import Nevanlinna.analyticAt
import Nevanlinna.divisor
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
theorem meromorphicAt_congr
{𝕜 : Type u_1} [NontriviallyNormedField 𝕜]
{E : Type u_2} [NormedAddCommGroup E] [NormedSpace 𝕜 E]
{f : 𝕜 E} {g : 𝕜 E} {x : 𝕜}
(h : f =[𝓝[] x] g) : MeromorphicAt f x MeromorphicAt g x :=
fun hf hf.congr h, fun hg hg.congr h.symm
theorem meromorphicAt_congr'
{𝕜 : Type u_1} [NontriviallyNormedField 𝕜]
{E : Type u_2} [NormedAddCommGroup E] [NormedSpace 𝕜 E]
{f : 𝕜 E} {g : 𝕜 E} {x : 𝕜}
(h : f =[nhds x] g) : MeromorphicAt f x MeromorphicAt g x :=
meromorphicAt_congr (Filter.EventuallyEq.filter_mono h nhdsWithin_le_nhds)
theorem MeromorphicAt.eventually_eq_zero_or_eventually_ne_zero
{f : }
{z₀ : }
(hf : MeromorphicAt f z₀) :
( (z : ) in nhdsWithin z₀ {z₀}, f z = 0) (z : ) in nhdsWithin z₀ {z₀}, f z 0 := by
obtain n, h := hf
let A := h.eventually_eq_zero_or_eventually_ne_zero
rw [eventually_nhdsWithin_iff]
rw [eventually_nhds_iff]
rcases A with h₁|h₂
· rw [eventually_nhds_iff] at h₁
obtain N, h₁N, h₂N, h₃N := h₁
left
use N
constructor
· intro y h₁y h₂y
let A := h₁N y h₁y
simp at A
rcases A with h₃|h₄
· let B := h₃.1
simp at h₂y
let C := sub_eq_zero.1 B
tauto
· assumption
· constructor
· exact h₂N
· exact h₃N
· right
rw [eventually_nhdsWithin_iff]
rw [eventually_nhds_iff]
rw [eventually_nhdsWithin_iff] at h₂
rw [eventually_nhds_iff] at h₂
obtain N, h₁N, h₂N, h₃N := h₂
use N
constructor
· intro y h₁y h₂y
by_contra h
let A := h₁N y h₁y h₂y
rw [h] at A
simp at A
· constructor
· exact h₂N
· exact h₃N
theorem MeromorphicAt.order_congr
{f₁ f₂ : }
{z₀ : }
(hf₁ : MeromorphicAt f₁ z₀)
(h : f₁ =[𝓝[] z₀] f₂):
hf₁.order = (hf₁.congr h).order := by
by_cases hord : hf₁.order =
· rw [hord, eq_comm]
rw [hf₁.order_eq_top_iff] at hord
rw [(hf₁.congr h).order_eq_top_iff]
exact EventuallyEq.rw hord (fun x => Eq (f₂ x)) (_root_.id (EventuallyEq.symm h))
· obtain n, hn : hf₁.order = n := Option.ne_none_iff_exists'.mp hord
obtain g, h₁g, h₂g, h₃g := (hf₁.order_eq_int_iff n).1 hn
rw [hn, eq_comm, (hf₁.congr h).order_eq_int_iff]
use g
constructor
· assumption
· constructor
· assumption
· exact EventuallyEq.rw h₃g (fun x => Eq (f₂ x)) (_root_.id (EventuallyEq.symm h))
theorem MeromorphicAt.order_mul
{f₁ f₂ : }
{z₀ : }
(hf₁ : MeromorphicAt f₁ z₀)
(hf₂ : MeromorphicAt f₂ z₀) :
(hf₁.mul hf₂).order = hf₁.order + hf₂.order := by
by_cases h₂f₁ : hf₁.order =
· simp [h₂f₁]
rw [hf₁.order_eq_top_iff, eventually_nhdsWithin_iff, eventually_nhds_iff] at h₂f₁
rw [(hf₁.mul hf₂).order_eq_top_iff, eventually_nhdsWithin_iff, eventually_nhds_iff]
obtain t, h₁t, h₂t, h₃t := h₂f₁
use t
constructor
· intro y h₁y h₂y
simp; left
rw [h₁t y h₁y h₂y]
· exact h₂t, h₃t
· by_cases h₂f₂ : hf₂.order =
· simp [h₂f₂]
rw [hf₂.order_eq_top_iff, eventually_nhdsWithin_iff, eventually_nhds_iff] at h₂f₂
rw [(hf₁.mul hf₂).order_eq_top_iff, eventually_nhdsWithin_iff, eventually_nhds_iff]
obtain t, h₁t, h₂t, h₃t := h₂f₂
use t
constructor
· intro y h₁y h₂y
simp; right
rw [h₁t y h₁y h₂y]
· exact h₂t, h₃t
· have h₃f₁ := Eq.symm (WithTop.coe_untop hf₁.order h₂f₁)
have h₃f₂ := Eq.symm (WithTop.coe_untop hf₂.order h₂f₂)
obtain g₁, h₁g₁, h₂g₁, h₃g₁ := (hf₁.order_eq_int_iff (hf₁.order.untop h₂f₁)).1 h₃f₁
obtain g₂, h₁g₂, h₂g₂, h₃g₂ := (hf₂.order_eq_int_iff (hf₂.order.untop h₂f₂)).1 h₃f₂
rw [h₃f₁, h₃f₂, WithTop.coe_add]
rw [MeromorphicAt.order_eq_int_iff]
use g₁ * g₂
constructor
· exact AnalyticAt.mul h₁g₁ h₁g₂
· constructor
· simp; tauto
· obtain t₁, h₁t₁, h₂t₁, h₃t₁ := eventually_nhds_iff.1 (eventually_nhdsWithin_iff.1 h₃g₁)
obtain t₂, h₁t₂, h₂t₂, h₃t₂ := eventually_nhds_iff.1 (eventually_nhdsWithin_iff.1 h₃g₂)
rw [eventually_nhdsWithin_iff, eventually_nhds_iff]
use t₁ t₂
constructor
· intro y h₁y h₂y
simp
rw [h₁t₁ y h₁y.1 h₂y, h₁t₂ y h₁y.2 h₂y]
simp
rw [zpow_add' (by left; exact sub_ne_zero_of_ne h₂y)]
group
· constructor
· exact IsOpen.inter h₂t₁ h₂t₂
· exact Set.mem_inter h₃t₁ h₃t₂
theorem MeromorphicAt.order_neg_zero_iff
{f : }
{z₀ : }
(hf : MeromorphicAt f z₀) :
hf.order (g : ), AnalyticAt g z₀ g z₀ 0 (z : ) in nhdsWithin z₀ {z₀}, f z = (z - z₀) ^ (hf.order.untop' 0) g z := by
constructor
· intro h
exact (hf.order_eq_int_iff (hf.order.untop' 0)).1 (Eq.symm (untop'_of_ne_top h))
· rw [ hf.order_eq_int_iff]
intro h
exact Option.ne_none_iff_exists'.mpr hf.order.untop' 0, h
theorem MeromorphicAt.order_inv
{f : }
{z₀ : }
(hf : MeromorphicAt f z₀) :
hf.order = -hf.inv.order := by
by_cases h₂f : hf.order =
· simp [h₂f]
have : hf.inv.order = := by
rw [hf.inv.order_eq_top_iff]
rw [eventually_nhdsWithin_iff]
rw [eventually_nhds_iff]
rw [hf.order_eq_top_iff] at h₂f
rw [eventually_nhdsWithin_iff] at h₂f
rw [eventually_nhds_iff] at h₂f
obtain t, h₁t, h₂t, h₃t := h₂f
use t
constructor
· intro y h₁y h₂y
simp
rw [h₁t y h₁y h₂y]
· exact h₂t, h₃t
rw [this]
simp
· have : hf.order = hf.order.untop' 0 := by
simp [h₂f, untop'_of_ne_top]
rw [this]
rw [eq_comm]
rw [neg_eq_iff_eq_neg]
apply (hf.inv.order_eq_int_iff (-hf.order.untop' 0)).2
rw [hf.order_eq_int_iff] at this
obtain g, h₁g, h₂g, h₃g := this
use g⁻¹
constructor
· exact AnalyticAt.inv h₁g h₂g
· constructor
· simp [h₂g]
· rw [eventually_nhdsWithin_iff]
rw [eventually_nhds_iff]
rw [eventually_nhdsWithin_iff] at h₃g
rw [eventually_nhds_iff] at h₃g
obtain t, h₁t, h₂t, h₃t := h₃g
use t
constructor
· intro y h₁y h₂y
simp
let A := h₁t y h₁y h₂y
rw [A]
simp
rw [mul_comm]
· exact h₂t, h₃t
theorem AnalyticAt.meromorphicAt_order_nonneg
{f : }
{z₀ : }
(hf : AnalyticAt f z₀) :
0 hf.meromorphicAt.order := by
rw [hf.meromorphicAt_order]
rw [(by rfl : (0 : WithTop ) = WithTop.map Nat.cast (0 : ))]
erw [WithTop.map_le_iff]
simp; simp
theorem MeromorphicAt.order_add
{f₁ f₂ : }
{z₀ : }
(hf₁ : MeromorphicAt f₁ z₀)
(hf₂ : MeromorphicAt f₂ z₀) :
min hf₁.order hf₂.order (hf₁.add hf₂).order := by
-- Handle the trivial cases where one of the orders equals
by_cases h₂f₁: hf₁.order =
· rw [h₂f₁]; simp
rw [hf₁.order_eq_top_iff] at h₂f₁
have h : f₁ + f₂ =[𝓝[] z₀] f₂ := by
-- Optimize this, here an elsewhere
rw [eventuallyEq_nhdsWithin_iff, eventually_iff_exists_mem]
rw [eventually_nhdsWithin_iff, eventually_iff_exists_mem] at h₂f₁
obtain v, hv := h₂f₁
use v; simp; trivial
rw [(hf₁.add hf₂).order_congr h]
by_cases h₂f₂: hf₂.order =
· rw [h₂f₂]; simp
rw [hf₂.order_eq_top_iff] at h₂f₂
have h : f₁ + f₂ =[𝓝[] z₀] f₁ := by
rw [eventuallyEq_nhdsWithin_iff, eventually_iff_exists_mem]
rw [eventually_nhdsWithin_iff, eventually_iff_exists_mem] at h₂f₂
obtain v, hv := h₂f₂
use v; simp; trivial
rw [(hf₁.add hf₂).order_congr h]
obtain g₁, h₁g₁, h₂g₁, h₃g₁ := hf₁.order_neg_zero_iff.1 h₂f₁
obtain g₂, h₁g₂, h₂g₂, h₃g₂ := hf₂.order_neg_zero_iff.1 h₂f₂
let n₁ := WithTop.untop' 0 hf₁.order
let n₂ := WithTop.untop' 0 hf₂.order
let n := min n₁ n₂
have h₁n₁ : 0 n₁ - n := by
rw [sub_nonneg]
exact Int.min_le_left n₁ n₂
have h₁n₂ : 0 n₂ - n := by
rw [sub_nonneg]
exact Int.min_le_right n₁ n₂
let g := (fun z (z - z₀) ^ (n₁ - n)) * g₁ + (fun z (z - z₀) ^ (n₂ - n)) * g₂
have h₁g : AnalyticAt g z₀ := by
apply AnalyticAt.add
apply AnalyticAt.mul
apply AnalyticAt.zpow_nonneg _ h₁n₁
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_const
exact h₁g₁
apply AnalyticAt.mul
apply AnalyticAt.zpow_nonneg _ h₁n₂
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_const
exact h₁g₂
have h₂g : 0 h₁g.meromorphicAt.order := h₁g.meromorphicAt_order_nonneg
have : f₁ + f₂ =[𝓝[] z₀] (fun z (z - z₀) ^ n) * g := by
rw [eventuallyEq_nhdsWithin_iff, eventually_nhds_iff]
obtain t, ht := eventually_nhds_iff.1 (eventually_nhdsWithin_iff.1 (h₃g₁.and h₃g₂))
use t
simp [ht]
intro y h₁y h₂y
rw [(ht.1 y h₁y h₂y).1, (ht.1 y h₁y h₂y).2]
unfold g; simp; rw [mul_add]
repeat rw [mul_assoc, zpow_add' (by left; exact (sub_ne_zero_of_ne h₂y))]
simp
rw [(hf₁.add hf₂).order_congr this]
have t₀ : MeromorphicAt (fun z (z - z₀) ^ n) z₀ := by
apply MeromorphicAt.zpow
apply MeromorphicAt.sub
apply MeromorphicAt.id
apply MeromorphicAt.const
rw [t₀.order_mul h₁g.meromorphicAt]
have t₁ : t₀.order = n := by
rw [t₀.order_eq_int_iff]
use 1
constructor
· apply analyticAt_const
· simp
rw [t₁]
unfold n n₁ n₂
have : hf₁.order hf₂.order = (WithTop.untop' 0 hf₁.order WithTop.untop' 0 hf₂.order) := by
rw [untop'_of_ne_top (d := 0) h₂f₁, untop'_of_ne_top (d := 0) h₂f₂]
simp
rw [this]
exact le_add_of_nonneg_right h₂g
theorem MeromorphicAt.order_add_of_ne_orders
{f₁ f₂ : }
{z₀ : }
(hf₁ : MeromorphicAt f₁ z₀)
(hf₂ : MeromorphicAt f₂ z₀)
(hf₁₂ : hf₁.order hf₂.order) :
min hf₁.order hf₂.order = (hf₁.add hf₂).order := by
-- Handle the trivial cases where one of the orders equals
by_cases h₂f₁: hf₁.order =
· rw [h₂f₁]; simp
rw [hf₁.order_eq_top_iff] at h₂f₁
have h : f₁ + f₂ =[𝓝[] z₀] f₂ := by
-- Optimize this, here an elsewhere
rw [eventuallyEq_nhdsWithin_iff, eventually_iff_exists_mem]
rw [eventually_nhdsWithin_iff, eventually_iff_exists_mem] at h₂f₁
obtain v, hv := h₂f₁
use v; simp; trivial
rw [(hf₁.add hf₂).order_congr h]
by_cases h₂f₂: hf₂.order =
· rw [h₂f₂]; simp
rw [hf₂.order_eq_top_iff] at h₂f₂
have h : f₁ + f₂ =[𝓝[] z₀] f₁ := by
rw [eventuallyEq_nhdsWithin_iff, eventually_iff_exists_mem]
rw [eventually_nhdsWithin_iff, eventually_iff_exists_mem] at h₂f₂
obtain v, hv := h₂f₂
use v; simp; trivial
rw [(hf₁.add hf₂).order_congr h]
obtain g₁, h₁g₁, h₂g₁, h₃g₁ := hf₁.order_neg_zero_iff.1 h₂f₁
obtain g₂, h₁g₂, h₂g₂, h₃g₂ := hf₂.order_neg_zero_iff.1 h₂f₂
let n₁ := WithTop.untop' 0 hf₁.order
let n₂ := WithTop.untop' 0 hf₂.order
have hn₁₂ : n₁ n₂ := by
unfold n₁ n₂
let A := WithTop.untop'_eq_untop'_iff (d := 0) (x := hf₁.order) (y := hf₂.order)
let B := A.not
simp
rw [B]
push_neg
constructor
· assumption
· tauto
let n := min n₁ n₂
have h₁n₁ : 0 n₁ - n := by
rw [sub_nonneg]
exact Int.min_le_left n₁ n₂
have h₁n₂ : 0 n₂ - n := by
rw [sub_nonneg]
exact Int.min_le_right n₁ n₂
let g := (fun z (z - z₀) ^ (n₁ - n)) * g₁ + (fun z (z - z₀) ^ (n₂ - n)) * g₂
have h₁g : AnalyticAt g z₀ := by
apply AnalyticAt.add
apply AnalyticAt.mul
apply AnalyticAt.zpow_nonneg _ h₁n₁
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_const
exact h₁g₁
apply AnalyticAt.mul
apply AnalyticAt.zpow_nonneg _ h₁n₂
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_const
exact h₁g₂
have h₂g : 0 h₁g.meromorphicAt.order := h₁g.meromorphicAt_order_nonneg
have h₂'g : g z₀ 0 := by
unfold g
simp
have : n = n₁ n = n₂ := by
unfold n
simp
by_cases h : n₁ n₂
· left; assumption
· right
simp at h
exact le_of_lt h
rcases this with h|h
· rw [h]
have : n₂ - n₁ 0 := by
rw [sub_ne_zero, ne_comm]
apply hn₁₂
have : (0 : ) ^ (n₂ - n₁) = 0 := by
rwa [zpow_eq_zero_iff]
simp [this]
exact h₂g₁
· rw [h]
have : n₁ - n₂ 0 := by
rw [sub_ne_zero]
apply hn₁₂
have : (0 : ) ^ (n₁ - n₂) = 0 := by
rwa [zpow_eq_zero_iff]
simp [this]
exact h₂g₂
have h₃g : h₁g.meromorphicAt.order = 0 := by
let A := h₁g.meromorphicAt_order
let B := h₁g.order_eq_zero_iff.2 h₂'g
rw [B] at A
simpa
have : f₁ + f₂ =[𝓝[] z₀] (fun z (z - z₀) ^ n) * g := by
rw [eventuallyEq_nhdsWithin_iff, eventually_nhds_iff]
obtain t, ht := eventually_nhds_iff.1 (eventually_nhdsWithin_iff.1 (h₃g₁.and h₃g₂))
use t
simp [ht]
intro y h₁y h₂y
rw [(ht.1 y h₁y h₂y).1, (ht.1 y h₁y h₂y).2]
unfold g; simp; rw [mul_add]
repeat rw [mul_assoc, zpow_add' (by left; exact (sub_ne_zero_of_ne h₂y))]
simp
rw [(hf₁.add hf₂).order_congr this]
have t₀ : MeromorphicAt (fun z (z - z₀) ^ n) z₀ := by
apply MeromorphicAt.zpow
apply MeromorphicAt.sub
apply MeromorphicAt.id
apply MeromorphicAt.const
rw [t₀.order_mul h₁g.meromorphicAt]
have t₁ : t₀.order = n := by
rw [t₀.order_eq_int_iff]
use 1
constructor
· apply analyticAt_const
· simp
rw [t₁]
unfold n n₁ n₂
have : hf₁.order hf₂.order = (WithTop.untop' 0 hf₁.order WithTop.untop' 0 hf₂.order) := by
rw [untop'_of_ne_top (d := 0) h₂f₁, untop'_of_ne_top (d := 0) h₂f₂]
simp
rw [this, h₃g]
simp
-- Might want to think about adding an analytic function instead of a constant
theorem MeromorphicAt.order_add_const
--have {z : } : 0 < (hf z trivial).order → (hf z trivial).order = ((hf.add (MeromorphicOn.const a)) z trivial).order:= by
{f : }
{z a : }
(hf : MeromorphicAt f z) :
hf.order < 0 hf.order = (hf.add (MeromorphicAt.const a z)).order := by
intro h
by_cases ha: a = 0
· -- might want theorem MeromorphicAt.order_const
have : (MeromorphicAt.const a z).order = := by
rw [MeromorphicAt.order_eq_top_iff]
rw [ha]
simp
rw [hf.order_add_of_ne_orders (MeromorphicAt.const a z)]
rw [this]
simp
rw [this]
exact LT.lt.ne_top h
· have : (MeromorphicAt.const a z).order = (0 : ) := by
rw [MeromorphicAt.order_eq_int_iff]
use fun _ a
constructor
· exact analyticAt_const
· simpa
rw [hf.order_add_of_ne_orders (MeromorphicAt.const a z)]
rw [this]
simp
exact le_of_lt h
rw [this]
exact ne_of_lt h
-- might want theorem MeromorphicAt.order_zpow

View File

@@ -0,0 +1,185 @@
import Mathlib.Analysis.Analytic.Meromorphic
import Nevanlinna.analyticAt
import Nevanlinna.divisor
import Nevanlinna.meromorphicAt
import Nevanlinna.stronglyMeromorphicOn
import Nevanlinna.mathlibAddOn
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
theorem MeromorphicOn.open_of_order_eq_top
{f : }
{U : Set }
(h₁f : MeromorphicOn f U) :
IsOpen { u : U | (h₁f u.1 u.2).order = } := by
apply isOpen_iff_forall_mem_open.mpr
intro z hz
simp at hz
have h₁z := hz
rw [MeromorphicAt.order_eq_top_iff] at hz
rw [eventually_nhdsWithin_iff] at hz
rw [eventually_nhds_iff] at hz
obtain t', h₁t', h₂t', h₃t' := hz
let t : Set U := Subtype.val ⁻¹' t'
use t
constructor
· intro w hw
simp
by_cases h₁w : w = z
· rwa [h₁w]
· --
rw [MeromorphicAt.order_eq_top_iff]
rw [eventually_nhdsWithin_iff]
rw [eventually_nhds_iff]
use t' \ {z.1}
constructor
· intro y h₁y h₂y
apply h₁t'
exact Set.mem_of_mem_diff h₁y
exact Set.mem_of_mem_inter_right h₁y
· constructor
· apply IsOpen.sdiff h₂t'
exact isClosed_singleton
· rw [Set.mem_diff]
constructor
· exact hw
· simp
exact Subtype.coe_ne_coe.mpr h₁w
· constructor
· exact isOpen_induced h₂t'
· exact h₃t'
theorem MeromorphicOn.open_of_order_neq_top
{f : }
{U : Set }
(h₁f : MeromorphicOn f U) :
IsOpen { u : U | (h₁f u.1 u.2).order } := by
apply isOpen_iff_forall_mem_open.mpr
intro z hz
simp at hz
let A := (h₁f z.1 z.2).eventually_eq_zero_or_eventually_ne_zero
rcases A with h|h
· rw [ (h₁f z.1 z.2).order_eq_top_iff] at h
tauto
· let A := (h₁f z.1 z.2).eventually_analyticAt
let B := Filter.Eventually.and h A
rw [eventually_nhdsWithin_iff] at B
rw [eventually_nhds_iff] at B
obtain t', h₁t', h₂t', h₃t' := B
let t : Set U := Subtype.val ⁻¹' t'
use t
constructor
· intro w hw
simp
by_cases h₁w : w = z
· rwa [h₁w]
· let B := h₁t' w hw
simp at B
have : (w : ) (z : ) := by exact Subtype.coe_ne_coe.mpr h₁w
let C := B this
let D := C.2.order_eq_zero_iff.2 C.1
rw [C.2.meromorphicAt_order, D]
simp
· constructor
· exact isOpen_induced h₂t'
· exact h₃t'
theorem MeromorphicOn.clopen_of_order_eq_top
{f : }
{U : Set }
(h₁f : MeromorphicOn f U) :
IsClopen { u : U | (h₁f u.1 u.2).order = } := by
constructor
· rw [ isOpen_compl_iff]
exact open_of_order_neq_top h₁f
· exact open_of_order_eq_top h₁f
theorem MeromorphicOn.order_ne_top'
{f : }
{U : Set }
(h₁f : MeromorphicOn f U)
(hU : IsConnected U) :
( u : U, (h₁f u u.2).order ) ( u : U, (h₁f u u.2).order ) := by
constructor
· intro h₂f
let A := h₁f.clopen_of_order_eq_top
have : PreconnectedSpace U := by
apply isPreconnected_iff_preconnectedSpace.mp
exact IsConnected.isPreconnected hU
rw [isClopen_iff] at A
rcases A with h|h
· intro u
have : u ( : Set U) := by exact fun a => a
rw [ h] at this
simp at this
tauto
· obtain u, hU := h₂f
have A : u Set.univ := by trivial
rw [ h] at A
simp at A
tauto
· intro h₂f
let A := hU.nonempty
obtain v, hv := A
use v, hv
exact h₂f v, hv
theorem StronglyMeromorphicOn.order_ne_top
{f : }
{U : Set }
(h₁f : StronglyMeromorphicOn f U)
(hU : IsConnected U)
(h₂f : u : U, f u 0) :
u : U, (h₁f u u.2).meromorphicAt.order := by
rw [ h₁f.meromorphicOn.order_ne_top' hU]
obtain u, hu := h₂f
use u
rw [ (h₁f u u.2).order_eq_zero_iff] at hu
rw [hu]
simp
theorem MeromorphicOn.nonvanish_of_order_ne_top
{f : }
{U : Set }
(h₁f : MeromorphicOn f U)
(h₂f : u : U, (h₁f u u.2).order )
(h₁U : IsConnected U)
(h₂U : interior U ) :
u U, f u 0 := by
by_contra hCon
push_neg at hCon
have : u : U, (h₁f u u.2).order = := by
obtain v, h₁v := Set.nonempty_iff_ne_empty'.2 h₂U
have h₂v : v U := by apply interior_subset h₁v
use v, h₂v
rw [MeromorphicAt.order_eq_top_iff]
rw [eventually_nhdsWithin_iff]
rw [eventually_nhds_iff]
use interior U
constructor
· intro y h₁y h₂y
exact hCon y (interior_subset h₁y)
· simp [h₁v]
let A := h₁f.order_ne_top' h₁U
rw [ not_iff_not] at A
push_neg at A
have B := A.2 this
obtain u, hu := h₂f
tauto

View File

@@ -0,0 +1,394 @@
import Mathlib.Analysis.Analytic.Meromorphic
import Nevanlinna.analyticAt
import Nevanlinna.divisor
import Nevanlinna.meromorphicAt
import Nevanlinna.meromorphicOn
import Nevanlinna.stronglyMeromorphicOn
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
noncomputable def MeromorphicOn.divisor
{f : }
{U : Set }
(hf : MeromorphicOn f U) :
Divisor U where
toFun := by
intro z
if hz : z U then
exact ((hf z hz).order.untop' 0 : )
else
exact 0
supportInU := by
intro z hz
simp at hz
by_contra h₂z
simp [h₂z] at hz
locallyFiniteInU := by
intro z hz
apply eventually_nhdsWithin_iff.2
rw [eventually_nhds_iff]
rcases MeromorphicAt.eventually_eq_zero_or_eventually_ne_zero (hf z hz) with h|h
· rw [eventually_nhdsWithin_iff] at h
rw [eventually_nhds_iff] at h
obtain N, h₁N, h₂N, h₃N := h
use N
constructor
· intro y h₁y h₂y
by_cases h₃y : y U
· simp [h₃y]
right
rw [MeromorphicAt.order_eq_top_iff (hf y h₃y)]
rw [eventually_nhdsWithin_iff]
rw [eventually_nhds_iff]
use N {z}
constructor
· intro x h₁x _
exact h₁N x h₁x.1 h₁x.2
· constructor
· exact IsOpen.inter h₂N isOpen_compl_singleton
· exact Set.mem_inter h₁y h₂y
· simp [h₃y]
· tauto
· let A := (hf z hz).eventually_analyticAt
let B := Filter.eventually_and.2 h, A
rw [eventually_nhdsWithin_iff, eventually_nhds_iff] at B
obtain N, h₁N, h₂N, h₃N := B
use N
constructor
· intro y h₁y h₂y
by_cases h₃y : y U
· simp [h₃y]
left
rw [(h₁N y h₁y h₂y).2.meromorphicAt_order]
let D := (h₁N y h₁y h₂y).2.order_eq_zero_iff.2
let C := (h₁N y h₁y h₂y).1
let E := D C
rw [E]
simp
· simp [h₃y]
· tauto
theorem MeromorphicOn.divisor_def₁
{f : }
{U : Set }
{z : }
(hf : MeromorphicOn f U)
(hz : z U) :
hf.divisor z = ((hf z hz).order.untop' 0 : ) := by
unfold MeromorphicOn.divisor
simp [hz]
theorem MeromorphicOn.divisor_def₂
{f : }
{U : Set }
{z : }
(hf : MeromorphicOn f U)
(hz : z U)
(h₂f : (hf z hz).order ) :
hf.divisor z = (hf z hz).order.untop h₂f := by
unfold MeromorphicOn.divisor
simp [hz]
rw [WithTop.untop'_eq_iff]
left
exact Eq.symm (WithTop.coe_untop (hf z hz).order h₂f)
theorem MeromorphicOn.divisor_mul₀
{f₁ f₂ : }
{U : Set }
{z : }
(hz : z U)
(h₁f₁ : MeromorphicOn f₁ U)
(h₂f₁ : (h₁f₁ z hz).order )
(h₁f₂ : MeromorphicOn f₂ U)
(h₂f₂ : (h₁f₂ z hz).order ) :
(h₁f₁.mul h₁f₂).divisor.toFun z = h₁f₁.divisor.toFun z + h₁f₂.divisor.toFun z := by
by_cases h₁z : z U
· rw [MeromorphicOn.divisor_def₂ h₁f₁ hz h₂f₁]
rw [MeromorphicOn.divisor_def₂ h₁f₂ hz h₂f₂]
have B : ((h₁f₁.mul h₁f₂) z hz).order := by
rw [MeromorphicAt.order_mul (h₁f₁ z hz) (h₁f₂ z hz)]
simp; tauto
rw [MeromorphicOn.divisor_def₂ (h₁f₁.mul h₁f₂) hz B]
simp_rw [MeromorphicAt.order_mul (h₁f₁ z hz) (h₁f₂ z hz)]
rw [untop_add]
· unfold MeromorphicOn.divisor
simp [h₁z]
theorem MeromorphicOn.divisor_mul
{f₁ f₂ : }
{U : Set }
(h₁f₁ : MeromorphicOn f₁ U)
(h₂f₁ : z, (hz : z U) (h₁f₁ z hz).order )
(h₁f₂ : MeromorphicOn f₂ U)
(h₂f₂ : z, (hz : z U) (h₁f₂ z hz).order ) :
(h₁f₁.mul h₁f₂).divisor.toFun = h₁f₁.divisor.toFun + h₁f₂.divisor.toFun := by
funext z
by_cases hz : z U
· rw [MeromorphicOn.divisor_mul₀ hz h₁f₁ (h₂f₁ z hz) h₁f₂ (h₂f₂ z hz)]
simp
· simp
rw [Function.nmem_support.mp (fun a => hz (h₁f₁.divisor.supportInU a))]
rw [Function.nmem_support.mp (fun a => hz (h₁f₂.divisor.supportInU a))]
rw [Function.nmem_support.mp (fun a => hz ((h₁f₁.mul h₁f₂).divisor.supportInU a))]
simp
theorem MeromorphicOn.divisor_inv
{f: }
{U : Set }
(h₁f : MeromorphicOn f U) :
h₁f.inv.divisor.toFun = -h₁f.divisor.toFun := by
funext z
by_cases hz : z U
· rw [MeromorphicOn.divisor_def₁]
simp
rw [MeromorphicOn.divisor_def₁]
rw [MeromorphicAt.order_inv]
simp
by_cases h₂f : (h₁f z hz).order =
· simp [h₂f]
· let A := untop'_of_ne_top (d := 0) h₂f
rw [ A]
exact rfl
repeat exact hz
· unfold MeromorphicOn.divisor
simp [hz]
theorem MeromorphicOn.divisor_add_const₁
{f : }
{U : Set }
{z : }
(hf : MeromorphicOn f U)
(a : ) :
0 hf.divisor z 0 (hf.add (MeromorphicOn.const a)).divisor z := by
intro h
unfold MeromorphicOn.divisor
-- Trivial case: z ∉ U
by_cases hz : z U
· simp [hz]
-- Non-trivial case: z ∈ U
simp at hz; simp [hz]
by_cases h₁f : (hf z hz).order =
· have : f + (fun z a) =[𝓝[] z] (fun z a) := by
rw [MeromorphicAt.order_eq_top_iff] at h₁f
rw [eventually_nhdsWithin_iff] at h₁f
rw [eventually_nhds_iff] at h₁f
obtain t, ht := h₁f
rw [eventuallyEq_nhdsWithin_iff]
rw [eventually_nhds_iff]
use t
simp [ht]
tauto
rw [((hf z hz).add (MeromorphicAt.const a z)).order_congr this]
by_cases ha: (MeromorphicAt.const a z).order =
· simp [ha]
· rw [WithTop.le_untop'_iff]
apply AnalyticAt.meromorphicAt_order_nonneg
exact analyticAt_const
tauto
· rw [WithTop.le_untop'_iff]
let A := (hf z hz).order_add (MeromorphicAt.const a z)
have : 0 min (hf z hz).order (MeromorphicAt.const a z).order := by
apply le_min
--
unfold MeromorphicOn.divisor at h
simp [hz] at h
let V := untop'_of_ne_top (d := 0) h₁f
rw [ V]
simp [h]
--
apply AnalyticAt.meromorphicAt_order_nonneg
exact analyticAt_const
exact le_trans this A
tauto
theorem MeromorphicOn.divisor_add_const₂
{f : }
{U : Set }
{z : }
(hf : MeromorphicOn f U)
(a : ) :
hf.divisor z < 0 (hf.add (MeromorphicOn.const a)).divisor z < 0 := by
intro h
by_cases hz : z U
· have : hf.divisor z = 0 := by
unfold MeromorphicOn.divisor
simp [hz]
rw [this] at h
tauto
simp at hz
unfold MeromorphicOn.divisor
simp [hz]
unfold MeromorphicOn.divisor at h
simp [hz] at h
have : (hf z hz).order = (((hf.add (MeromorphicOn.const a))) z hz).order := by
have t₀ : (hf z hz).order < (0 : ) := by
by_contra hCon
simp only [not_lt] at hCon
rw [WithTop.le_untop'_iff (b := 0)] at hCon
exact Lean.Omega.Int.le_lt_asymm hCon h
tauto
rw [ MeromorphicAt.order_add_of_ne_orders (hf z hz) (MeromorphicAt.const a z)]
simp
by_cases ha: (MeromorphicAt.const a z).order =
· simp [ha]
· calc (hf z hz).order
_ 0 := by exact le_of_lt t₀
_ (MeromorphicAt.const a z).order := by
apply AnalyticAt.meromorphicAt_order_nonneg
exact analyticAt_const
apply ne_of_lt
calc (hf z hz).order
_ < 0 := by exact t₀
_ (MeromorphicAt.const a z).order := by
apply AnalyticAt.meromorphicAt_order_nonneg
exact analyticAt_const
rwa [this] at h
theorem MeromorphicOn.divisor_add_const₃
{f : }
{U : Set }
{z : }
(hf : MeromorphicOn f U)
(a : ) :
hf.divisor z < 0 (hf.add (MeromorphicOn.const a)).divisor z = hf.divisor z := by
intro h
by_cases hz : z U
· have : hf.divisor z = 0 := by
unfold MeromorphicOn.divisor
simp [hz]
rw [this] at h
tauto
simp at hz
unfold MeromorphicOn.divisor
simp [hz]
unfold MeromorphicOn.divisor at h
simp [hz] at h
have : (hf z hz).order = (((hf.add (MeromorphicOn.const a))) z hz).order := by
have t₀ : (hf z hz).order < (0 : ) := by
by_contra hCon
simp only [not_lt] at hCon
rw [WithTop.le_untop'_iff (b := 0)] at hCon
exact Lean.Omega.Int.le_lt_asymm hCon h
tauto
rw [ MeromorphicAt.order_add_of_ne_orders (hf z hz) (MeromorphicAt.const a z)]
simp
by_cases ha: (MeromorphicAt.const a z).order =
· simp [ha]
· calc (hf z hz).order
_ 0 := by exact le_of_lt t₀
_ (MeromorphicAt.const a z).order := by
apply AnalyticAt.meromorphicAt_order_nonneg
exact analyticAt_const
apply ne_of_lt
calc (hf z hz).order
_ < 0 := by exact t₀
_ (MeromorphicAt.const a z).order := by
apply AnalyticAt.meromorphicAt_order_nonneg
exact analyticAt_const
rw [this]
theorem MeromorphicOn.divisor_of_makeStronglyMeromorphicOn
{f : }
{U : Set }
(hf : MeromorphicOn f U) :
hf.divisor = (stronglyMeromorphicOn_of_makeStronglyMeromorphicOn hf).meromorphicOn.divisor := by
unfold MeromorphicOn.divisor
simp
funext z
by_cases hz : z U
· simp [hz]
congr 1
apply MeromorphicAt.order_congr
exact EventuallyEq.symm (makeStronglyMeromorphicOn_changeDiscrete hf hz)
· simp [hz]
-- STRONGLY MEROMORPHIC THINGS
/- Strongly MeromorphicOn of non-negative order is analytic -/
theorem StronglyMeromorphicOn.analyticOnNhd
{f : }
{U : Set }
(h₁f : StronglyMeromorphicOn f U)
(h₂f : x, (hx : x U) 0 h₁f.meromorphicOn.divisor x) :
AnalyticOnNhd f U := by
apply StronglyMeromorphicOn.analytic
intro z hz
let A := h₂f z hz
unfold MeromorphicOn.divisor at A
simp [hz] at A
by_cases h : (h₁f z hz).meromorphicAt.order =
· rw [h]
simp
· rw [WithTop.le_untop'_iff] at A
tauto
tauto
assumption
theorem StronglyMeromorphicOn.support_divisor
{f : }
{U : Set }
(h₁f : StronglyMeromorphicOn f U)
(h₂f : u : U, f u 0)
(hU : IsConnected U) :
U f⁻¹' {0} = (Function.support h₁f.meromorphicOn.divisor) := by
ext u
constructor
· intro hu
unfold MeromorphicOn.divisor
simp [h₁f.order_ne_top hU h₂f u, hu.1]
use hu.1
rw [(h₁f u hu.1).order_eq_zero_iff]
simp
exact hu.2
· intro hu
simp at hu
let A := h₁f.meromorphicOn.divisor.supportInU hu
constructor
· exact h₁f.meromorphicOn.divisor.supportInU hu
· simp
let B := (h₁f u A).order_eq_zero_iff.not
simp at B
rw [ B]
unfold MeromorphicOn.divisor at hu
simp [A] at hu
exact hu.1

View File

@@ -0,0 +1,180 @@
import Mathlib.Analysis.Analytic.Meromorphic
import Mathlib.MeasureTheory.Integral.CircleIntegral
import Mathlib.MeasureTheory.Integral.IntervalIntegral
import Nevanlinna.analyticAt
import Nevanlinna.divisor
import Nevanlinna.intervalIntegrability
import Nevanlinna.logpos
import Nevanlinna.meromorphicAt
import Nevanlinna.meromorphicOn_divisor
import Nevanlinna.specialFunctions_CircleIntegral_affine
import Nevanlinna.stronglyMeromorphicOn
import Nevanlinna.stronglyMeromorphicOn_eliminate
import Nevanlinna.mathlibAddOn
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
theorem MeromorphicOn.integrable_log_abs_f₀
{f : }
{r : }
-- WARNING: Not optimal. This needs to go
(hr : 0 < r)
-- WARNING: Not optimal. It suffices to be meromorphic on the Sphere
(h₁f : MeromorphicOn f (Metric.closedBall (0 : ) r)) :
IntervalIntegrable (fun z log f (circleMap 0 r z)) MeasureTheory.volume 0 (2 * π) := by
by_cases h₂f : u : (Metric.closedBall (0 : ) r), (h₁f u u.2).order
· have h₁U : IsCompact (Metric.closedBall (0 : ) r) := isCompact_closedBall 0 r
have h₂U : IsConnected (Metric.closedBall (0 : ) r) := by
constructor
· exact Metric.nonempty_closedBall.mpr (le_of_lt hr)
· exact (convex_closedBall (0 : ) r).isPreconnected
-- This is where we use 'ball' instead of sphere. However, better
-- results should make this assumption unnecessary.
have h₃U : interior (Metric.closedBall (0 : ) r) := by
rw [interior_closedBall, Set.nonempty_iff_ne_empty]
use 0; simp [hr];
repeat exact Ne.symm (ne_of_lt hr)
have h₃f : Set.Finite (Function.support h₁f.divisor) := by
exact Divisor.finiteSupport h₁U h₁f.divisor
obtain g, h₁g, h₂g, h₃g := MeromorphicOn.decompose_log h₁U h₂U h₃U h₁f h₂f
have : (fun z log f (circleMap 0 r z)) = (fun z log f z) (circleMap 0 r) := by
rfl
rw [this]
have : Metric.sphere (0 : ) |r| Metric.closedBall (0 : ) r := by
rw [abs_of_pos hr]
apply Metric.sphere_subset_closedBall
rw [integrability_congr_changeDiscrete this h₃g]
apply IntervalIntegrable.add
--
apply Continuous.intervalIntegrable
apply continuous_iff_continuousAt.2
intro x
have : (fun x => log g (circleMap 0 r x)) = log Complex.abs g (fun x circleMap 0 r x) :=
rfl
rw [this]
apply ContinuousAt.comp
apply Real.continuousAt_log
· simp
have : (circleMap 0 r x) (Metric.closedBall (0 : ) r) := by
apply circleMap_mem_closedBall
exact le_of_lt hr
exact h₂g (circleMap 0 r x), this
apply ContinuousAt.comp
· apply Continuous.continuousAt Complex.continuous_abs
apply ContinuousAt.comp
· have : (circleMap 0 r x) (Metric.closedBall (0 : ) r) := by
apply circleMap_mem_closedBall (0 : ) (le_of_lt hr) x
apply (h₁g (circleMap 0 r x) this).continuousAt
apply Continuous.continuousAt (continuous_circleMap 0 r)
--
have h {x : } : (Function.support fun s => (h₁f.divisor s) * log circleMap 0 r x - s) h₃f.toFinset := by
intro x; simp; tauto
simp_rw [finsum_eq_sum_of_support_subset _ h]
have : (fun x => s h₃f.toFinset, (h₁f.divisor s) * log circleMap 0 r x - s) = ( s h₃f.toFinset, fun x => (h₁f.divisor s) * log circleMap 0 r x - s) := by
ext x; simp
rw [this]
apply IntervalIntegrable.sum h₃f.toFinset
intro s hs
apply IntervalIntegrable.const_mul
apply intervalIntegrable_logAbs_circleMap_sub_const
exact Ne.symm (ne_of_lt hr)
· push_neg at h₂f
let F := h₁f.makeStronglyMeromorphicOn
have : (fun z => log f z) =[Filter.codiscreteWithin (Metric.closedBall 0 r)] (fun z => log F z) := by
-- WANT: apply Filter.eventuallyEq.congr
let A := (makeStronglyMeromorphicOn_changeDiscrete'' h₁f)
obtain s, h₁s, h₂s := eventuallyEq_iff_exists_mem.1 A
rw [eventuallyEq_iff_exists_mem]
use s
constructor
· exact h₁s
· intro x hx
simp_rw [h₂s hx]
have hU : Metric.sphere (0 : ) |r| Metric.closedBall 0 r := by
rw [abs_of_pos hr]
exact Metric.sphere_subset_closedBall
have t₀ : (fun z => log f (circleMap 0 r z)) = (fun z => log f z) circleMap 0 r := by
rfl
rw [t₀]
clear t₀
rw [integrability_congr_changeDiscrete hU this]
have : x Metric.closedBall 0 r, F x = 0 := by
intro x hx
let A := h₂f x, hx
rw [ makeStronglyMeromorphicOn_changeOrder h₁f hx] at A
let B := ((stronglyMeromorphicOn_of_makeStronglyMeromorphicOn h₁f) x hx).order_eq_zero_iff.not.1
simp [A] at B
assumption
have : (fun z => log F z) circleMap 0 r = 0 := by
funext x
simp
left
apply this
simp [abs_of_pos hr]
simp_rw [this]
apply intervalIntegral.intervalIntegrable_const
theorem MeromorphicOn.integrable_log_abs_f
{f : }
{r : }
-- WARNING: Not optimal. It suffices to be meromorphic on the Sphere
(h₁f : MeromorphicOn f (Metric.closedBall (0 : ) |r|)) :
IntervalIntegrable (fun z log f (circleMap 0 r z)) MeasureTheory.volume 0 (2 * π) := by
by_cases h₁r : r = 0
· rw [h₁r]
simp
· by_cases h₂r : 0 < r
· have : |r| = r := by
exact abs_of_pos h₂r
rw [this] at h₁f
exact MeromorphicOn.integrable_log_abs_f₀ h₂r h₁f
· have t₀ : 0 < -r := by
have hr_neg : r < 0 := by
apply lt_of_le_of_ne
exact le_of_not_lt h₂r
exact h₁r
linarith
have : |r| = -r := by
apply abs_of_neg
exact Left.neg_pos_iff.mp t₀
rw [this] at h₁f
let A := MeromorphicOn.integrable_log_abs_f₀ t₀ h₁f
let B := integrability_congr_negRadius (f := fun z => log f z) (r := -r)
let C := B A
simp at C
simpa
theorem MeromorphicOn.integrable_logpos_abs_f
{f : }
{r : }
-- WARNING: Not optimal. It suffices to be meromorphic on the Sphere
(h₁f : MeromorphicOn f (Metric.closedBall (0 : ) |r|)) :
IntervalIntegrable (fun z logpos f (circleMap 0 r z)) MeasureTheory.volume 0 (2 * π) := by
simp_rw [logpos_norm]
simp_rw [mul_add]
apply IntervalIntegrable.add
apply IntervalIntegrable.const_mul
exact MeromorphicOn.integrable_log_abs_f h₁f
apply IntervalIntegrable.const_mul
apply IntervalIntegrable.norm
exact MeromorphicOn.integrable_log_abs_f h₁f

View File

@@ -78,7 +78,7 @@ theorem partialDeriv_smul₂ {f : E → F} {a : 𝕜} {v : E} : partialDeriv
let ZZ := DifferentiableAt.const_smul contra a⁻¹
have : (fun y => a⁻¹ a f y) = f := by
funext i
rw [ smul_assoc, smul_eq_mul, mul_comm, mul_inv_cancel ha]
rw [ smul_assoc, smul_eq_mul, mul_comm, mul_inv_cancel ha]
simp
rw [this] at ZZ
exact hf ZZ
@@ -202,14 +202,14 @@ theorem partialDeriv_compContLin
left
intro w
left
rw [fderiv.comp w (ContinuousLinearMap.differentiableAt l) (h w)]
rw [fderiv_comp w (ContinuousLinearMap.differentiableAt l) (h w)]
simp
rfl
theorem partialDeriv_compContLinAt {f : E F} {l : F L[𝕜] G} {v : E} {x : E} (h : DifferentiableAt 𝕜 f x) : (partialDeriv 𝕜 v (l f)) x = (l partialDeriv 𝕜 v f) x:= by
unfold partialDeriv
rw [fderiv.comp x (ContinuousLinearMap.differentiableAt l) h]
rw [fderiv_comp x (ContinuousLinearMap.differentiableAt l) h]
simp
@@ -281,7 +281,11 @@ lemma partialDeriv_fderiv {f : E → F} (hf : ContDiff 𝕜 2 f) (z a b : E) :
unfold partialDeriv
rw [fderiv_clm_apply]
· simp
· exact (contDiff_succ_iff_fderiv.1 hf).2.differentiable le_rfl z
· apply Differentiable.differentiableAt
rw [ one_add_one_eq_two] at hf
rw [contDiff_succ_iff_fderiv] at hf
apply hf.2.2.differentiable
simp
· simp
@@ -297,8 +301,10 @@ lemma partialDeriv_fderivOn
rw [fderiv_clm_apply]
· simp
· convert DifferentiableOn.differentiableAt _ (IsOpen.mem_nhds hs hz)
apply ContDiffOn.differentiableOn _ (Submonoid.oneLE.proof_2 )
exact ((contDiffOn_succ_iff_fderiv_of_isOpen hs).1 hf).2
apply ContDiffOn.differentiableOn _ (Preorder.le_refl 1)
rw [ one_add_one_eq_two] at hf
rw [contDiffOn_succ_iff_fderiv_of_isOpen hs] at hf
exact hf.2.2
· simp
@@ -356,11 +362,11 @@ theorem partialDeriv_smul'₂
left_inv := by
intro x
simp
rw [ smul_assoc, smul_eq_mul, mul_comm, mul_inv_cancel ha, one_smul]
rw [ smul_assoc, smul_eq_mul, mul_comm, mul_inv_cancel ha, one_smul]
right_inv := by
intro x
simp
rw [ smul_assoc, smul_eq_mul, mul_inv_cancel ha, one_smul]
rw [ smul_assoc, smul_eq_mul, mul_inv_cancel ha, one_smul]
continuous_toFun := continuous_const_smul a
continuous_invFun := continuous_const_smul a⁻¹
}
@@ -407,7 +413,8 @@ theorem partialDeriv_comm
let f'' := (fderiv f' z)
have h₁ : HasFDerivAt f' f'' z := by
apply DifferentiableAt.hasFDerivAt
apply (contDiff_succ_iff_fderiv.1 h).right.differentiable (Submonoid.oneLE.proof_2 )
rw [ one_add_one_eq_two] at h
apply (contDiff_succ_iff_fderiv.1 h).2.2.differentiable (Preorder.le_refl 1)
apply second_derivative_symmetric h₀ h₁ v₁ v₂
@@ -441,8 +448,9 @@ theorem partialDeriv_commOn
have h₁ : HasFDerivAt f' f'' z := by
apply DifferentiableAt.hasFDerivAt
apply DifferentiableOn.differentiableAt _ (IsOpen.mem_nhds hs hz)
apply ContDiffOn.differentiableOn _ (Submonoid.oneLE.proof_2 )
exact ((contDiffOn_succ_iff_fderiv_of_isOpen hs).1 h).2
apply ContDiffOn.differentiableOn _ (Preorder.le_refl 1)
rw [ one_add_one_eq_two] at h
exact ((contDiffOn_succ_iff_fderiv_of_isOpen hs).1 h).2.2
have h₀' : (y : E) in nhds z, HasFDerivAt f (f' y) y := by
apply eventually_nhds_iff.mpr
@@ -463,7 +471,9 @@ theorem partialDeriv_commAt
(h : ContDiffAt 2 f z) :
v₁ v₂ : E, partialDeriv v₁ (partialDeriv v₂ f) z = partialDeriv v₂ (partialDeriv v₁ f) z := by
obtain u, hu₁, hu₂ := h.contDiffOn le_rfl
let A := h.contDiffOn le_rfl
simp at A
obtain u, hu₁, hu₂ := A
obtain v, hv₁, hv₂, hv₃ := mem_nhds_iff.1 hu₁
intro v₁ v₂

View File

@@ -0,0 +1,101 @@
import Mathlib.MeasureTheory.Integral.Periodic
theorem periodic_integrability₁
{E : Type u_1} [NormedAddCommGroup E] [NormedSpace E]
{f : E}
{t T : }
{n : }
(h₁f : Function.Periodic f T)
(h₂f : IntervalIntegrable f MeasureTheory.volume t (t + T)) :
IntervalIntegrable f MeasureTheory.volume t (t + n * T) := by
induction' n with n hn
simp
apply IntervalIntegrable.trans (b := t + n * T)
exact hn
let A := IntervalIntegrable.comp_sub_right h₂f (n * T)
have : f = fun x f (x - n * T) := by simp [Function.Periodic.sub_nat_mul_eq h₁f n]
simp_rw [ this] at A
have : (t + T + n * T) = (t + (n + 1) * T) := by simp; ring
simp_rw [this] at A
exact A
theorem periodic_integrability₂
{E : Type u_1} [NormedAddCommGroup E] [NormedSpace E]
{f : E}
{t T : }
{n : }
(h₁f : Function.Periodic f T)
(h₂f : IntervalIntegrable f MeasureTheory.volume t (t + T)) :
IntervalIntegrable f MeasureTheory.volume (t - n * T) t := by
induction' n with n hn
simp
--
apply IntervalIntegrable.trans (b := t - n * T)
--
have A := IntervalIntegrable.comp_add_right h₂f (((n + 1): ) * T)
have : f = fun x f (x + ((n + 1) : ) * T) := by
funext x
have : x = x + (n + 1) * T - (n + 1) * T := by ring
nth_rw 1 [this]
rw [Function.Periodic.sub_nat_mul_eq h₁f]
simp_rw [ this] at A
have : (t + T - (n + 1) * T) = (t - n * T) := by simp; ring
simp_rw [this] at A
exact A
--
exact hn
theorem periodic_integrability₃
{E : Type u_1} [NormedAddCommGroup E] [NormedSpace E]
{f : E}
{t T : }
{n₁ n₂ : }
(h₁f : Function.Periodic f T)
(h₂f : IntervalIntegrable f MeasureTheory.volume t (t + T)) :
IntervalIntegrable f MeasureTheory.volume (t - n₁ * T) (t + n₂ * T) := by
apply IntervalIntegrable.trans (b := t)
exact periodic_integrability₂ h₁f h₂f
exact periodic_integrability₁ h₁f h₂f
theorem periodic_integrability4
{E : Type u_1} [NormedAddCommGroup E] [NormedSpace E]
{f : E}
{t T : }
{a₁ a₂ : }
(h₁f : Function.Periodic f T)
(hT : 0 < T)
(h₂f : IntervalIntegrable f MeasureTheory.volume t (t + T)) :
IntervalIntegrable f MeasureTheory.volume a₁ a₂ := by
obtain n₁, hn₁ : n₁ : , t - n₁ * T min a₁ a₂ := by
obtain n₁, hn₁ := exists_nat_ge ((t -min a₁ a₂) / T)
use n₁
rw [sub_le_iff_le_add]
rw [div_le_iff₀ hT] at hn₁
rw [sub_le_iff_le_add] at hn₁
rw [add_comm]
exact hn₁
obtain n₂, hn₂ : n₂ : , max a₁ a₂ t + n₂ * T := by
obtain n₂, hn₂ := exists_nat_ge ((max a₁ a₂ - t) / T)
use n₂
rw [ sub_le_iff_le_add]
rw [div_le_iff₀ hT] at hn₂
linarith
have : Set.uIcc a₁ a₂ Set.uIcc (t - n₁ * T) (t + n₂ * T) := by
apply Set.uIcc_subset_uIcc_iff_le.mpr
constructor
· calc min (t - n₁ * T) (t + n₂ * T)
_ (t - n₁ * T) := by exact min_le_left (t - n₁ * T) (t + n₂ * T)
_ min a₁ a₂ := by exact hn₁
· calc max a₁ a₂
_ t + n₂ * T := by exact hn₂
_ max (t - n₁ * T) (t + n₂ * T) := by exact le_max_right (t - n₁ * T) (t + n₂ * T)
apply IntervalIntegrable.mono_set _ this
exact periodic_integrability₃ h₁f h₂f

View File

@@ -3,12 +3,16 @@ import Mathlib.MeasureTheory.Integral.CircleIntegral
import Nevanlinna.specialFunctions_Integral_log_sin
import Nevanlinna.harmonicAt_examples
import Nevanlinna.harmonicAt_meanValue
import Nevanlinna.intervalIntegrability
import Nevanlinna.periodic_integrability
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
-- Lemmas for the circleMap
lemma l₀ {x₁ x₂ : } : (circleMap 0 1 x₁) * (circleMap 0 1 x₂) = circleMap 0 1 (x₁+x₂) := by
dsimp [circleMap]
simp
@@ -36,10 +40,27 @@ lemma l₂ {x : } : ‖(circleMap 0 1 x) - a‖ = ‖1 - (circleMap 0 1 (-x))
dsimp [circleMap]
simp
-- Integral of log ‖circleMap 0 1 x - a‖, for ‖a‖ < 1.
lemma int'₀
{a : }
(ha : a 1) :
IntervalIntegrable (fun x log circleMap 0 1 x - a) volume 0 (2 * π) := by
apply Continuous.intervalIntegrable
apply Continuous.log
fun_prop
simp
intro x
by_contra h₁a
rw [ h₁a] at ha
simp at ha
lemma int₀
{a : }
(ha : a Metric.ball 0 1) :
(x : ) in (0)..2 * Real.pi, Real.log circleMap 0 1 x - a = 0 := by
(x : ) in (0)..2 * π, log circleMap 0 1 x - a = 0 := by
by_cases h₁a : a = 0
· -- case: a = 0
@@ -48,16 +69,16 @@ lemma int₀
-- case: a ≠ 0
simp_rw [l₂]
have {x : } : Real.log 1 - circleMap 0 1 (-x) * a = (fun w Real.log 1 - circleMap 0 1 (w) * a) (-x) := by rfl
have {x : } : log 1 - circleMap 0 1 (-x) * a = (fun w log 1 - circleMap 0 1 (w) * a) (-x) := by rfl
conv =>
left
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_neg ((fun w Real.log 1 - circleMap 0 1 (w) * a))]
rw [intervalIntegral.integral_comp_neg ((fun w log 1 - circleMap 0 1 (w) * a))]
let f₁ := fun w Real.log 1 - circleMap 0 1 w * a
have {x : } : Real.log 1 - circleMap 0 1 x * a = f₁ (x + 2 * Real.pi) := by
let f₁ := fun w log 1 - circleMap 0 1 w * a
have {x : } : log 1 - circleMap 0 1 x * a = f₁ (x + 2 * π) := by
dsimp [f₁]
congr 4
let A := periodic_circleMap 0 1 x
@@ -68,18 +89,18 @@ lemma int₀
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_add_right f₁ (2 * Real.pi)]
rw [intervalIntegral.integral_comp_add_right f₁ (2 * π)]
simp
dsimp [f₁]
let ρ := a⁻¹
have hρ : 1 < ρ := by
apply one_lt_inv_iff.mpr
apply one_lt_inv_iff.mpr
constructor
· exact norm_pos_iff'.mpr h₁a
· exact norm_pos_iff.mpr h₁a
· exact mem_ball_zero_iff.mp ha
let F := fun z Real.log 1 - z * a
let F := fun z log 1 - z * a
have hf : x Metric.ball 0 ρ, HarmonicAt F x := by
intro x hx
@@ -94,20 +115,23 @@ lemma int₀
_ < ρ * a := by
apply (mul_lt_mul_right _).2
exact mem_ball_zero_iff.mp hx
exact norm_pos_iff'.mpr h₁a
exact norm_pos_iff.mpr h₁a
_ = 1 := by
dsimp [ρ]
apply inv_mul_cancel
apply inv_mul_cancel
exact (AbsoluteValue.ne_zero_iff Complex.abs).mpr h₁a
rw [ h] at this
simp at this
let A := harmonic_meanValue ρ 1 Real.zero_lt_one hρ hf
let A := harmonic_meanValue ρ 1 zero_lt_one hρ hf
dsimp [F] at A
simp at A
exact A
-- Integral of log ‖circleMap 0 1 x - 1‖
-- integral
lemma int₁₁ : (x : ) in (0)..π, log (4 * sin x ^ 2) = 0 := by
have t₁ {x : } : x Set.Ioo 0 π log (4 * sin x ^ 2) = log 4 + 2 * log (sin x) := by
@@ -141,34 +165,67 @@ lemma int₁₁ : ∫ (x : ) in (0)..π, log (4 * sin x ^ 2) = 0 := by
apply IntervalIntegrable.const_mul
exact intervalIntegrable_log_sin
lemma logAffineHelper {x : } : log circleMap 0 1 x - 1 = log (4 * sin (x / 2) ^ 2) / 2 := by
dsimp [Complex.abs]
rw [log_sqrt (Complex.normSq_nonneg (circleMap 0 1 x - 1))]
congr
calc Complex.normSq (circleMap 0 1 x - 1)
_ = (cos x - 1) * (cos x - 1) + sin x * sin x := by
dsimp [circleMap]
rw [Complex.normSq_apply]
simp
_ = sin x ^ 2 + cos x ^ 2 + 1 - 2 * cos x := by
ring
_ = 2 - 2 * cos x := by
rw [sin_sq_add_cos_sq]
norm_num
_ = 2 - 2 * cos (2 * (x / 2)) := by
rw [ mul_div_assoc]
congr; norm_num
_ = 4 - 4 * cos (x / 2) ^ 2 := by
rw [cos_two_mul]
ring
_ = 4 * sin (x / 2) ^ 2 := by
nth_rw 1 [ mul_one 4, sin_sq_add_cos_sq (x / 2)]
ring
lemma int'₁ : -- Integrability of log ‖circleMap 0 1 x - 1‖
IntervalIntegrable (fun x log circleMap 0 1 x - 1) volume 0 (2 * π) := by
simp_rw [logAffineHelper]
apply IntervalIntegrable.div_const
rw [ IntervalIntegrable.comp_mul_left_iff (c := 2) (Ne.symm (NeZero.ne' 2))]
simp
have h₁ : Set.EqOn (fun x => log (4 * sin x ^ 2)) (fun x => log 4 + 2 * log (sin x)) (Set.Ioo 0 π) := by
intro x hx
simp [log_mul (Ne.symm (NeZero.ne' 4)), log_pow, ne_of_gt (sin_pos_of_mem_Ioo hx)]
rw [IntervalIntegrable.integral_congr_Ioo pi_nonneg h₁]
apply IntervalIntegrable.add
simp
apply IntervalIntegrable.const_mul
exact intervalIntegrable_log_sin
lemma int''₁ : -- Integrability of log ‖circleMap 0 1 x - 1‖ for arbitrary intervals
(t₁ t₂ : ), IntervalIntegrable (fun x log circleMap 0 1 x - 1) volume t₁ t₂ := by
intro t₁ t₂
apply periodic_integrability4 (T := 2 * π) (t := 0)
--
have : (fun x => log circleMap 0 1 x - 1) = (fun x => log x - 1) (circleMap 0 1) := rfl
rw [this]
apply Function.Periodic.comp
exact periodic_circleMap 0 1
--
exact two_pi_pos
--
rw [zero_add]
exact int'₁
lemma int₁ :
x in (0)..(2 * π), log circleMap 0 1 x - 1 = 0 := by
have {x : } : log circleMap 0 1 x - 1 = log (4 * sin (x / 2) ^ 2) / 2 := by
dsimp [Complex.abs]
rw [log_sqrt (Complex.normSq_nonneg (circleMap 0 1 x - 1))]
congr
calc Complex.normSq (circleMap 0 1 x - 1)
_ = (cos x - 1) * (cos x - 1) + sin x * sin x := by
dsimp [circleMap]
rw [Complex.normSq_apply]
simp
_ = sin x ^ 2 + cos x ^ 2 + 1 - 2 * cos x := by
ring
_ = 2 - 2 * cos x := by
rw [sin_sq_add_cos_sq]
norm_num
_ = 2 - 2 * cos (2 * (x / 2)) := by
rw [ mul_div_assoc]
congr; norm_num
_ = 4 - 4 * Real.cos (x / 2) ^ 2 := by
rw [cos_two_mul]
ring
_ = 4 * sin (x / 2) ^ 2 := by
nth_rw 1 [ mul_one 4, sin_sq_add_cos_sq (x / 2)]
ring
simp_rw [this]
simp_rw [logAffineHelper]
simp
have : (x : ) in (0)..2 * π, log (4 * sin (x / 2) ^ 2) = 2 * (x : ) in (0)..π, log (4 * sin x ^ 2) := by
@@ -191,22 +248,88 @@ lemma int₁ :
exact int₁₁
-- Integral of log ‖circleMap 0 1 x - a‖, for ‖a‖ = 1
-- integrability
lemma int'₂
{a : }
(ha : a = 1) :
IntervalIntegrable (fun x log circleMap 0 1 x - a) volume 0 (2 * π) := by
simp_rw [l₂]
have {x : } : log 1 - circleMap 0 1 (-x) * a = (fun w log 1 - circleMap 0 1 (w) * a) (-x) := by rfl
conv =>
arg 1
intro x
rw [this]
rw [IntervalIntegrable.iff_comp_neg]
let f₁ := fun w log 1 - circleMap 0 1 w * a
have {x : } : log 1 - circleMap 0 1 x * a = f₁ (x + 2 * π) := by
dsimp [f₁]
congr 4
let A := periodic_circleMap 0 1 x
simp at A
exact id (Eq.symm A)
conv =>
arg 1
intro x
arg 0
intro w
rw [this]
simp
have : 0 = 2 * π - 2 * π := by ring
rw [this]
have : -(2 * π ) = 0 - 2 * π := by ring
rw [this]
apply IntervalIntegrable.comp_add_right _ (2 * π) --f₁ (2 * π)
dsimp [f₁]
have : ζ, a = circleMap 0 1 ζ := by
apply Set.exists_range_iff.mp
use a
simp
exact ha
obtain ζ, := this
rw []
simp_rw [l₀]
have : 2 * π = (2 * π + ζ) - ζ := by ring
rw [this]
have : 0 = ζ - ζ := by ring
rw [this]
have : (fun w => log (Complex.abs (1 - circleMap 0 1 (w + ζ)))) = fun x (fun w log (Complex.abs (1 - circleMap 0 1 (w)))) (x + ζ) := rfl
rw [this]
apply IntervalIntegrable.comp_add_right (f := (fun w log (Complex.abs (1 - circleMap 0 1 (w))))) _ ζ
have : Function.Periodic (fun x log (Complex.abs (1 - circleMap 0 1 x))) (2 * π) := by
have : (fun x log (Complex.abs (1 - circleMap 0 1 x))) = ( (fun x log (Complex.abs (1 - x))) (circleMap 0 1) ) := by rfl
rw [this]
apply Function.Periodic.comp
exact periodic_circleMap 0 1
let A := int''₁ (2 * π + ζ) ζ
have {x : } : circleMap 0 1 x - 1 = Complex.abs (1 - circleMap 0 1 x) := AbsoluteValue.map_sub Complex.abs (circleMap 0 1 x) 1
simp_rw [this] at A
exact A
-- integral
lemma int₂
{a : }
(ha : a = 1) :
x in (0)..(2 * Real.pi), log circleMap 0 1 x - a = 0 := by
x in (0)..(2 * π), log circleMap 0 1 x - a = 0 := by
simp_rw [l₂]
have {x : } : Real.log 1 - circleMap 0 1 (-x) * a = (fun w Real.log 1 - circleMap 0 1 (w) * a) (-x) := by rfl
have {x : } : log 1 - circleMap 0 1 (-x) * a = (fun w log 1 - circleMap 0 1 (w) * a) (-x) := by rfl
conv =>
left
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_neg ((fun w Real.log 1 - circleMap 0 1 (w) * a))]
rw [intervalIntegral.integral_comp_neg ((fun w log 1 - circleMap 0 1 (w) * a))]
let f₁ := fun w Real.log 1 - circleMap 0 1 w * a
have {x : } : Real.log 1 - circleMap 0 1 x * a = f₁ (x + 2 * Real.pi) := by
let f₁ := fun w log 1 - circleMap 0 1 w * a
have {x : } : log 1 - circleMap 0 1 x * a = f₁ (x + 2 * π) := by
dsimp [f₁]
congr 4
let A := periodic_circleMap 0 1 x
@@ -217,7 +340,7 @@ lemma int₂
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_add_right f₁ (2 * Real.pi)]
rw [intervalIntegral.integral_comp_add_right f₁ (2 * π)]
simp
dsimp [f₁]
@@ -249,3 +372,162 @@ lemma int₂
simp
simp_rw [this]
exact int₁
-- integral
lemma int₃
{a : }
(ha : a Metric.closedBall 0 1) :
x in (0)..(2 * π), log circleMap 0 1 x - a = 0 := by
by_cases h₁a : a Metric.ball 0 1
· exact int₀ h₁a
· apply int₂
simp at ha
simp at h₁a
simp
linarith
-- integral
lemma int₄
{a : }
{R : }
(hR : 0 < R)
(ha : a Metric.closedBall 0 R) :
x in (0)..(2 * π), log circleMap 0 R x - a = (2 * π) * log R := by
have h₁a : a / R Metric.closedBall 0 1 := by
simp
simp at ha
rw [div_le_comm₀]
simp
have : R = |R| := by
exact Eq.symm (abs_of_pos hR)
rwa [this] at ha
rwa [abs_of_pos hR]
simp
have t₀ {x : } : circleMap 0 R x = R * circleMap 0 1 x := by
unfold circleMap
simp
have {x : } : circleMap 0 R x - a = R * (circleMap 0 1 x - (a / R)) := by
rw [t₀, mul_sub, mul_div_cancel₀]
rw [ne_eq, Complex.ofReal_eq_zero]
exact Ne.symm (ne_of_lt hR)
have {x : } : circleMap 0 R x a log circleMap 0 R x - a = log R + log circleMap 0 1 x - (a / R) := by
intro hx
rw [this]
rw [norm_mul]
rw [log_mul]
congr
--
simp
exact le_of_lt hR
--
simp
exact Ne.symm (ne_of_lt hR)
--
simp
rw [t₀] at hx
by_contra hCon
rw [hCon] at hx
simp at hx
rw [mul_div_cancel₀] at hx
tauto
simp
exact Ne.symm (ne_of_lt hR)
have : x in (0)..(2 * π), log circleMap 0 R x - a = x in (0)..(2 * π), log R + log circleMap 0 1 x - (a / R) := by
rw [intervalIntegral.integral_congr_ae]
rw [MeasureTheory.ae_iff]
apply Set.Countable.measure_zero
let A := (circleMap 0 R)⁻¹' { a }
have s₀ : {a_1 | ¬(a_1 Ι 0 (2 * π) log circleMap 0 R a_1 - a = log R + log circleMap 0 1 a_1 - a / R)} A := by
intro x
contrapose
intro hx
unfold A at hx
simp at hx
simp
intro h₂x
let B := this hx
simp at B
rw [B]
have s₁ : A.Countable := by
apply Set.Countable.preimage_circleMap
exact Set.countable_singleton a
exact Ne.symm (ne_of_lt hR)
exact Set.Countable.mono s₀ s₁
rw [this]
rw [intervalIntegral.integral_add]
rw [int₃]
rw [intervalIntegral.integral_const]
simp
--
exact h₁a
--
apply intervalIntegral.intervalIntegrable_const
--
by_cases h₂a : a / R = 1
· exact int'₂ h₂a
· exact int'₀ h₂a
lemma intervalIntegrable_logAbs_circleMap_sub_const
{a : }
{r : }
(hr : r 0) :
IntervalIntegrable (fun x log circleMap 0 r x - a) volume 0 (2 * π) := by
have {z : } : z a log z - a = log r⁻¹ * z - r⁻¹ * a + log r := by
intro hz
rw [ mul_sub, norm_mul]
rw [log_mul (by simp [hr]) (by simp [hz])]
simp
have : (fun z log z - a) =[Filter.codiscreteWithin ] (fun z log r⁻¹ * z - r⁻¹ * a + log r) := by
apply eventuallyEq_iff_exists_mem.mpr
use {a}
constructor
· simp_rw [mem_codiscreteWithin, Filter.disjoint_principal_right]
simp
intro y
by_cases hy : y = a
· rw [ hy]
exact self_mem_nhdsWithin
· refine mem_nhdsWithin.mpr ?_
simp
use {a}
constructor
· exact isOpen_compl_singleton
· constructor
· tauto
· tauto
· intro x hx
simp at hx
simp only [Complex.norm_eq_abs]
repeat rw [ Complex.norm_eq_abs]
apply this hx
have hU : Metric.sphere (0 : ) |r| := by
exact fun a a => trivial
let A := integrability_congr_changeDiscrete hU this
have : (fun z => log z - a) circleMap 0 r = (fun z => log circleMap 0 r z - a) := by
exact rfl
rw [this] at A
have : (fun z => log r⁻¹ * z - r⁻¹ * a + log r) circleMap 0 r = (fun z => log r⁻¹ * circleMap 0 r z - r⁻¹ * a + log r) := by
exact rfl
rw [this] at A
rw [A]
apply IntervalIntegrable.add _ intervalIntegrable_const
have {x : } : r⁻¹ * circleMap 0 r x = circleMap 0 1 x := by
unfold circleMap
simp [hr]
simp_rw [this]
by_cases ha : r⁻¹ * a = 1
· exact int'₂ ha
· apply int'₀ ha

View File

@@ -1,5 +1,6 @@
import Mathlib.Analysis.SpecialFunctions.Integrals
import Mathlib.Analysis.SpecialFunctions.Log.NegMulLog
import Mathlib.Analysis.Convex.SpecificFunctions.Deriv
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
@@ -23,7 +24,7 @@ lemma logsinBound : ∀ x ∈ (Set.Icc 0 1), ‖(log ∘ sin) x‖ ≤ ‖log ((
exact zero_lt_two
apply (Set.mem_Icc.1 hx).1
simp
apply mul_le_one
apply mul_le_one
rw [div_le_one pi_pos]
exact two_le_pi
exact (Set.mem_Icc.1 hx).1
@@ -69,7 +70,7 @@ lemma logsinBound : ∀ x ∈ (Set.Icc 0 1), ‖(log ∘ sin) x‖ ≤ ‖log ((
exact (Set.mem_Icc.1 hx).2
apply inv_nonneg.mpr (div_nonneg pi_nonneg zero_le_two)
_ = 1 := by
apply inv_mul_cancel
apply inv_mul_cancel
apply div_ne_zero_iff.mpr
constructor
· exact pi_ne_zero
@@ -87,7 +88,7 @@ lemma logsinBound : ∀ x ∈ (Set.Icc 0 1), ‖(log ∘ sin) x‖ ≤ ‖log ((
let B := strictConcaveOn_sin_Icc.concaveOn.2 i₀ i₁ i₂ i₃ i₄
simp [Real.sin_pi_div_two] at B
rw [(by ring_nf; rw [mul_inv_cancel pi_ne_zero, one_mul] : 2 / π * x * (π / 2) = x)] at B
rw [(by ring_nf; rw [mul_inv_cancel pi_ne_zero, one_mul] : 2 / π * x * (π / 2) = x)] at B
simpa
apply log_le_log l₅
@@ -104,6 +105,8 @@ lemma intervalIntegrable_log_sin₁ : IntervalIntegrable (log ∘ sin) volume 0
have int_log : IntervalIntegrable (fun x log x) volume 0 1 := by
apply IntervalIntegrable.norm
-- Extract lemma here: log is integrable on [0, 1], and in fact on any
-- interval [a, b]
rw [ neg_neg log]
apply IntervalIntegrable.neg
apply intervalIntegrable_deriv_of_nonneg (g := fun x -(x * log x - x))
@@ -254,6 +257,19 @@ theorem intervalIntegral.integral_congr_volume
_ = 0 := volume_singleton
theorem IntervalIntegrable.integral_congr_Ioo
{E : Type u_3} [NormedAddCommGroup E] [NormedSpace E]
{f g : E}
{a b : }
(hab : a b)
(hfg : Set.EqOn f g (Set.Ioo a b)) :
IntervalIntegrable f volume a b IntervalIntegrable g volume a b := by
rw [intervalIntegrable_iff_integrableOn_Ioo_of_le hab]
rw [MeasureTheory.integrableOn_congr_fun hfg measurableSet_Ioo]
rw [ intervalIntegrable_iff_integrableOn_Ioo_of_le hab]
lemma integral_log_sin₀ : (x : ) in (0)..π, log (sin x) = 2 * (x : ) in (0)..(π / 2), log (sin x) := by
rw [ intervalIntegral.integral_add_adjacent_intervals (a := 0) (b := π / 2) (c := π)]

View File

@@ -0,0 +1,513 @@
import Mathlib.Analysis.Analytic.Meromorphic
import Mathlib.Algebra.Order.AddGroupWithTop
import Nevanlinna.analyticAt
import Nevanlinna.mathlibAddOn
import Nevanlinna.meromorphicAt
open Topology
/- Strongly MeromorphicAt -/
def StronglyMeromorphicAt
(f : )
(z₀ : ) :=
( (z : ) in nhds z₀, f z = 0) ( (n : ), g : , (AnalyticAt g z₀) (g z₀ 0) ( (z : ) in nhds z₀, f z = (z - z₀) ^ n g z))
lemma stronglyMeromorphicAt_of_mul_analytic'
{f g : }
{z₀ : }
(h₁g : AnalyticAt g z₀)
(h₂g : g z₀ 0) :
StronglyMeromorphicAt f z₀ StronglyMeromorphicAt (f * g) z₀ := by
intro hf
--unfold StronglyMeromorphicAt at hf
rcases hf with h₁f|h₁f
· left
rw [eventually_nhds_iff] at h₁f
obtain t, ht := h₁f
rw [eventually_nhds_iff]
use t
constructor
· intro y hy
simp
left
exact ht.1 y hy
· exact ht.2
· right
obtain n, g_f, h₁g_f, h₂g_f, h₃g_f := h₁f
use n
use g * g_f
constructor
· apply AnalyticAt.mul
exact h₁g
exact h₁g_f
· constructor
· simp
exact h₂g, h₂g_f
· rw [eventually_nhds_iff] at h₃g_f
obtain t, ht := h₃g_f
rw [eventually_nhds_iff]
use t
constructor
· intro y hy
simp
rw [ht.1]
simp
ring
exact hy
· exact ht.2
/- Strongly MeromorphicAt is Meromorphic -/
theorem StronglyMeromorphicAt.meromorphicAt
{f : }
{z₀ : }
(hf : StronglyMeromorphicAt f z₀) :
MeromorphicAt f z₀ := by
rcases hf with h|h
· use 0; simp
rw [analyticAt_congr h]
exact analyticAt_const
· obtain n, g, h₁g, _, h₃g := h
rw [meromorphicAt_congr' h₃g]
apply MeromorphicAt.smul
apply MeromorphicAt.zpow
apply MeromorphicAt.sub
apply MeromorphicAt.id
apply MeromorphicAt.const
exact AnalyticAt.meromorphicAt h₁g
/- Strongly MeromorphicAt of non-negative order is analytic -/
theorem StronglyMeromorphicAt.analytic
{f : }
{z₀ : }
(h₁f : StronglyMeromorphicAt f z₀)
(h₂f : 0 h₁f.meromorphicAt.order):
AnalyticAt f z₀ := by
let h₁f' := h₁f
rcases h₁f' with h|h
· rw [analyticAt_congr h]
exact analyticAt_const
· obtain n, g, h₁g, h₂g, h₃g := h
rw [analyticAt_congr h₃g]
have : h₁f.meromorphicAt.order = n := by
rw [MeromorphicAt.order_eq_int_iff]
use g
constructor
· exact h₁g
· constructor
· exact h₂g
· exact Filter.EventuallyEq.filter_mono h₃g nhdsWithin_le_nhds
rw [this] at h₂f
apply AnalyticAt.smul
nth_rw 1 [ Int.toNat_of_nonneg (WithTop.coe_nonneg.mp h₂f)]
apply AnalyticAt.pow
apply AnalyticAt.sub
apply analyticAt_id -- Warning: want apply AnalyticAt.id
apply analyticAt_const -- Warning: want AnalyticAt.const
exact h₁g
/- Analytic functions are strongly meromorphic -/
theorem AnalyticAt.stronglyMeromorphicAt
{f : }
{z₀ : }
(h₁f : AnalyticAt f z₀) :
StronglyMeromorphicAt f z₀ := by
by_cases h₂f : h₁f.order =
· rw [AnalyticAt.order_eq_top_iff] at h₂f
tauto
· have : h₁f.order := h₂f
rw [ ENat.coe_toNat_eq_self] at this
rw [eq_comm, AnalyticAt.order_eq_nat_iff] at this
right
use h₁f.order.toNat
obtain g, h₁g, h₂g, h₃g := this
use g
tauto
/- Strong meromorphic depends only on germ -/
theorem stronglyMeromorphicAt_congr
{f g : }
{z₀ : }
(hfg : f =[𝓝 z₀] g) :
StronglyMeromorphicAt f z₀ StronglyMeromorphicAt g z₀ := by
unfold StronglyMeromorphicAt
constructor
· intro h
rcases h with h|h
· left
exact Filter.EventuallyEq.rw h (fun x => Eq (g x)) (id (Filter.EventuallyEq.symm hfg))
· obtain n, h, h₁h, h₂h, h₃h := h
right
use n
use h
constructor
· assumption
· constructor
· assumption
· apply Filter.EventuallyEq.trans hfg.symm
assumption
· intro h
rcases h with h|h
· left
exact Filter.EventuallyEq.rw h (fun x => Eq (f x)) hfg
· obtain n, h, h₁h, h₂h, h₃h := h
right
use n
use h
constructor
· assumption
· constructor
· assumption
· apply Filter.EventuallyEq.trans hfg
assumption
/- A function is strongly meromorphic at a point iff it is strongly meromorphic
after multiplication with a non-vanishing analytic function
-/
theorem stronglyMeromorphicAt_of_mul_analytic
{f g : }
{z₀ : }
(h₁g : AnalyticAt g z₀)
(h₂g : g z₀ 0) :
StronglyMeromorphicAt f z₀ StronglyMeromorphicAt (f * g) z₀ := by
constructor
· apply stronglyMeromorphicAt_of_mul_analytic' h₁g h₂g
· intro hprod
let g' := fun z (g z)⁻¹
have h₁g' := h₁g.inv h₂g
have h₂g' : g' z₀ 0 := by
exact inv_ne_zero h₂g
let B := stronglyMeromorphicAt_of_mul_analytic' h₁g' h₂g' (f := f * g) hprod
have : f =[𝓝 z₀] f * g * fun x => (g x)⁻¹ := by
unfold Filter.EventuallyEq
apply Filter.eventually_iff_exists_mem.mpr
use g⁻¹' {0}
constructor
· apply ContinuousAt.preimage_mem_nhds
exact AnalyticAt.continuousAt h₁g
exact compl_singleton_mem_nhds_iff.mpr h₂g
· intro y hy
simp at hy
simp [hy]
rwa [stronglyMeromorphicAt_congr this]
theorem StronglyMeromorphicAt.order_eq_zero_iff
{f : }
{z₀ : }
(hf : StronglyMeromorphicAt f z₀) :
hf.meromorphicAt.order = 0 f z₀ 0 := by
constructor
· intro h₁f
let A := hf.analytic (le_of_eq (id (Eq.symm h₁f)))
apply A.order_eq_zero_iff.1
let B := A.meromorphicAt_order
rw [h₁f] at B
apply WithTopCoe
rw [eq_comm]
exact B
· intro h
have hf' := hf
rcases hf with h₁|h₁
· have : f z₀ = 0 := by
apply Filter.EventuallyEq.eq_of_nhds h₁
tauto
· obtain n, g, h₁g, h₂g, h₃g := h₁
have : n = 0 := by
by_contra hContra
let A := Filter.EventuallyEq.eq_of_nhds h₃g
have : (0 : ) ^ n = 0 := by
exact zero_zpow n hContra
simp at A
simp_rw [this] at A
simp at A
tauto
rw [this] at h₃g
simp at h₃g
have : hf'.meromorphicAt.order = 0 := by
apply (hf'.meromorphicAt.order_eq_int_iff 0).2
use g
constructor
· assumption
· constructor
· assumption
· simp
apply Filter.EventuallyEq.filter_mono h₃g
exact nhdsWithin_le_nhds
exact this
theorem StronglyMeromorphicAt.localIdentity
{f g : }
{z₀ : }
(hf : StronglyMeromorphicAt f z₀)
(hg : StronglyMeromorphicAt g z₀) :
f =[𝓝[] z₀] g f =[𝓝 z₀] g := by
intro h
have t₀ : hf.meromorphicAt.order = hg.meromorphicAt.order := by
exact hf.meromorphicAt.order_congr h
by_cases cs : hf.meromorphicAt.order = 0
· rw [cs] at t₀
have h₁f := hf.analytic (le_of_eq (id (Eq.symm cs)))
have h₁g := hg.analytic (le_of_eq t₀)
exact h₁f.localIdentity h₁g h
· apply Mnhds h
let A := cs
rw [hf.order_eq_zero_iff] at A
simp at A
let B := cs
rw [t₀] at B
rw [hg.order_eq_zero_iff] at B
simp at B
rw [A, B]
/- Make strongly MeromorphicAt -/
noncomputable def MeromorphicAt.makeStronglyMeromorphicAt
{f : }
{z₀ : }
(hf : MeromorphicAt f z₀) :
:= by
intro z
by_cases z = z₀
· by_cases h₁f : hf.order = (0 : )
· rw [hf.order_eq_int_iff] at h₁f
exact (Classical.choose h₁f) z₀
· exact 0
· exact f z
lemma m₁
{f : }
{z₀ : }
(hf : MeromorphicAt f z₀) :
z z₀, f z = hf.makeStronglyMeromorphicAt z := by
intro z hz
unfold MeromorphicAt.makeStronglyMeromorphicAt
simp [hz]
lemma m₂
{f : }
{z₀ : }
(hf : MeromorphicAt f z₀) :
f =[𝓝[] z₀] hf.makeStronglyMeromorphicAt := by
apply eventually_nhdsWithin_of_forall
exact fun x a => m₁ hf x a
theorem StronglyMeromorphicAt_of_makeStronglyMeromorphic
{f : }
{z₀ : }
(hf : MeromorphicAt f z₀) :
StronglyMeromorphicAt hf.makeStronglyMeromorphicAt z₀ := by
by_cases h₂f : hf.order =
· have : hf.makeStronglyMeromorphicAt =[𝓝 z₀] 0 := by
apply Mnhds
· apply Filter.EventuallyEq.trans (Filter.EventuallyEq.symm (m₂ hf))
exact (MeromorphicAt.order_eq_top_iff hf).1 h₂f
· unfold MeromorphicAt.makeStronglyMeromorphicAt
simp [h₂f]
apply AnalyticAt.stronglyMeromorphicAt
rw [analyticAt_congr this]
apply analyticAt_const
· let n := hf.order.untop h₂f
have : hf.order = n := by
exact Eq.symm (WithTop.coe_untop hf.order h₂f)
rw [hf.order_eq_int_iff] at this
obtain g, h₁g, h₂g, h₃g := this
right
use n
use g
constructor
· assumption
· constructor
· assumption
· apply Mnhds
· apply Filter.EventuallyEq.trans (Filter.EventuallyEq.symm (m₂ hf))
exact h₃g
· unfold MeromorphicAt.makeStronglyMeromorphicAt
simp
by_cases h₃f : hf.order = (0 : )
· let h₄f := (hf.order_eq_int_iff 0).1 h₃f
simp [h₃f]
obtain h₁G, h₂G, h₃G := Classical.choose_spec h₄f
simp at h₃G
have hn : n = 0 := Eq.symm ((fun {α} {a} {b} h => (WithTop.eq_untop_iff h).mpr) h₂f (id (Eq.symm h₃f)))
rw [hn]
rw [hn] at h₃g; simp at h₃g
simp
have : g =[𝓝 z₀] (Classical.choose h₄f) := by
apply h₁g.localIdentity h₁G
exact Filter.EventuallyEq.trans (Filter.EventuallyEq.symm h₃g) h₃G
rw [Filter.EventuallyEq.eq_of_nhds this]
· have : hf.order 0 := h₃f
simp [this]
left
apply zero_zpow n
dsimp [n]
rwa [WithTop.untop_eq_iff h₂f]
theorem StronglyMeromorphicAt.makeStronglyMeromorphic_id
{f : }
{z₀ : }
(hf : StronglyMeromorphicAt f z₀) :
f = hf.meromorphicAt.makeStronglyMeromorphicAt := by
funext z
by_cases hz : z = z₀
· rw [hz]
unfold MeromorphicAt.makeStronglyMeromorphicAt
simp
have h₀f := hf
rcases hf with h₁f|h₁f
· have A : f =[𝓝[] z₀] 0 := by
apply Filter.EventuallyEq.filter_mono h₁f
exact nhdsWithin_le_nhds
let B := (MeromorphicAt.order_eq_top_iff h₀f.meromorphicAt).2 A
simp [B]
exact Filter.EventuallyEq.eq_of_nhds h₁f
· obtain n, g, h₁g, h₂g, h₃g := h₁f
rw [Filter.EventuallyEq.eq_of_nhds h₃g]
have : h₀f.meromorphicAt.order = n := by
rw [MeromorphicAt.order_eq_int_iff (StronglyMeromorphicAt.meromorphicAt h₀f) n]
use g
constructor
· assumption
· constructor
· assumption
· exact eventually_nhdsWithin_of_eventually_nhds h₃g
by_cases h₃f : h₀f.meromorphicAt.order = 0
· simp [h₃f]
have hn : n = (0 : ) := by
rw [h₃f] at this
exact WithTop.coe_eq_zero.mp (id (Eq.symm this))
simp_rw [hn]
simp
let t₀ : h₀f.meromorphicAt.order = (0 : ) := by
exact h₃f
let A := (h₀f.meromorphicAt.order_eq_int_iff 0).1 t₀
have : g =[𝓝 z₀] (Classical.choose A) := by
obtain h₀, h₁, h₂ := Classical.choose_spec A
apply h₁g.localIdentity h₀
rw [hn] at h₃g
simp at h₃g
simp at h₂
have h₄g : f =[𝓝[] z₀] g := by
apply Filter.EventuallyEq.filter_mono h₃g
exact nhdsWithin_le_nhds
exact Filter.EventuallyEq.trans (Filter.EventuallyEq.symm h₄g) h₂
exact Filter.EventuallyEq.eq_of_nhds this
· simp [h₃f]
left
apply zero_zpow n
by_contra hn
rw [hn] at this
tauto
· exact m₁ (StronglyMeromorphicAt.meromorphicAt hf) z hz
theorem StronglyMeromorphicAt.eliminate
{f : }
{z₀ : }
(h₁f : StronglyMeromorphicAt f z₀)
(h₂f : h₁f.meromorphicAt.order ) :
g : , (AnalyticAt g z₀)
(g z₀ 0)
(f = (fun z (z-z₀) ^ (h₁f.meromorphicAt.order.untop h₂f)) * g) := by
let g₁ := (fun z (z-z₀) ^ (-h₁f.meromorphicAt.order.untop h₂f)) * f
let g₁₁ := fun z (z-z₀) ^ (-h₁f.meromorphicAt.order.untop h₂f)
have h₁g₁₁ : MeromorphicAt g₁₁ z₀ := by
apply MeromorphicAt.zpow
apply AnalyticAt.meromorphicAt
apply AnalyticAt.sub
apply analyticAt_id
exact analyticAt_const
have h₂g₁₁ : h₁g₁₁.order = - h₁f.meromorphicAt.order.untop h₂f := by
rw [ WithTop.LinearOrderedAddCommGroup.coe_neg]
rw [h₁g₁₁.order_eq_int_iff]
use 1
constructor
· exact analyticAt_const
· constructor
· simp
· apply eventually_nhdsWithin_of_forall
simp [g₁₁]
have h₁g₁ : MeromorphicAt g₁ z₀ := h₁g₁₁.mul h₁f.meromorphicAt
have h₂g₁ : h₁g₁.order = 0 := by
rw [h₁g₁₁.order_mul h₁f.meromorphicAt]
rw [h₂g₁₁]
simp
rw [add_comm]
rw [LinearOrderedAddCommGroupWithTop.add_neg_cancel_of_ne_top h₂f]
let g := h₁g₁.makeStronglyMeromorphicAt
use g
have h₁g : StronglyMeromorphicAt g z₀ := by
exact StronglyMeromorphicAt_of_makeStronglyMeromorphic h₁g₁
have h₂g : h₁g.meromorphicAt.order = 0 := by
rw [ h₁g₁.order_congr (m₂ h₁g₁)]
exact h₂g₁
constructor
· apply analytic
· rw [h₂g]
· exact h₁g
· constructor
· rwa [ h₁g.order_eq_zero_iff]
· funext z
by_cases hz : z = z₀
· by_cases hOrd : h₁f.meromorphicAt.order.untop h₂f = 0
· simp [hOrd]
have : StronglyMeromorphicAt g₁ z₀ := by
unfold g₁
simp [hOrd]
have : (fun z => 1) * f = f := by
funext z
simp
rwa [this]
rw [hz]
unfold g
let A := makeStronglyMeromorphic_id this
rw [ A]
unfold g₁
rw [hOrd]
simp
· have : h₁f.meromorphicAt.order 0 := by
by_contra hC
simp_rw [hC] at hOrd
tauto
let A := h₁f.order_eq_zero_iff.not.1 this
simp at A
rw [hz, A]
simp
left
rw [zpow_eq_zero_iff]
assumption
· simp
have : g z = g₁ z := by
exact Eq.symm (m₁ h₁g₁ z hz)
rw [this]
unfold g₁
simp [hz]
rw [ mul_assoc]
rw [mul_inv_cancel₀]
simp
apply zpow_ne_zero
exact sub_ne_zero_of_ne hz

View File

@@ -0,0 +1,163 @@
import Nevanlinna.stronglyMeromorphicAt
import Mathlib.Algebra.BigOperators.Finprod
open Topology
theorem MeromorphicOn.analyticOnCodiscreteWithin
{f : }
{U : Set }
(hf : MeromorphicOn f U) :
{ x | AnalyticAt f x } Filter.codiscreteWithin U := by
rw [mem_codiscreteWithin]
intro x hx
simp
rw [ Filter.eventually_mem_set]
apply Filter.Eventually.mono (hf x hx).eventually_analyticAt
simp
tauto
/- Strongly MeromorphicOn -/
def StronglyMeromorphicOn
(f : )
(U : Set ) :=
z U, StronglyMeromorphicAt f z
/- Strongly MeromorphicAt is Meromorphic -/
theorem StronglyMeromorphicOn.meromorphicOn
{f : }
{U : Set }
(hf : StronglyMeromorphicOn f U) :
MeromorphicOn f U := by
intro z hz
exact StronglyMeromorphicAt.meromorphicAt (hf z hz)
/- Strongly MeromorphicOn of non-negative order is analytic -/
theorem StronglyMeromorphicOn.analytic
{f : }
{U : Set }
(h₁f : StronglyMeromorphicOn f U)
(h₂f : x, (hx : x U) 0 (h₁f x hx).meromorphicAt.order) :
AnalyticOnNhd f U := by
intro z hz
apply StronglyMeromorphicAt.analytic
exact h₂f z hz
exact h₁f z hz
/- Analytic functions are strongly meromorphic -/
theorem AnalyticOn.stronglyMeromorphicOn
{f : }
{U : Set }
(h₁f : AnalyticOnNhd f U) :
StronglyMeromorphicOn f U := by
intro z hz
apply AnalyticAt.stronglyMeromorphicAt
exact h₁f z hz
theorem stronglyMeromorphicOn_of_mul_analytic'
{f g : }
{U : Set }
(h₁g : AnalyticOnNhd g U)
(h₂g : u : U, g u 0)
(h₁f : StronglyMeromorphicOn f U) :
StronglyMeromorphicOn (g * f) U := by
intro z hz
rw [mul_comm]
apply (stronglyMeromorphicAt_of_mul_analytic (h₁g z hz) ?h₂g).mp (h₁f z hz)
exact h₂g z, hz
/- Make strongly MeromorphicOn -/
noncomputable def MeromorphicOn.makeStronglyMeromorphicOn
{f : }
{U : Set }
(hf : MeromorphicOn f U) :
:= by
intro z
by_cases hz : z U
· exact (hf z hz).makeStronglyMeromorphicAt z
· exact f z
theorem makeStronglyMeromorphicOn_changeDiscrete
{f : }
{U : Set }
{z₀ : }
(hf : MeromorphicOn f U)
(hz₀ : z₀ U) :
hf.makeStronglyMeromorphicOn =[𝓝[] z₀] f := by
apply Filter.eventually_iff_exists_mem.2
let A := (hf z₀ hz₀).eventually_analyticAt
obtain V, h₁V, h₂V := Filter.eventually_iff_exists_mem.1 A
use V
constructor
· assumption
· intro v hv
unfold MeromorphicOn.makeStronglyMeromorphicOn
by_cases h₂v : v U
· simp [h₂v]
rw [ StronglyMeromorphicAt.makeStronglyMeromorphic_id]
exact AnalyticAt.stronglyMeromorphicAt (h₂V v hv)
· simp [h₂v]
theorem makeStronglyMeromorphicOn_changeDiscrete'
{f : }
{U : Set }
{z₀ : }
(hf : MeromorphicOn f U)
(hz₀ : z₀ U) :
hf.makeStronglyMeromorphicOn =[𝓝 z₀] (hf z₀ hz₀).makeStronglyMeromorphicAt := by
apply Mnhds
· apply Filter.EventuallyEq.trans (makeStronglyMeromorphicOn_changeDiscrete hf hz₀)
exact m₂ (hf z₀ hz₀)
· rw [MeromorphicOn.makeStronglyMeromorphicOn]
simp [hz₀]
theorem makeStronglyMeromorphicOn_changeDiscrete''
{f : }
{U : Set }
(hf : MeromorphicOn f U) :
f =[Filter.codiscreteWithin U] hf.makeStronglyMeromorphicOn := by
rw [Filter.eventuallyEq_iff_exists_mem]
use { x | AnalyticAt f x }
constructor
· exact MeromorphicOn.analyticOnCodiscreteWithin hf
· intro x hx
simp at hx
rw [MeromorphicOn.makeStronglyMeromorphicOn]
by_cases h₁x : x U
· simp [h₁x]
rw [ StronglyMeromorphicAt.makeStronglyMeromorphic_id hx.stronglyMeromorphicAt]
· simp [h₁x]
theorem stronglyMeromorphicOn_of_makeStronglyMeromorphicOn
{f : }
{U : Set }
(hf : MeromorphicOn f U) :
StronglyMeromorphicOn hf.makeStronglyMeromorphicOn U := by
intro z hz
let A := makeStronglyMeromorphicOn_changeDiscrete' hf hz
rw [stronglyMeromorphicAt_congr A]
exact StronglyMeromorphicAt_of_makeStronglyMeromorphic (hf z hz)
theorem makeStronglyMeromorphicOn_changeOrder
{f : }
{U : Set }
{z₀ : }
(hf : MeromorphicOn f U)
(hz₀ : z₀ U) :
(stronglyMeromorphicOn_of_makeStronglyMeromorphicOn hf z₀ hz₀).meromorphicAt.order = (hf z₀ hz₀).order := by
apply MeromorphicAt.order_congr
exact makeStronglyMeromorphicOn_changeDiscrete hf hz₀

View File

@@ -0,0 +1,640 @@
import Mathlib.Analysis.Analytic.Meromorphic
import Nevanlinna.analyticAt
import Nevanlinna.codiscreteWithin
import Nevanlinna.divisor
import Nevanlinna.meromorphicAt
import Nevanlinna.meromorphicOn
import Nevanlinna.meromorphicOn_divisor
import Nevanlinna.stronglyMeromorphicOn
import Nevanlinna.stronglyMeromorphicOn_ratlPolynomial
import Nevanlinna.mathlibAddOn
open scoped Interval Topology
open Real Filter MeasureTheory intervalIntegral
theorem MeromorphicOn.decompose₁
{f : }
{U : Set }
{z₀ : }
(h₁f : MeromorphicOn f U)
(h₂f : StronglyMeromorphicAt f z₀)
(h₃f : h₂f.meromorphicAt.order )
(hz₀ : z₀ U) :
g : , (MeromorphicOn g U)
(AnalyticAt g z₀)
(g z₀ 0)
(f = g * fun z (z - z₀) ^ (h₁f.divisor z₀)) := by
let h₁ := fun z (z - z₀) ^ (-h₁f.divisor z₀)
have h₁h₁ : MeromorphicOn h₁ U := by
apply MeromorphicOn.zpow
apply AnalyticOnNhd.meromorphicOn
apply AnalyticOnNhd.sub
exact analyticOnNhd_id
exact analyticOnNhd_const
let n : := (-h₁f.divisor z₀)
have h₂h₁ : (h₁h₁ z₀ hz₀).order = n := by
simp_rw [(h₁h₁ z₀ hz₀).order_eq_int_iff]
use 1
constructor
· apply analyticAt_const
· constructor
· simp
· apply eventually_nhdsWithin_of_forall
intro z hz
simp
let g₁ := f * h₁
have h₁g₁ : MeromorphicOn g₁ U := by
apply h₁f.mul h₁h₁
have h₂g₁ : (h₁g₁ z₀ hz₀).order = 0 := by
rw [(h₁f z₀ hz₀).order_mul (h₁h₁ z₀ hz₀)]
rw [h₂h₁]
unfold n
rw [MeromorphicOn.divisor_def₂ h₁f hz₀ h₃f]
conv =>
left
left
rw [Eq.symm (WithTop.coe_untop (h₁f z₀ hz₀).order h₃f)]
have
(a b c : )
(h : a + b = c) :
(a : WithTop ) + (b : WithTop ) = (c : WithTop ) := by
rw [ h]
simp
rw [this ((h₁f z₀ hz₀).order.untop h₃f) (-(h₁f z₀ hz₀).order.untop h₃f) 0]
simp
ring
let g := (h₁g₁ z₀ hz₀).makeStronglyMeromorphicAt
have h₂g : StronglyMeromorphicAt g z₀ := by
exact StronglyMeromorphicAt_of_makeStronglyMeromorphic (h₁g₁ z₀ hz₀)
have h₁g : MeromorphicOn g U := by
intro z hz
by_cases h₁z : z = z₀
· rw [h₁z]
apply h₂g.meromorphicAt
· apply (h₁g₁ z hz).congr
rw [eventuallyEq_nhdsWithin_iff]
rw [eventually_nhds_iff]
use {z₀}
constructor
· intro y h₁y h₂y
let A := m₁ (h₁g₁ z₀ hz₀) y h₁y
unfold g
rw [ A]
· constructor
· exact isOpen_compl_singleton
· exact h₁z
have h₃g : (h₁g z₀ hz₀).order = 0 := by
unfold g
let B := m₂ (h₁g₁ z₀ hz₀)
let A := (h₁g₁ z₀ hz₀).order_congr B
rw [ A]
rw [h₂g₁]
have h₄g : AnalyticAt g z₀ := by
apply h₂g.analytic
rw [h₃g]
use g
constructor
· exact h₁g
· constructor
· exact h₄g
· constructor
· exact (h₂g.order_eq_zero_iff).mp h₃g
· funext z
by_cases hz : z = z₀
· rw [hz]
simp
by_cases h : h₁f.divisor z₀ = 0
· simp [h]
have h₂h₁ : h₁ = 1 := by
funext w
unfold h₁
simp [h]
have h₃g₁ : g₁ = f := by
unfold g₁
rw [h₂h₁]
simp
have h₄g₁ : StronglyMeromorphicAt g₁ z₀ := by
rwa [h₃g₁]
let A := h₄g₁.makeStronglyMeromorphic_id
unfold g
rw [ A, h₃g₁]
· have : (0 : ) ^ h₁f.divisor z₀ = (0 : ) := by
exact zero_zpow (h₁f.divisor z₀) h
rw [this]
simp
let A := h₂f.order_eq_zero_iff.not
simp at A
rw [ A]
unfold MeromorphicOn.divisor at h
simp [hz₀] at h
exact h.1
· simp
let B := m₁ (h₁g₁ z₀ hz₀) z hz
unfold g
rw [ B]
unfold g₁ h₁
simp [hz]
rw [mul_assoc]
rw [inv_mul_cancel₀]
simp
apply zpow_ne_zero
rwa [sub_ne_zero]
theorem MeromorphicOn.decompose₂
{f : }
{U : Set }
{P : Finset U}
(hf : StronglyMeromorphicOn f U) :
( p P, (hf p p.2).meromorphicAt.order )
g : , (MeromorphicOn g U)
( p : P, AnalyticAt g p)
( p : P, g p 0)
(f = g * p : P, fun z (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)) := by
apply Finset.induction (p := fun (P : Finset U)
( p P, (hf p p.2).meromorphicAt.order )
g : , (MeromorphicOn g U)
( p : P, AnalyticAt g p)
( p : P, g p 0)
(f = g * p : P, fun z (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)))
-- case empty
simp
exact hf.meromorphicOn
-- case insert
intro u P hu iHyp
intro hOrder
obtain g₀, h₁g₀, h₂g₀, h₃g₀, h₄g₀ := iHyp (fun p hp hOrder p (Finset.mem_insert_of_mem hp))
have h₀ : AnalyticAt ( p : P, fun z (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)) u := by
have : ( p : P, fun z (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)) = (fun z => p : P, (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)) := by
funext w
simp
rw [this]
apply Finset.analyticAt_prod
intro p hp
apply AnalyticAt.zpow
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_const
by_contra hCon
rw [sub_eq_zero] at hCon
have : p.1 = u := by
exact SetCoe.ext (_root_.id (Eq.symm hCon))
rw [ this] at hu
simp [hp] at hu
have h₁ : ( p : P, fun z (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)) u 0 := by
simp only [Finset.prod_apply]
rw [Finset.prod_ne_zero_iff]
intro p hp
apply zpow_ne_zero
by_contra hCon
rw [sub_eq_zero] at hCon
have : p.1 = u := by
exact SetCoe.ext (_root_.id (Eq.symm hCon))
rw [ this] at hu
simp [hp] at hu
have h₅g₀ : StronglyMeromorphicAt g₀ u := by
rw [stronglyMeromorphicAt_of_mul_analytic h₀ h₁]
rw [ h₄g₀]
exact hf u u.2
have h₆g₀ : (h₁g₀ u u.2).order := by
by_contra hCon
let A := (h₁g₀ u u.2).order_mul h₀.meromorphicAt
simp_rw [ h₄g₀, hCon] at A
simp at A
let B := hOrder u (Finset.mem_insert_self u P)
tauto
obtain g, h₁g, h₂g, h₃g, h₄g := h₁g₀.decompose₁ h₅g₀ h₆g₀ u.2
use g
· constructor
· exact h₁g
· constructor
· intro v₁, v₂
simp
simp at v₂
rcases v₂ with hv|hv
· rwa [hv]
· let A := h₂g₀ v₁, hv
rw [h₄g] at A
rw [ analyticAt_of_mul_analytic] at A
simp at A
exact A
--
simp
apply AnalyticAt.zpow
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_const
by_contra hCon
rw [sub_eq_zero] at hCon
have : v₁ = u := by
exact SetCoe.ext hCon
rw [this] at hv
tauto
--
apply zpow_ne_zero
simp
by_contra hCon
rw [sub_eq_zero] at hCon
have : v₁ = u := by
exact SetCoe.ext hCon
rw [this] at hv
tauto
· constructor
· intro v₁, v₂
simp
simp at v₂
rcases v₂ with hv|hv
· rwa [hv]
· by_contra hCon
let A := h₃g₀ v₁,hv
rw [h₄g] at A
simp at A
tauto
· conv =>
left
rw [h₄g₀, h₄g]
simp
rw [mul_assoc]
congr
rw [Finset.prod_insert]
simp
congr
have : (hf u u.2).meromorphicAt.order = (h₁g₀ u u.2).order := by
have h₅g₀ : f =[𝓝 u.1] (g₀ * p : P, fun z => (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)) := by
exact Eq.eventuallyEq h₄g₀
have h₆g₀ : f =[𝓝[] u.1] (g₀ * p : P, fun z => (z - p.1.1) ^ (hf.meromorphicOn.divisor p.1.1)) := by
exact eventuallyEq_nhdsWithin_of_eqOn fun x a => congrFun h₄g₀ x
rw [(hf u u.2).meromorphicAt.order_congr h₆g₀]
let C := (h₁g₀ u u.2).order_mul h₀.meromorphicAt
rw [C]
let D := h₀.order_eq_zero_iff.2 h₁
let E := h₀.meromorphicAt_order
rw [E, D]
simp
have : hf.meromorphicOn.divisor u = h₁g₀.divisor u := by
unfold MeromorphicOn.divisor
simp
rw [this]
rw [this]
--
simpa
theorem MeromorphicOn.decompose₃'
{f : }
{U : Set }
(h₁U : IsCompact U)
(h₂U : IsConnected U)
(h₁f : StronglyMeromorphicOn f U)
(h₂f : u : U, f u 0) :
g : , (MeromorphicOn g U)
(AnalyticOnNhd g U)
( u : U, g u 0)
(f = g * u, fun z (z - u) ^ (h₁f.meromorphicOn.divisor u)) := by
have h₃f : u : U, (h₁f u u.2).meromorphicAt.order :=
StronglyMeromorphicOn.order_ne_top h₁f h₂U h₂f
have h₄f : Set.Finite (Function.support h₁f.meromorphicOn.divisor) := h₁f.meromorphicOn.divisor.finiteSupport h₁U
let d := - h₁f.meromorphicOn.divisor.toFun
have h₁d : d.support = (Function.support h₁f.meromorphicOn.divisor) := by
ext x
unfold d
simp
let h₁ := u, fun z (z - u) ^ (d u)
have h₁h₁ : StronglyMeromorphicOn h₁ U := by
intro z hz
exact stronglyMeromorphicOn_ratlPolynomial₃ d z trivial
have h₂h₁ : h₁h₁.meromorphicOn.divisor = d := by
apply stronglyMeromorphicOn_divisor_ratlPolynomial_U
rwa [h₁d]
--
rw [h₁d]
exact (StronglyMeromorphicOn.meromorphicOn h₁f).divisor.supportInU
have h₃h₁ : (z : ) (hz : z U), (h₁h₁ z hz).meromorphicAt.order := by
intro z hz
apply stronglyMeromorphicOn_ratlPolynomial₃order
have h₄h₁ : (z : ) (hz : z U), (h₁h₁ z hz).meromorphicAt.order = d z := by
intro z hz
rw [stronglyMeromorphicOn_divisor_ratlPolynomial₁]
rwa [h₁d]
let g' := f * h₁
have h₁g' : MeromorphicOn g' U := h₁f.meromorphicOn.mul h₁h₁.meromorphicOn
have h₂g' : h₁g'.divisor.toFun = 0 := by
rw [MeromorphicOn.divisor_mul h₁f.meromorphicOn (fun z hz h₃f z, hz) h₁h₁.meromorphicOn h₃h₁]
rw [h₂h₁]
unfold d
simp
have h₃g' : u : U, (h₁g' u.1 u.2).order = 0 := by
intro u
rw [(h₁f u.1 u.2).meromorphicAt.order_mul (h₁h₁ u.1 u.2).meromorphicAt]
rw [h₄h₁]
unfold d
unfold MeromorphicOn.divisor
simp
have : (h₁f u.1 u.2).meromorphicAt.order = WithTop.untop' 0 (h₁f u.1 u.2).meromorphicAt.order := by
rw [eq_comm]
let A := h₃f u
exact untop'_of_ne_top A
rw [this]
simp
rw [ WithTop.LinearOrderedAddCommGroup.coe_neg]
rw [ WithTop.coe_add]
simp
exact u.2
let g := h₁g'.makeStronglyMeromorphicOn
have h₁g : StronglyMeromorphicOn g U := stronglyMeromorphicOn_of_makeStronglyMeromorphicOn h₁g'
have h₂g : h₁g.meromorphicOn.divisor.toFun = 0 := by
rw [ MeromorphicOn.divisor_of_makeStronglyMeromorphicOn]
rw [h₂g']
have h₃g : AnalyticOnNhd g U := by
apply StronglyMeromorphicOn.analyticOnNhd
rw [h₂g]
simp
assumption
have h₄g : u : U, g u 0 := by
intro u
rw [ (h₁g u.1 u.2).order_eq_zero_iff]
rw [makeStronglyMeromorphicOn_changeOrder]
let A := h₃g' u
exact A
exact u.2
use g
constructor
· exact StronglyMeromorphicOn.meromorphicOn h₁g
· constructor
· exact h₃g
· constructor
· exact h₄g
· have t₀ : StronglyMeromorphicOn (g * (u : ), fun z => (z - u) ^ (h₁f.meromorphicOn.divisor u)) U := by
apply stronglyMeromorphicOn_of_mul_analytic' h₃g h₄g
apply stronglyMeromorphicOn_ratlPolynomial₃U
funext z
by_cases hz : z U
· apply Filter.EventuallyEq.eq_of_nhds
apply StronglyMeromorphicAt.localIdentity (h₁f z hz) (t₀ z hz)
have h₅g : g =[𝓝[] z] g' := makeStronglyMeromorphicOn_changeDiscrete h₁g' hz
have Y' : (g' * (u : ), fun z => (z - u) ^ (h₁f.meromorphicOn.divisor u)) =[𝓝[] z] g * (u : ), fun z => (z - u) ^ (h₁f.meromorphicOn.divisor u) := by
apply Filter.EventuallyEq.symm
exact Filter.EventuallyEq.mul h₅g (by simp)
apply Filter.EventuallyEq.trans _ Y'
unfold g'
unfold h₁
let A := h₁f.meromorphicOn.divisor.locallyFiniteInU z hz
let B := eventually_nhdsWithin_iff.1 A
obtain t, h₁t, h₂t, h₃t := eventually_nhds_iff.1 B
apply eventually_nhdsWithin_iff.2
rw [eventually_nhds_iff]
use t
constructor
· intro y h₁y h₂y
let C := h₁t y h₁y h₂y
rw [mul_assoc]
simp
have : (finprod (fun u z => (z - u) ^ d u) y * finprod (fun u z => (z - u) ^ (h₁f.meromorphicOn.divisor u)) y) = 1 := by
have t₀ : (Function.mulSupport fun u z => (z - u) ^ d u).Finite := by
rwa [ratlPoly_mulsupport, h₁d]
rw [finprod_eq_prod _ t₀]
have t₁ : (Function.mulSupport fun u z => (z - u) ^ h₁f.meromorphicOn.divisor u).Finite := by
rwa [ratlPoly_mulsupport]
rw [finprod_eq_prod _ t₁]
have : (Function.mulSupport fun u z => (z - u) ^ d u) = (Function.mulSupport fun u z => (z - u) ^ h₁f.meromorphicOn.divisor u) := by
rw [ratlPoly_mulsupport]
rw [ratlPoly_mulsupport]
unfold d
simp
have : t₀.toFinset = t₁.toFinset := by congr
rw [this]
simp
rw [ Finset.prod_mul_distrib]
apply Finset.prod_eq_one
intro x hx
apply zpow_neg_mul_zpow_self
have : y t₁.toFinset := by
simp
simp at C
rw [C]
simp
tauto
by_contra H
rw [sub_eq_zero] at H
rw [H] at this
tauto
rw [this]
simp
· exact h₂t, h₃t
· simp
have : g z = g' z := by
unfold g
unfold MeromorphicOn.makeStronglyMeromorphicOn
simp [hz]
rw [this]
unfold g'
unfold h₁
simp
rw [mul_assoc]
nth_rw 1 [ mul_one (f z)]
congr
have t₀ : (Function.mulSupport fun u z => (z - u) ^ d u).Finite := by
rwa [ratlPoly_mulsupport, h₁d]
rw [finprod_eq_prod _ t₀]
have t₁ : (Function.mulSupport fun u z => (z - u) ^ h₁f.meromorphicOn.divisor u).Finite := by
rwa [ratlPoly_mulsupport]
rw [finprod_eq_prod _ t₁]
have : (Function.mulSupport fun u z => (z - u) ^ d u) = (Function.mulSupport fun u z => (z - u) ^ h₁f.meromorphicOn.divisor u) := by
rw [ratlPoly_mulsupport]
rw [ratlPoly_mulsupport]
unfold d
simp
have : t₀.toFinset = t₁.toFinset := by congr
rw [this]
simp
rw [ Finset.prod_mul_distrib]
rw [eq_comm]
apply Finset.prod_eq_one
intro x hx
apply zpow_neg_mul_zpow_self
have : z t₁.toFinset := by
simp
have : h₁f.meromorphicOn.divisor z = 0 := by
let A := h₁f.meromorphicOn.divisor.supportInU
simp at A
by_contra H
let B := A z H
tauto
rw [this]
simp
rfl
by_contra H
rw [sub_eq_zero] at H
rw [H] at this
tauto
theorem StronglyMeromorphicOn.decompose_log
{f : }
{U : Set }
(h₁U : IsCompact U)
(h₂U : IsConnected U)
(h₁f : StronglyMeromorphicOn f U)
(h₂f : u : U, f u 0) :
g : , (MeromorphicOn g U)
(AnalyticOnNhd g U)
( u : U, g u 0)
(fun z log f z) =[Filter.codiscreteWithin U] fun z log g z + s, (h₁f.meromorphicOn.divisor s) * log z - s := by
have h₃f : Set.Finite (Function.support h₁f.meromorphicOn.divisor) := by
exact Divisor.finiteSupport h₁U (StronglyMeromorphicOn.meromorphicOn h₁f).divisor
have hSupp₁ {z : } : (fun s (h₁f.meromorphicOn.divisor s) * log z - s).support h₃f.toFinset := by
intro x
contrapose
simp; tauto
simp_rw [finsum_eq_sum_of_support_subset _ hSupp₁]
obtain g, h₁g, h₂g, h₃g, h₄g := MeromorphicOn.decompose₃' h₁U h₂U h₁f h₂f
have hSupp₂ {z : } : ( fun (u : ) (fun (z : ) (z - u) ^ (h₁f.meromorphicOn.divisor u)) ).mulSupport h₃f.toFinset := by
intro x
contrapose
simp
intro hx
rw [hx]
simp; tauto
rw [finprod_eq_prod_of_mulSupport_subset _ hSupp₂] at h₄g
use g
simp only [h₁g, h₂g, h₃g, ne_eq, true_and, not_false_eq_true, implies_true]
rw [Filter.eventuallyEq_iff_exists_mem]
use {z | f z 0}
constructor
· have A := h₁f.meromorphicOn.divisor.codiscreteWithin
have : {z | f z 0} U = (Function.support h₁f.meromorphicOn.divisor) U := by
rw [ h₁f.support_divisor h₂f h₂U]
ext u
simp; tauto
rw [codiscreteWithin_congr this]
exact A
· intro z hz
nth_rw 1 [h₄g]
simp
rw [log_mul, log_prod]
congr
ext u
rw [log_zpow]
--
intro x hx
simp at hx
have h₁x : x U := by
exact h₁f.meromorphicOn.divisor.supportInU hx
apply zpow_ne_zero
simp
by_contra hCon
rw [ hCon] at hx
unfold MeromorphicOn.divisor at hx
rw [hCon] at hz
simp at hz
let A := (h₁f x h₁x).order_eq_zero_iff
let B := A.2 hz
simp [B] at hx
obtain a, b := hx
let c := b.1
simp_rw [hCon] at c
tauto
--
simp at hz
by_contra hCon
simp at hCon
rw [h₄g] at hz
simp at hz
tauto
--
rw [Finset.prod_ne_zero_iff]
intro x hx
simp at hx
have h₁x : x U := by
exact h₁f.meromorphicOn.divisor.supportInU hx
apply zpow_ne_zero
simp
by_contra hCon
rw [ hCon] at hx
unfold MeromorphicOn.divisor at hx
rw [hCon] at hz
simp at hz
let A := (h₁f x h₁x).order_eq_zero_iff
let B := A.2 hz
simp [B] at hx
obtain a, b := hx
let c := b.1
simp_rw [hCon] at c
tauto
exact 0
theorem MeromorphicOn.decompose_log
{f : }
{U : Set }
(h₁U : IsCompact U)
(h₂U : IsConnected U)
(h₃U : interior U )
(h₁f : MeromorphicOn f U)
(h₂f : u : U, (h₁f u u.2).order ) :
g : , (AnalyticOnNhd g U)
( u : U, g u 0)
(fun z log f z) =[Filter.codiscreteWithin U] fun z log g z + s, (h₁f.divisor s) * log z - s := by
let F := h₁f.makeStronglyMeromorphicOn
have h₁F := stronglyMeromorphicOn_of_makeStronglyMeromorphicOn h₁f
have h₂F : u : U, (h₁F.meromorphicOn u u.2).order := by
obtain u, hu := h₂f
use u
rw [makeStronglyMeromorphicOn_changeOrder h₁f u.2]
assumption
have t₁ : u : U, F u 0 := by
let A := h₁F.meromorphicOn.nonvanish_of_order_ne_top h₂F h₂U h₃U
tauto
have t₃ : (fun z log f z) =[Filter.codiscreteWithin U] (fun z log F z) := by
-- This would be interesting for a tactic
rw [eventuallyEq_iff_exists_mem]
obtain s, h₁s, h₂s := eventuallyEq_iff_exists_mem.1 (makeStronglyMeromorphicOn_changeDiscrete'' h₁f)
use s
tauto
obtain g, h₁g, h₂g, h₃g, h₄g := h₁F.decompose_log h₁U h₂U t₁
use g
constructor
· exact h₂g
· constructor
· exact h₃g
· apply t₃.trans
rw [h₁f.divisor_of_makeStronglyMeromorphicOn]
exact h₄g

View File

@@ -0,0 +1,213 @@
import Nevanlinna.stronglyMeromorphicOn
import Nevanlinna.meromorphicOn
import Nevanlinna.meromorphicOn_divisor
import Nevanlinna.mathlibAddOn
open scoped Interval Topology
theorem analyticAt_ratlPolynomial₁
{z : }
(d : )
(P : Finset ) :
z P AnalyticAt ( u P, fun z (z - u) ^ d u) z := by
intro hz
rw [Finset.prod_fn]
apply Finset.analyticAt_prod
intro u hu
apply AnalyticAt.zpow
apply AnalyticAt.sub
apply analyticAt_id
apply analyticAt_const
rw [sub_ne_zero, ne_comm]
exact ne_of_mem_of_not_mem hu hz
theorem stronglyMeromorphicOn_ratlPolynomial₂
(d : )
(P : Finset ) :
StronglyMeromorphicOn ( u P, fun z (z - u) ^ d u) := by
intro z hz
by_cases h₂z : z P
· rw [ Finset.mul_prod_erase P _ h₂z]
right
use d z
use x P.erase z, fun z => (z - x) ^ d x
constructor
· have : z P.erase z := Finset.not_mem_erase z P
apply analyticAt_ratlPolynomial₁ d (P.erase z) this
· constructor
· simp only [Finset.prod_apply]
rw [Finset.prod_ne_zero_iff]
intro u hu
apply zpow_ne_zero
rw [sub_ne_zero]
by_contra hCon
rw [hCon] at hu
let A := Finset.not_mem_erase u P
tauto
· exact Filter.Eventually.of_forall (congrFun rfl)
· apply AnalyticAt.stronglyMeromorphicAt
exact analyticAt_ratlPolynomial₁ d P (z := z) h₂z
theorem stronglyMeromorphicOn_ratlPolynomial₃
(d : ) :
StronglyMeromorphicOn ( u, fun z (z - u) ^ d u) := by
by_cases hd : (Function.mulSupport fun u z => (z - u) ^ d u).Finite
· rw [finprod_eq_prod _ hd]
apply stronglyMeromorphicOn_ratlPolynomial₂ d hd.toFinset
· rw [finprod_of_infinite_mulSupport hd]
apply AnalyticOn.stronglyMeromorphicOn
apply analyticOnNhd_const
theorem stronglyMeromorphicOn_ratlPolynomial₃U
(d : )
(U : Set ) :
StronglyMeromorphicOn ( u, fun z (z - u) ^ d u) U := by
intro z hz
exact stronglyMeromorphicOn_ratlPolynomial₃ d z (trivial)
theorem ratlPoly_mulsupport
(d : ) :
(Function.mulSupport fun u z (z - u) ^ d u) = d.support := by
ext u
constructor
· intro h
simp at h
simp
by_contra hCon
rw [hCon] at h
simp at h
tauto
· intro h
simp
by_contra hCon
let A := congrFun hCon u
simp at A
have t₁ : (0 : ) ^ d u 0 := ne_zero_of_eq_one A
rw [zpow_ne_zero_iff h] at t₁
tauto
theorem stronglyMeromorphicOn_divisor_ratlPolynomial₁
{z : }
(d : )
(h₁d : Set.Finite d.support) :
(((stronglyMeromorphicOn_ratlPolynomial₃ d).meromorphicOn) z trivial).order = d z := by
rw [MeromorphicAt.order_eq_int_iff]
use x h₁d.toFinset.erase z, fun z => (z - x) ^ d x
constructor
· have : z h₁d.toFinset.erase z := Finset.not_mem_erase z h₁d.toFinset
apply analyticAt_ratlPolynomial₁ d (h₁d.toFinset.erase z) this
· constructor
· simp only [Finset.prod_apply]
rw [Finset.prod_ne_zero_iff]
intro u hu
apply zpow_ne_zero
rw [sub_ne_zero]
by_contra hCon
rw [hCon] at hu
let A := Finset.not_mem_erase u h₁d.toFinset
tauto
· apply Filter.Eventually.of_forall
intro x
have t₀ : (Function.mulSupport fun u z => (z - u) ^ d u).Finite := by
rwa [ratlPoly_mulsupport d]
rw [finprod_eq_prod _ t₀]
have t₁ : h₁d.toFinset = t₀.toFinset := by
simp
rw [eq_comm]
exact ratlPoly_mulsupport d
rw [t₁]
simp
rw [eq_comm]
have : z h₁d.toFinset.erase z := Finset.not_mem_erase z h₁d.toFinset
by_cases hz : z h₁d.toFinset
· rw [t₁] at hz
conv =>
right
rw [ Finset.mul_prod_erase t₀.toFinset _ hz]
· have : t₀.toFinset = t₀.toFinset.erase z := by
rw [eq_comm]
apply Finset.erase_eq_of_not_mem
rwa [t₁] at hz
rw [this]
have : (x - z) ^ d z = 1 := by
simp at hz
rw [hz]
simp
rw [this]
simp
theorem stronglyMeromorphicOn_ratlPolynomial₃order
{z : }
(d : ) :
((stronglyMeromorphicOn_ratlPolynomial₃ d) z trivial).meromorphicAt.order := by
have h₂d : (Function.mulSupport fun u z (z - u) ^ d u) = d.support := by
ext u
constructor
· intro h
simp at h
simp
by_contra hCon
rw [hCon] at h
simp at h
tauto
· intro h
simp
by_contra hCon
let A := congrFun hCon u
simp at A
have t₁ : (0 : ) ^ d u 0 := ne_zero_of_eq_one A
rw [zpow_ne_zero_iff h] at t₁
tauto
by_cases hd : Set.Finite (Function.support d)
· rw [stronglyMeromorphicOn_divisor_ratlPolynomial₁ d hd]
simp
· rw [ h₂d] at hd
have : (Function.mulSupport fun u z => (z - u) ^ d u).Infinite := by
exact hd
simp_rw [finprod_of_infinite_mulSupport this]
have : AnalyticAt (1 : ) z := by exact analyticAt_const
rw [AnalyticAt.meromorphicAt_order this]
rw [this.order_eq_zero_iff.2 (by simp)]
simp
theorem stronglyMeromorphicOn_divisor_ratlPolynomial
(d : )
(h₁d : Set.Finite d.support) :
(stronglyMeromorphicOn_ratlPolynomial₃ d).meromorphicOn.divisor = d := by
funext z
rw [MeromorphicOn.divisor]
simp
rw [stronglyMeromorphicOn_divisor_ratlPolynomial₁ d h₁d]
simp
theorem stronglyMeromorphicOn_divisor_ratlPolynomial_U
{U : Set }
(d : )
(h₁d : Set.Finite d.support)
(h₂d : d.support U) :
(stronglyMeromorphicOn_ratlPolynomial₃U d U).meromorphicOn.divisor = d := by
funext z
rw [MeromorphicOn.divisor]
simp
by_cases hz : z U
· simp [hz]
rw [stronglyMeromorphicOn_divisor_ratlPolynomial₁ d h₁d]
simp
· simp [hz]
rw [eq_comm, Function.nmem_support]
tauto

View File

@@ -0,0 +1,438 @@
import Nevanlinna.specialFunctions_CircleIntegral_affine
import Nevanlinna.stronglyMeromorphicOn_eliminate
open Real
theorem jensen₀
{R : }
(hR : 0 < R)
(f : )
-- WARNING: Not needed. MeromorphicOn suffices
(h₁f : StronglyMeromorphicOn f (Metric.closedBall 0 R))
(h₂f : f 0 0) :
log f 0 = - s, (h₁f.meromorphicOn.divisor s) * log (R * s⁻¹) + (2 * π)⁻¹ * (x : ) in (0)..(2 * π), log f (circleMap 0 R x) := by
have h₁U : IsConnected (Metric.closedBall (0 : ) R) := by
constructor
· apply Metric.nonempty_closedBall.mpr
exact le_of_lt hR
· exact (convex_closedBall (0 : ) R).isPreconnected
have h₂U : IsCompact (Metric.closedBall (0 : ) R) :=
isCompact_closedBall 0 R
have h'₂f : u : (Metric.closedBall (0 : ) R), f u 0 := by
use 0, Metric.mem_closedBall_self (le_of_lt hR)
have h'₁f : StronglyMeromorphicAt f 0 := by
apply h₁f
simp
exact le_of_lt hR
have h''₂f : h'₁f.meromorphicAt.order = 0 := by
rwa [h'₁f.order_eq_zero_iff]
have h'''₂f : h₁f.meromorphicOn.divisor 0 = 0 := by
unfold MeromorphicOn.divisor
simp
tauto
have h₃f : Set.Finite (Function.support h₁f.meromorphicOn.divisor) := by
exact Divisor.finiteSupport h₂U (StronglyMeromorphicOn.meromorphicOn h₁f).divisor
have h'₃f : s h₃f.toFinset, s 0 := by
by_contra hCon
push_neg at hCon
obtain s, h₁s, h₂s := hCon
rw [h₂s] at h₁s
simp at h₁s
tauto
have h₄f: Function.support (fun s (h₁f.meromorphicOn.divisor s) * log (R * s⁻¹)) h₃f.toFinset := by
intro x
contrapose
simp
intro hx
rw [hx]
simp
rw [finsum_eq_sum_of_support_subset _ h₄f]
obtain F, h₁F, h₂F, h₃F, h₄F := MeromorphicOn.decompose₃' h₂U h₁U h₁f h'₂f
have h₁F : Function.mulSupport (fun u fun z => (z - u) ^ (h₁f.meromorphicOn.divisor u)) h₃f.toFinset := by
intro u
contrapose
simp
intro hu
rw [hu]
simp
exact rfl
rw [finprod_eq_prod_of_mulSupport_subset _ h₁F] at h₄F
let G := fun z log F z + s, (h₁f.meromorphicOn.divisor s) * log z - s
have h₁G {z : } : Function.support (fun s (h₁f.meromorphicOn.divisor s) * log z - s) h₃f.toFinset := by
intro s
contrapose
simp
intro hs
rw [hs]
simp
have decompose_f : z Metric.closedBall (0 : ) R, f z 0 log f z = G z := by
intro z h₁z h₂z
rw [h₄F]
simp only [Pi.mul_apply, norm_mul]
simp only [Finset.prod_apply, norm_prod, norm_zpow]
rw [Real.log_mul]
rw [Real.log_prod]
simp_rw [Real.log_zpow]
dsimp only [G]
rw [finsum_eq_sum_of_support_subset _ h₁G]
--
intro x hx
have : z x := by
by_contra hCon
rw [ hCon] at hx
simp at hx
rw [ (h₁f z h₁z).order_eq_zero_iff] at h₂z
unfold MeromorphicOn.divisor at hx
simp [h₁z] at hx
tauto
apply zpow_ne_zero
simpa
-- Complex.abs (F z) ≠ 0
simp
exact h₃F z, h₁z
--
rw [Finset.prod_ne_zero_iff]
intro x hx
have : z x := by
by_contra hCon
rw [ hCon] at hx
simp at hx
rw [ (h₁f z h₁z).order_eq_zero_iff] at h₂z
unfold MeromorphicOn.divisor at hx
simp [h₁z] at hx
tauto
apply zpow_ne_zero
simpa
have int_logAbs_f_eq_int_G : (x : ) in (0)..2 * π, log f (circleMap 0 R x) = (x : ) in (0)..2 * π, G (circleMap 0 R x) := by
rw [intervalIntegral.integral_congr_ae]
rw [MeasureTheory.ae_iff]
apply Set.Countable.measure_zero
simp
have t₀ : {a | a Ι 0 (2 * π) ¬log f (circleMap 0 R a) = G (circleMap 0 R a)}
(circleMap 0 R)⁻¹' (h₃f.toFinset) := by
intro a ha
simp at ha
simp
by_contra C
have t₀ : (circleMap 0 R a) Metric.closedBall 0 R := by
apply circleMap_mem_closedBall
exact le_of_lt hR
have t₁ : f (circleMap 0 R a) 0 := by
let A := h₁f (circleMap 0 R a) t₀
rw [ A.order_eq_zero_iff]
unfold MeromorphicOn.divisor at C
simp [t₀] at C
rcases C with C₁|C₂
· assumption
· let B := h₁f.meromorphicOn.order_ne_top' h₁U
let C := fun q B.1 q (circleMap 0 R a), t₀
rw [C₂] at C
have : u : (Metric.closedBall (0 : ) R), (h₁f u u.2).meromorphicAt.order := by
use (0 : ), (by simp; exact le_of_lt hR)
let H := h₁f 0 (by simp; exact le_of_lt hR)
let K := H.order_eq_zero_iff.2 h₂f
rw [K]
simp
let D := C this
tauto
exact ha.2 (decompose_f (circleMap 0 R a) t₀ t₁)
apply Set.Countable.mono t₀
apply Set.Countable.preimage_circleMap
apply Set.Finite.countable
exact Finset.finite_toSet h₃f.toFinset
--
exact Ne.symm (ne_of_lt hR)
have decompose_int_G : (x : ) in (0)..2 * π, G (circleMap 0 R x)
= ( (x : ) in (0)..2 * π, log (Complex.abs (F (circleMap 0 R x))))
+ x, (h₁f.meromorphicOn.divisor x) * (x_1 : ) in (0)..2 * π, log (Complex.abs (circleMap 0 R x_1 - x)) := by
dsimp [G]
rw [intervalIntegral.integral_add]
congr
have t₀ {x : } : Function.support (fun s (h₁f.meromorphicOn.divisor s) * log (Complex.abs (circleMap 0 R x - s))) h₃f.toFinset := by
intro s hs
simp at hs
simp [hs.1]
conv =>
left
arg 1
intro x
rw [finsum_eq_sum_of_support_subset _ t₀]
rw [intervalIntegral.integral_finset_sum]
let G' := fun x ((h₁f.meromorphicOn.divisor x) : ) * (x_1 : ) in (0)..2 * π, log (Complex.abs (circleMap 0 R x_1 - x))
have t₁ : (Function.support fun x (h₁f.meromorphicOn.divisor x) * (x_1 : ) in (0)..2 * π, log (Complex.abs (circleMap 0 R x_1 - x))) h₃f.toFinset := by
simp
intro s
contrapose!
simp
tauto
conv =>
right
rw [finsum_eq_sum_of_support_subset _ t₁]
simp
-- ∀ i ∈ (finiteZeros h₁U h₂U h'₁f h'₂f).toFinset,
-- IntervalIntegrable (fun x => (h'₁f.order i).toNat *
-- log (Complex.abs (circleMap 0 1 x - ↑i))) MeasureTheory.volume 0 (2 * π)
intro i _
apply IntervalIntegrable.const_mul
apply intervalIntegrable_logAbs_circleMap_sub_const
linarith
--
-- case neg
apply Continuous.intervalIntegrable
apply continuous_iff_continuousAt.2
intro x
have : (fun x => log (Complex.abs ( F (circleMap 0 R x)))) = log Complex.abs F circleMap 0 R :=
rfl
rw [this]
apply ContinuousAt.comp
apply Real.continuousAt_log
simp
let A := h₃F (circleMap 0 R x), circleMap_mem_closedBall 0 (le_of_lt hR) x
exact A
--
apply ContinuousAt.comp
apply Complex.continuous_abs.continuousAt
apply ContinuousAt.comp
let A := h₂F (circleMap 0 R x) (circleMap_mem_closedBall 0 (le_of_lt hR) x)
apply A.continuousAt
exact (continuous_circleMap 0 R).continuousAt
-- IntervalIntegrable (fun x => ∑ᶠ (s : ), ↑(↑⋯.divisor s) * log (Complex.abs (circleMap 0 1 x - s))) MeasureTheory.volume 0 (2 * π)
--simp? at h₁G
have h₁G' {z : } : (Function.support fun s => (h₁f.meromorphicOn.divisor s) * log (Complex.abs (z - s))) h₃f.toFinset := by
exact h₁G
conv =>
arg 1
intro z
rw [finsum_eq_sum_of_support_subset _ h₁G']
conv =>
arg 1
rw [ Finset.sum_fn]
apply IntervalIntegrable.sum
intro i _
apply IntervalIntegrable.const_mul
--have : i.1 ∈ Metric.closedBall (0 : ) 1 := i.2
--simp at this
by_cases h₂i : i = R
-- case pos
--exact int'₂ h₂i
apply intervalIntegrable_logAbs_circleMap_sub_const (Ne.symm (ne_of_lt hR))
-- case neg
apply Continuous.intervalIntegrable
apply continuous_iff_continuousAt.2
intro x
have : (fun x => log (Complex.abs (circleMap 0 R x - i))) = log Complex.abs (fun x circleMap 0 R x - i) :=
rfl
rw [this]
apply ContinuousAt.comp
apply Real.continuousAt_log
simp
by_contra ha'
conv at h₂i =>
arg 1
rw [ ha']
rw [Complex.norm_eq_abs]
rw [abs_circleMap_zero R x]
simp
linarith
apply ContinuousAt.comp
apply Complex.continuous_abs.continuousAt
fun_prop
have t₁ : ( (x : ) in (0)..2 * Real.pi, log F (circleMap 0 R x)) = 2 * Real.pi * log F 0 := by
let logAbsF := fun w Real.log F w
have t₀ : z Metric.closedBall 0 R, HarmonicAt logAbsF z := by
intro z hz
apply logabs_of_holomorphicAt_is_harmonic
exact AnalyticAt.holomorphicAt (h₂F z hz)
exact h₃F z, hz
apply harmonic_meanValue₁ R hR t₀
simp_rw [ Complex.norm_eq_abs] at decompose_int_G
rw [t₁] at decompose_int_G
have h₁G' : (Function.support fun s => (h₁f.meromorphicOn.divisor s) * (x_1 : ) in (0)..(2 * π), log circleMap 0 R x_1 - s) h₃f.toFinset := by
intro s hs
simp at hs
simp [hs.1]
rw [finsum_eq_sum_of_support_subset _ h₁G'] at decompose_int_G
have : s h₃f.toFinset, (h₁f.meromorphicOn.divisor s) * (x_1 : ) in (0)..(2 * π), log circleMap 0 R x_1 - s = s h₃f.toFinset, (h₁f.meromorphicOn.divisor s) * (2 * π) * log R := by
apply Finset.sum_congr rfl
intro s hs
have : s Metric.closedBall 0 R := by
let A := h₁f.meromorphicOn.divisor.supportInU
have : s Function.support h₁f.meromorphicOn.divisor := by
simp at hs
exact hs
exact A this
rw [int₄ hR this]
linarith
rw [this] at decompose_int_G
simp at decompose_int_G
rw [int_logAbs_f_eq_int_G]
rw [decompose_int_G]
let X := h₄F
nth_rw 1 [h₄F]
simp
have : π⁻¹ * 2⁻¹ * (2 * π) = 1 := by
calc π⁻¹ * 2⁻¹ * (2 * π)
_ = π⁻¹ * (2⁻¹ * 2) * π := by ring
_ = π⁻¹ * π := by ring
_ = (π⁻¹ * π) := by ring
_ = 1 := by
rw [inv_mul_cancel₀]
exact pi_ne_zero
--rw [this]
rw [log_mul]
rw [log_prod]
simp
rw [add_comm]
rw [mul_add]
rw [ mul_assoc (π⁻¹ * 2⁻¹), this]
simp
rw [add_comm]
nth_rw 2 [add_comm]
rw [add_assoc]
congr
rw [Finset.mul_sum]
rw [ sub_eq_add_neg]
rw [ Finset.sum_sub_distrib]
rw [Finset.sum_congr rfl]
intro s hs
rw [log_mul, log_inv]
rw [ mul_assoc (π⁻¹ * 2⁻¹)]
rw [mul_comm _ (2 * π)]
rw [ mul_assoc (π⁻¹ * 2⁻¹)]
rw [this]
simp
rw [mul_add]
ring
--
exact Ne.symm (ne_of_lt hR)
--
simp
by_contra hCon
rw [hCon] at hs
simp at hs
exact hs h'''₂f
--
intro s hs
apply zpow_ne_zero
simp
by_contra hCon
rw [hCon] at hs
simp at hs
exact hs h'''₂f
--
simp only [ne_eq, map_eq_zero]
rw [ ne_eq]
exact h₃F 0, (by simp; exact le_of_lt hR)
--
rw [Finset.prod_ne_zero_iff]
intro s hs
apply zpow_ne_zero
simp
by_contra hCon
rw [hCon] at hs
simp at hs
exact hs h'''₂f
theorem jensen
{R : }
(hR : 0 < R)
(f : )
(h₁f : MeromorphicOn f (Metric.closedBall 0 R))
(h₁f' : StronglyMeromorphicAt f 0)
(h₂f : f 0 0) :
log f 0 = - s, (h₁f.divisor s) * log (R * s⁻¹) + (2 * π)⁻¹ * (x : ) in (0)..(2 * π), log f (circleMap 0 R x) := by
let F := h₁f.makeStronglyMeromorphicOn
have : F 0 = f 0 := by
unfold F
have : 0 (Metric.closedBall 0 R) := by
simp [hR]
exact le_of_lt hR
unfold MeromorphicOn.makeStronglyMeromorphicOn
simp [this]
intro h₁R
let A := StronglyMeromorphicAt.makeStronglyMeromorphic_id h₁f'
simp_rw [A]
rw [ this]
rw [ this] at h₂f
clear this
have h₁F := stronglyMeromorphicOn_of_makeStronglyMeromorphicOn h₁f
rw [jensen₀ hR F h₁F h₂f]
rw [h₁f.divisor_of_makeStronglyMeromorphicOn]
congr 2
have {x : } : log F (circleMap 0 R x) = (fun z log F z) (circleMap 0 R x) := by
rfl
conv =>
left
arg 1
intro x
rw [this]
have {x : } : log f (circleMap 0 R x) = (fun z log f z) (circleMap 0 R x) := by
rfl
conv =>
right
arg 1
intro x
rw [this]
have h'R : R 0 := by exact Ne.symm (ne_of_lt hR)
have hU : Metric.sphere (0 : ) |R| (Metric.closedBall (0 : ) R) := by
have : R = |R| := by exact Eq.symm (abs_of_pos hR)
nth_rw 2 [this]
exact Metric.sphere_subset_closedBall
let A := integral_congr_changeDiscrete h'R hU (f₁ := fun z log F z) (f₂ := fun z log f z)
apply A
clear A
rw [Filter.eventuallyEq_iff_exists_mem]
have A := makeStronglyMeromorphicOn_changeDiscrete'' h₁f
rw [Filter.eventuallyEq_iff_exists_mem] at A
obtain s, h₁s, h₂s := A
use s
constructor
· exact h₁s
· intro x hx
let A := h₂s hx
simp
rw [A]

69
README.md Normal file
View File

@@ -0,0 +1,69 @@
# Project VD
### Formalizing Value Distribution Theory
This project aims to formalize [value distribution
theory](https://en.wikipedia.org/wiki/Value_distribution_theory_of_holomorphic_functions)
for meromorphic functions in the complex plane, roughly following Serge Lang's
[Introduction to Complex Hyperbolic
Spaces](https://link.springer.com/book/10.1007/978-1-4757-1945-1). The project
uses the [Lean](https://lean-lang.org/) theorem prover and builds on
[mathlib](https://leanprover-community.github.io/), the Lean mathematical
library.
### Help Wanted
Please be in touch if you would like to join
the fun!
## Current State and Future Plans
With the formalization of Nevanlinna's [First Main
Theorem](https://en.wikipedia.org/wiki/Nevanlinna_theory#First_fundamental_theorem),
the project has recently reached its first milestone. The current code has
"proof of concept" quality: It compiles fine but needs refactoring and
documentation. Next goals:
- Clean up the existing codebase and feed intermediate results into mathlib
- Formalize the Theorem on Logarithmic Differentials
- Formalize the [Second Main
Theorem](https://en.wikipedia.org/wiki/Nevanlinna_theory#Second_fundamental_theorem)
- Establish some of the more immediate applications
These plans might change, depending on feedback from the community and specific
interests of project participants.
## Material Covered
The following concepts have been formalized so far.
- Harmonic functions in the complex plane
- Laplace operator and associated API
- Definition and elementary properties of harmonic functions
- Mean value properties of harmonic functions
- Real and imaginary parts of holomorphic functions as examples of harmonic
functions
- Holomorphic functions in the complex plane
- Existence of primitives [duplication of work [already under
review](https://github.com/leanprover-community/mathlib4/pull/9598) at
mathlib]
- Existence of holomorphic functions with given real part
- Meromorphic Functions in the complex plane
- API for continuous extension of meromorphic functions, normal form of
meromorphic functions up to changes along a discrete set
- Behavior of pole/zero orders under standard operations
- Zero/pole divisors attached to meromorphic functions and associated API
- Extraction of zeros and poles
- Integrals and integrability of special functions
- Interval integrals and integrability of the logarithm and its combinations
with trigonometric functions; circle integrability of log ‖z-a‖
- Circle integrability of log ‖meromorphic‖
- Basic functions of Value Distribution Theory
- The positive part of the logarithm, API, standard inequalities and
estimates
- Logarithmic counting functions of divisors
- Nevanlinna heights of entire meromorphic functions
- Proximity functions for entire meromorphic functions
- [Jensen's formula](https://en.wikipedia.org/wiki/Jensen%27s_formula)
- Nevanlinna's [First Main
Theorem](https://en.wikipedia.org/wiki/Nevanlinna_theory#First_fundamental_theorem)

View File

@@ -1,52 +1,32 @@
{"version": "1.1.0",
"packagesDir": ".lake/packages",
"packages":
[{"url": "https://github.com/leanprover-community/batteries",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "41bc768e2224d6c75128a877f1d6e198859b3178",
"name": "batteries",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover-community/quote4",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "01ad33937acd996ee99eb74eefb39845e4e4b9f5",
"name": "Qq",
"manifestFile": "lake-manifest.json",
"inputRev": "master",
"inherited": true,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover-community/aesop",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "6058ab8d938c5104eace7d0fb5ac17b21cb067b1",
"name": "aesop",
"manifestFile": "lake-manifest.json",
"inputRev": "master",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/ProofWidgets4",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "c87908619cccadda23f71262e6898b9893bffa36",
"name": "proofwidgets",
"manifestFile": "lake-manifest.json",
"inputRev": "v0.0.40",
"inherited": true,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover/lean4-cli",
[{"url": "https://github.com/leanprover-community/mathlib4.git",
"type": "git",
"subDir": null,
"scope": "",
"rev": "2cf1030dc2ae6b3632c84a09350b675ef3e347d0",
"name": "Cli",
"rev": "0571c82877b7c2b508cbc9a39e041eb117d050b7",
"name": "mathlib",
"manifestFile": "lake-manifest.json",
"inputRev": null,
"inherited": false,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover-community/plausible",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "8e5cb8d424df462f84997dd68af6f40e347c3e35",
"name": "plausible",
"manifestFile": "lake-manifest.json",
"inputRev": "v4.15.0-rc1",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/LeanSearchClient",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "003ff459cdd85de551f4dcf95cdfeefe10f20531",
"name": "LeanSearchClient",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
@@ -55,21 +35,61 @@
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "e7e90d90a62e6d12cbb27cbbfc31c094ee4ecc58",
"rev": "ed3b856bd8893ade75cafe13e8544d4c2660f377",
"name": "importGraph",
"manifestFile": "lake-manifest.json",
"inputRev": "v4.15.0-rc1",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/ProofWidgets4",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "2b000e02d50394af68cfb4770a291113d94801b5",
"name": "proofwidgets",
"manifestFile": "lake-manifest.json",
"inputRev": "v0.0.48",
"inherited": true,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover-community/aesop",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "a4a08d92be3de00def5298059bf707c72dfd3c66",
"name": "aesop",
"manifestFile": "lake-manifest.json",
"inputRev": "master",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/quote4",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "ad942fdf0b15c38bface6acbb01d63855a2519ac",
"name": "Qq",
"manifestFile": "lake-manifest.json",
"inputRev": "v4.14.0",
"inherited": true,
"configFile": "lakefile.lean"},
{"url": "https://github.com/leanprover-community/batteries",
"type": "git",
"subDir": null,
"scope": "leanprover-community",
"rev": "f007bfe46ea8fb801ec907df9ab540054abcc5fd",
"name": "batteries",
"manifestFile": "lake-manifest.json",
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.toml"},
{"url": "https://github.com/leanprover-community/mathlib4.git",
{"url": "https://github.com/leanprover/lean4-cli",
"type": "git",
"subDir": null,
"scope": "",
"rev": "d56e389960165aa122e7c97c098d67e4def09470",
"name": "mathlib",
"scope": "leanprover",
"rev": "0c8ea32a15a4f74143e4e1e107ba2c412adb90fd",
"name": "Cli",
"manifestFile": "lake-manifest.json",
"inputRev": null,
"inherited": false,
"configFile": "lakefile.lean"}],
"inputRev": "main",
"inherited": true,
"configFile": "lakefile.toml"}],
"name": "nevanlinna",
"lakeDir": ".lake"}

View File

@@ -1 +1 @@
leanprover/lean4:v4.10.0
leanprover/lean4:v4.15.0-rc1