Hahn embedding theorem on ordered modules #
This file proves a variant of the Hahn embedding theorem:
For a linearly ordered module M
over an Archimedean division ring K
,
there exists a strictly monotone linear map to lexicographically ordered
HahnSeries (FiniteArchimedeanClass M) R
with an archimedean K
-module R
,
as long as there are embeddings from a certain family of Archimedean submodules to R
.
The family of Archimedean submodules HahnEmbedding.ArchimedeanStrata K M
is indexed by
(c : ArchimedeanClass M)
, and each submodule is a complement of ArchimedeanClass.ball K c
under ArchimedeanClass.closedBall K c
. The embeddings from these submodules are specified by
HahnEmbedding.Seed K M R
.
By setting K = ℚ
and R = ℝ
, the condition can be trivially satisfied, leading
to a proof of the classic Hahn embedding theorem. (TODO: implement this)
Main theorem #
hahnEmbedding_isOrderedModule
: there exists a strictly monotoneM →ₗ[K] Lex (HahnSeries (FiniteArchimedeanClass M) R)
that mapsArchimedeanClass M
toHahnSeries.orderTop
in the expected way, as long asHahnEmbedding.Seed K M R
is nonempty.
References #
Step 1: base embedding #
We start with HahnEmbedding.ArchimedeanStrata
that gives a family of Archimedean submodules,
and a "seed" HahnEmbedding.Seed
that specifies how to embed each
HahnEmbedding.ArchimedeanStrata.stratum
into R
.
From these, we create a partial map from the direct sum of all stratum
to HahnSeries Γ R
.
If ArchimedeanClass M
is finite, the direct sum is the entire M
and we are done
(though we don't handle this case separately). Otherwise, we will extend the map to M
in the
following steps.
A family of submodules indexed by ArchimedeanClass M
that
are complements between ArchimedeanClass.ball
and ArchimedeanClass.closedBall
.
- stratum : ArchimedeanClass M → Submodule K M
For each
ArchimedeanClass
, specify a corresponding submodule. - disjoint_ball_stratum (c : ArchimedeanClass M) : Disjoint (ArchimedeanClass.ball K c) (self.stratum c)
stratum
andArchimedeanClass.ball
are disjoint. - ball_sup_stratum_eq (c : ArchimedeanClass M) : ArchimedeanClass.ball K c ⊔ self.stratum c = ArchimedeanClass.closedBall K c
stratum
andArchimedeanClass.ball
are codisjoint underArchimedeanClass.closedBall
.
Instances For
The minimal submodule that contains all strata.
This is the domain of our "base" embedding into Hahn series, which we will extend into a full embedding.
Equations
- u.baseDomain = ⨆ (c : ArchimedeanClass M), u.stratum c
Instances For
ArchimedeanStrata.stratum
as a submodule of
ArchimedeanStrata.baseDomain
.
Equations
- u.stratum' c = Submodule.comap u.baseDomain.subtype (u.stratum c)
Instances For
HahnEmbedding.Seed
extends HahnEmbedding.ArchimedeanStrata
by specifying strictly monotone
linear maps from each stratum
to module R
.
- stratum : ArchimedeanClass M → Submodule K M
- disjoint_ball_stratum (c : ArchimedeanClass M) : Disjoint (ArchimedeanClass.ball K c) (self.stratum c)
- ball_sup_stratum_eq (c : ArchimedeanClass M) : ArchimedeanClass.ball K c ⊔ self.stratum c = ArchimedeanClass.closedBall K c
For each stratum, specify a linear map to
R
as the Hahn series coefficient.- strictMono_coeff (c : ArchimedeanClass M) : StrictMono ⇑(self.coeff c)
coeff
is strictly monotone.
Instances For
HahnEmbedding.Seed.coeff
with ArchimedeanStrata.stratum'
as domain.
Equations
- seed.coeff' c = seed.coeff c ∘ₗ seed.baseDomain.subtype.submoduleComap (seed.stratum c)
Instances For
Coefficients of Hahn series for each baseDomain
element.
Equations
- seed.hahnCoeff = DirectSum.lmap seed.coeff' ∘ₗ ↑(DirectSum.decomposeLinearEquiv seed.stratum')
Instances For
Combining all HahnEmbedding.Seed.coeff
as
a partial linear map from HahnEmbedding.Seed.baseDomain
to HahnSeries
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Step 2: characterize partial embedding #
We characterize the base embedding as a member of a class of partial linear embeddings
HahnEmbedding.Partial
. These embeddings share nice properties, including being strictly monotone,
transferring ArchimedeanClass
to HahnEmbedding.orderTop
, and being "truncation-closed"
(see HahnEmbedding.IsPartial.truncLT_mem_range
).
A partial linear map is called a "partial Hahn embedding" if it extends
HahnEmbedding.Seed.baseEmbedding
, is strictly monotone, and is truncation-closed.
- strictMono : StrictMono ↑f
A partial Hahn embedding is strictly monotone.
A partial Hahn embedding always extends
baseEmbedding
.- truncLT_mem_range (x : ↥f.domain) (c : FiniteArchimedeanClass M) : toLex ((HahnSeries.truncLTLinearMap K c) (ofLex (↑f x))) ∈ LinearMap.range f.toFun
If a Hahn series $f$ is in the range, then any truncation of $f$ is also in the range.
Instances For
HahnEmbedding.Seed.baseEmbedding
is a partial Hahn embedding.
The type of all partial Hahn embeddings.
Equations
- HahnEmbedding.Partial seed = { f : M →ₗ.[K] Lex (HahnSeries (FiniteArchimedeanClass M) R) // HahnEmbedding.IsPartial seed f }
Instances For
Equations
- HahnEmbedding.Partial.instInhabitedOfIsOrderedAddMonoid = { default := ⟨seed.baseEmbedding, ⋯⟩ }
HahnEmbedding.Partial
as an OrderedAddMonoidHom
.
Equations
Instances For
Archimedean equivalence is preserved by f
.
Archimedean equivalence of input is transferred to HahnSeries.orderTop
equality.
Archimedean class of the input is transferred to HahnSeries.orderTop
.
For x
within a ball of Archimedean class c
, f.val x
'coefficient at d
vanishes
for d ≤ c
.
f.val x
has a non-zero coefficient at the position of the Archimedean class of x
.
When y
and z
are both near x
(the difference is in a ball),
initial coefficients of f.val y
and f.val z
agree.
Step 3: extend the embedding #
We create a larger HahnEmbedding.Partial
from an existing one by adding a new element to the
domain and assigning an appropriate output that preserves all HahnEmbedding.Partial
's properties.
Evaluate coefficients of the HahnSeries
given an arbitrary input that's not necessarily in
f
's domain. The coefficient is picked from y
that is "close enough" to x
(their difference
is in a higher ArchimedeanClass
). If no such y
exists (in other words, x is "isolated"), set the
coefficient to 0.
This doesn't immediately extend f
's domain to the entire module in a consistent way. Such
extension isn't necessarily linear.
Equations
Instances For
The coefficient is well-defined regardless of which y
we pick in evalCoeff
.
Promote HahnEmbedding.Partial.evalCoeff
's output to a new HahnSeries
.
Instances For
If f.eval x = f.val y
, then for any z
in the domain, x - z
can't be closer than x - y
in terms of Archimedean classes.
If x
isn't in f
's domain, f.eval x
produces a brand new value not in f
's range.
If there is a y
in f
's domain with c = ArchimedeanClass (y - x)
, but there
is no closer z
to x
where the difference is of a higher ArchimedeanClass
, then
f.eval x
is simply f.val y
truncated at c
.
This doesn't mean every x
can be evaluated this way: it is possible that one can find
an infinite chain of y
that keeps getting closer to x
in terms of Archimedean classes,
yet x
is still isolated within a very high Archimedean class. In fact, in the next theorem,
we will show that there is always such chain for x
not in f
's domain.
For x
not in f
's domain, there is an infinite chain of y
from f
's domain
that keeps getting closer to x
in terms of Archimedean classes.
For x
not in f
's domain, f.eval x
is consistent with f
's monotonicity.
Extend f
to a larger partial linear map by adding a new x
.
Equations
- f.extendFun hx = (↑f).supSpanSingleton x (f.eval x) hx
Instances For
Promote HahnEmbedding.Partial.extendFun
to a new HahnEmbedding.Partial
.
Instances For
Step 4: use Zorn's lemma #
We show that sSup
makes sense on HahnEmbedding.Partial
, which allows us to use Zorn's lemma
to assert the existence of maximal embedding. Since we already show that we can create greater
embeddings by adding new elements, the maximal embedding must have the maximal domain.
A partial linear map that contains every element in a directed set of
HahnEmbedding.Partial
.
Equations
- HahnEmbedding.Partial.sSupFun hc = LinearPMap.sSup ((fun (x : HahnEmbedding.Partial seed) => ↑x) '' c) ⋯
Instances For
Promote HahnEmbedding.Partial.sSupFun
to a HahnEmbedding.Partial
.
Equations
- HahnEmbedding.Partial.sSup hnonempty hc = ⟨HahnEmbedding.Partial.sSupFun hc, ⋯⟩
Instances For
There exists a HahnEmbedding.Partial
whose domain is the whole module.
Hahn embedding theorem for an ordered module
There exists a strictly monotone M →ₗ[K] Lex (HahnSeries (FiniteArchimedeanClass M) R)
that maps
ArchimedeanClass M
to HahnSeries.orderTop
in the expected way, as long as
HahnEmbedding.Seed K M R
is nonempty. The HahnEmbedding.Partial
with maximal domain is the
desired embedding.