Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[Merged by Bors] - feat(measure_theory/group/geometry_of_numbers): Blichfeldt and Minkowski's theorems #2819

Closed
wants to merge 189 commits into from
Closed
Changes from 172 commits
Commits
Show all changes
189 commits
Select commit Hold shift + click to select a range
b7a3d73
initial go at minkowski
alexjbest May 25, 2020
b7cf41a
not needed?
alexjbest May 25, 2020
018e2f6
Delete probability_theory.lean
alexjbest Nov 1, 2020
1e73c64
Delete prod_measure.lean
alexjbest Nov 1, 2020
5ba26c7
Update geometry_of_numbers.lean
alexjbest Nov 1, 2020
df6010a
Merge branch 'master' of https://github.com/leanprover-community/math…
alexjbest Apr 16, 2021
243934e
get compiling?
alexjbest Apr 17, 2021
8879baf
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 6, 2021
10e7d70
refresh
alexjbest Aug 6, 2021
5881e56
another lil improvement
alexjbest Aug 6, 2021
840421a
cleanup
alexjbest Aug 7, 2021
ec27266
lint
alexjbest Aug 7, 2021
fbda453
more tidying
alexjbest Aug 7, 2021
032c749
sorry gone
alexjbest Aug 7, 2021
a946c4c
more explicit sorries
alexjbest Aug 7, 2021
9c2f31f
add copy
alexjbest Aug 7, 2021
6bfb984
more tidying
alexjbest Aug 7, 2021
72d3652
one less sorry!
alexjbest Aug 8, 2021
e761f16
no more sorries
alexjbest Aug 8, 2021
39d0e3a
no need to import tactic
alexjbest Aug 8, 2021
400c091
cleanup
alexjbest Aug 8, 2021
1746771
more tidying, and universe issues
alexjbest Aug 9, 2021
fc7697c
generalize
alexjbest Aug 9, 2021
cb11bb3
fix proof
alexjbest Aug 9, 2021
7db97eb
linting and cleaning
alexjbest Aug 9, 2021
4290ed7
reducing imports
alexjbest Aug 9, 2021
e3f5b80
no specific references were followed
alexjbest Aug 9, 2021
e7bcca9
lemmas on smul of intervals
alexjbest Aug 9, 2021
cfd9eac
Merge branch 'alexjbest/smul_interval' of github.com:leanprover-commu…
alexjbest Aug 9, 2021
51524c2
base off smul_interval
alexjbest Aug 9, 2021
d2f6413
module doc
alexjbest Aug 9, 2021
990f334
Merge branch 'alexjbest/smul_interval' of github.com:leanprover-commu…
alexjbest Aug 9, 2021
eabf1d3
randomly generalise some stuff
alexjbest Aug 9, 2021
3357924
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 9, 2021
745f82a
long lines
alexjbest Aug 9, 2021
82f058d
add preimage_smul and generalize
alexjbest Aug 10, 2021
0590d6d
reorganize and add doc
alexjbest Aug 10, 2021
b9fe65a
Merge branch 'alexjbest/preimage_smul' of github.com:leanprover-commu…
alexjbest Aug 10, 2021
45608a5
update
alexjbest Aug 10, 2021
021e1ad
Update src/algebra/pointwise.lean
alexjbest Aug 10, 2021
d29b1eb
Update src/algebra/pointwise.lean
alexjbest Aug 10, 2021
ecaeb00
more generalization and cleanup
alexjbest Aug 10, 2021
fc36340
more cleanup
alexjbest Aug 10, 2021
841c815
generalize and reorganize
alexjbest Aug 10, 2021
c88aa4f
refactor to generalise
alexjbest Aug 10, 2021
00ad99e
generalise pi type
alexjbest Aug 10, 2021
26845cc
add smul_add_smul
alexjbest Aug 10, 2021
58b4e58
line
alexjbest Aug 10, 2021
a4596e4
Merge branch 'alexjbest/smul_set_add' of github.com:leanprover-commun…
alexjbest Aug 10, 2021
bfb818c
base off smul_set_add
alexjbest Aug 10, 2021
7e7b32b
remove extra fiel
alexjbest Aug 10, 2021
8e1fda5
Update src/algebra/pointwise.lean
alexjbest Aug 10, 2021
81d2de8
Update src/algebra/pointwise.lean
alexjbest Aug 10, 2021
c5929d3
eric's suggestions
alexjbest Aug 10, 2021
9ce1f79
Merge branch 'alexjbest/preimage_smul' of github.com:leanprover-commu…
alexjbest Aug 10, 2021
cff5427
Update src/algebra/pointwise.lean
alexjbest Aug 10, 2021
e576cb5
generalise to le
alexjbest Aug 10, 2021
e4b81db
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 10, 2021
f55699e
reflow
alexjbest Aug 10, 2021
455155d
Merge branch 'alexjbest/smul_set_add' of github.com:leanprover-commun…
alexjbest Aug 10, 2021
10cd674
Merge branch 'alexjbest/preimage_smul' of github.com:leanprover-commu…
alexjbest Aug 10, 2021
2c2f905
Update src/analysis/convex/basic.lean
alexjbest Aug 11, 2021
eb9f1ea
flip proof
alexjbest Aug 11, 2021
6bb1dd4
more generalization
alexjbest Aug 11, 2021
c5c0d79
Merge branch 'alexjbest/smul_set_add' of github.com:leanprover-commun…
alexjbest Aug 11, 2021
d97854a
adjust upstream
alexjbest Aug 11, 2021
fc19e38
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 11, 2021
46c2873
interior_pi
alexjbest Aug 12, 2021
aca5e8b
break out general part
alexjbest Aug 12, 2021
56cba8c
Merge branch 'interior_pi' of github.com:leanprover-community/mathlib…
alexjbest Aug 12, 2021
ca86ca7
fix
alexjbest Aug 12, 2021
d726584
Merge branch 'interior_pi' of github.com:leanprover-community/mathlib…
alexjbest Aug 12, 2021
d5e1d2a
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 13, 2021
b359cdc
update to match interior_pi
alexjbest Aug 13, 2021
81707e3
feat(topology): interior of a finite product of sets
PatrickMassot Aug 15, 2021
95b5cbb
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 16, 2021
f989ced
remove upstream lemmas
alexjbest Aug 16, 2021
2715570
8 variants of supr_dite
jcommelin Aug 21, 2021
57caea4
Merge branch 'master' into minkowski
alexjbest Aug 22, 2021
750560e
Revert "Merge branch 'interior_pi' of github.com:leanprover-community…
alexjbest Aug 22, 2021
ce65931
Revert "Merge branch 'interior_pi' of github.com:leanprover-community…
alexjbest Aug 22, 2021
ba504dd
Merge branch 'interior_pi_bis' of github.com:leanprover-community/mat…
alexjbest Aug 22, 2021
8bb3e39
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 26, 2021
2497219
fixup
alexjbest Aug 26, 2021
41475aa
attempt to to_additive set smul
alexjbest Aug 26, 2021
f03a20b
Merge branch 'alexjbest/set_has_vadd' of github.com:leanprover-commun…
alexjbest Aug 26, 2021
d25a68f
checkpoint
alexjbest Aug 26, 2021
6039187
checkpoint again
alexjbest Aug 30, 2021
f71d3ca
gen
alexjbest Aug 30, 2021
008390b
mul version
alexjbest Aug 30, 2021
e3a71db
small tidy
alexjbest Aug 30, 2021
ff39d42
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 30, 2021
796f3fc
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Aug 30, 2021
8c52b2c
what is happening
alexjbest Aug 30, 2021
351ad8c
working away
alexjbest Sep 5, 2021
37b4527
enable pointwise add_action
alexjbest Sep 5, 2021
cf384e3
Merge branch 'alexjbest/pointwise_add_action' into minkowski
alexjbest Sep 5, 2021
3a0d2ad
tweaks
alexjbest Sep 5, 2021
b54de9c
checkpoint
alexjbest Sep 5, 2021
0b57dbe
no need for new line
alexjbest Sep 5, 2021
d2c2789
Merge branch 'alexjbest/pointwise_add_action' into minkowski
alexjbest Sep 5, 2021
aa3023d
reduce dependence on a subgroup and finish generalizing fundamental d…
alexjbest Sep 5, 2021
05036b1
compiling again, refactored in terms of measurable actions better, ra…
alexjbest Sep 6, 2021
1f8d108
feat(algebra): add more to_additive attributes for actions
alexjbest Sep 6, 2021
d30d470
Merge branch 'alexjbest/more-to_additive-for-actions' into minkowski
alexjbest Sep 6, 2021
ea103ac
golf
alexjbest Sep 6, 2021
5da3573
get compiling
alexjbest Sep 6, 2021
7fbcbbb
checkpoint
alexjbest Sep 6, 2021
e35c427
port other defs too
alexjbest Sep 6, 2021
6ababd3
docs
alexjbest Sep 6, 2021
bd0f704
remove lint
alexjbest Sep 6, 2021
208205e
Merge branch 'alexjbest/more-to_additive-for-actions' into minkowski
alexjbest Sep 6, 2021
988261b
longlines and vrachy
alexjbest Sep 6, 2021
0553a86
fixup haar to_additive was failing as now too additive learned too ma…
alexjbest Sep 7, 2021
90a0053
Merge branch 'alexjbest/more-to_additive-for-actions' into minkowski
alexjbest Sep 7, 2021
4e94ea0
golfing and cleanup
alexjbest Sep 7, 2021
9a1e266
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Sep 14, 2021
fec634d
lemma already in mathlib
alexjbest Sep 20, 2021
be153fc
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Sep 24, 2021
5e6968f
update to upstream
alexjbest Sep 24, 2021
74941c1
another mini generaliztion
alexjbest Sep 24, 2021
dafa159
Merge branch 'master' of https://github.com/leanprover-community/math…
alexjbest Sep 27, 2021
21907f1
some cleanup and update to upstream
alexjbest Sep 27, 2021
f21ed6e
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Nov 19, 2021
576cd6e
refresh branch
alexjbest Nov 19, 2021
9cecc2f
add an extra random lemma
alexjbest Nov 19, 2021
1e50882
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Jan 19, 2022
cef2af7
allmost sorry free again
alexjbest Feb 7, 2022
6d272f1
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Feb 7, 2022
66e54d4
actually sorry free
alexjbest Feb 7, 2022
d323051
lemmaify
alexjbest Feb 12, 2022
b49622d
style
alexjbest Feb 21, 2022
739f546
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Feb 21, 2022
b222f53
fix
alexjbest Feb 21, 2022
234ae7b
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Jul 13, 2022
2734c62
bump, golf
YaelDillies Jul 13, 2022
a092a0e
change comap def
RemyDegenne Jul 14, 2022
9c21759
lint
RemyDegenne Jul 14, 2022
fab4225
null_measurable_set transported to null_measurable_set
RemyDegenne Jul 28, 2022
6cd714e
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Sep 7, 2022
8327074
extract sorries
alexjbest Sep 7, 2022
97e1bba
Merge branch 'minkowski' of github.com:leanprover-community/mathlib i…
alexjbest Sep 7, 2022
4ad09b8
golf a bit
alexjbest Sep 8, 2022
bb9d343
simplify and generalize
RemyDegenne Sep 11, 2022
e7f70ec
Merge remote-tracking branch 'origin/master' into RD_comap
RemyDegenne Sep 11, 2022
828a61a
remove duplicate
RemyDegenne Sep 11, 2022
afd99c4
fix
RemyDegenne Sep 11, 2022
c920529
generalize to non-measurable sets
alexjbest Sep 29, 2022
6ff2268
Merge branch 'master' of https://github.com/leanprover-community/math…
alexjbest Sep 29, 2022
b48b672
little cleanup
alexjbest Sep 29, 2022
113dd69
ready for review
RemyDegenne Oct 2, 2022
d39f765
minor
RemyDegenne Oct 2, 2022
56389cd
sorry free but ugly
alexjbest Oct 5, 2022
a93c705
fix doc
alexjbest Oct 5, 2022
b2bbadf
Merge remote-tracking branch 'origin/RD_comap' into minkowski
alexjbest Oct 5, 2022
03cc794
Merge branch 'master' of https://github.com/leanprover-community/math…
alexjbest Oct 5, 2022
397a955
Merge branches 'RD_comap' and 'master' of https://github.com/leanprov…
alexjbest Oct 5, 2022
3b307b6
fix after master update
alexjbest Oct 5, 2022
5078e71
Merge remote-tracking branch 'origin/RD_comap' into minkowski
alexjbest Oct 5, 2022
c4d7315
Merge branch 'master' of github.com:leanprover-community/mathlib into…
alexjbest Oct 16, 2022
9a318f2
cleanup
alexjbest Oct 16, 2022
4a6d4a6
more cleanup
alexjbest Oct 16, 2022
02c43a3
encodable-> countable
alexjbest Oct 16, 2022
8a4f167
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Nov 12, 2022
a70fb89
bump
YaelDillies Nov 12, 2022
ae9b46b
bump, golf
YaelDillies Nov 13, 2022
46024a4
dubious to_additive
YaelDillies Nov 13, 2022
9b29424
golf further
YaelDillies Nov 13, 2022
1a4f5fc
golf more
YaelDillies Nov 14, 2022
48f9796
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Nov 17, 2022
13afbe1
bump
YaelDillies Nov 17, 2022
0392647
move under measure_theory
YaelDillies Nov 17, 2022
f9fd8cb
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Nov 30, 2022
5c46d5e
bump
YaelDillies Nov 30, 2022
394c593
subgroup.equiv_map
YaelDillies Nov 30, 2022
f080138
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Nov 30, 2022
c9df723
bump
YaelDillies Nov 30, 2022
8718e0e
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Nov 30, 2022
3b157f0
break long line
YaelDillies Dec 1, 2022
87d36f3
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Dec 16, 2022
364aa56
Merge remote-tracking branch 'origin/master' into minkowski
YaelDillies Jan 13, 2023
289258c
bump
YaelDillies Jan 13, 2023
0d5281d
Merge branch 'master' of https://github.com/leanprover-community/math…
xroblot Mar 30, 2023
09ca80e
new proofs
xroblot Mar 30, 2023
d272f38
Small changes
xroblot Mar 30, 2023
27e376a
Removed hypothesis
xroblot Mar 30, 2023
d2d19d2
golf
YaelDillies Mar 31, 2023
4142301
generalise null_measurable_set.const_smul
YaelDillies Mar 31, 2023
49564b8
bibliography
YaelDillies Mar 31, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
285 changes: 285 additions & 0 deletions src/measure_theory/group/geometry_of_numbers.lean
@@ -0,0 +1,285 @@
/-
Copyright (c) 2021 Alex J. Best. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alex J. Best
-/
import algebra.module.pi
import algebra.module.pointwise_pi
import analysis.convex.measure
import measure_theory.group.fundamental_domain

/-!
# Geometry of numbers

In this file we prove some of the fundamental theorems in the geometry of numbers, as studied by
Hermann Minkowski.
YaelDillies marked this conversation as resolved.
Show resolved Hide resolved

## Main results

- `exists_sub_mem_lattice_of_volume_lt_volume`: Blichfeldt's principle, existence of two points
xroblot marked this conversation as resolved.
Show resolved Hide resolved
within a set whose difference lies in a subgroup when the covolume of the subgroup is larger than
the set.
- `exists_nonzero_mem_lattice_of_volume_mul_two_pow_card_lt_measure`: Minkowski's theorem, existence
of a non-zero lattice point inside a convex symmetric domain of large enough covolume.

## TODO

* A finite index subgroup has given fundamental domain and covolume
* Some existence result in a metric space
* Voronoi

See https://arxiv.org/pdf/1405.2119.pdf for some more ideas.
xroblot marked this conversation as resolved.
Show resolved Hide resolved
-/

@[simp, to_additive]
lemma subgroup.coe_equiv_map_of_injective_symm_apply {G H : Type*} [group G] [group H] (e : G ≃* H)
{L : subgroup G} {g : L.map (e : G →* H)} {hh} :
(((L.equiv_map_of_injective _ hh).symm g) : G) = e.symm g :=
begin
rcases g with ⟨-, h, h_prop, rfl⟩,
rw [subtype.coe_mk, subtype.coe_eq_iff],
refine ⟨_, _⟩,
{ simpa only [monoid_hom.coe_coe, mul_equiv.symm_apply_apply] },
erw [mul_equiv.symm_apply_eq, subtype.ext_iff, subgroup.coe_equiv_map_of_injective_apply,
subtype.coe_mk, mul_equiv.apply_symm_apply],
end

namespace linear_equiv
variables {𝕜 α β : Type*} [semiring 𝕜] [add_comm_monoid α] [add_comm_monoid β] [module 𝕜 α]
[module 𝕜 β]

@[simp] lemma symm_comp_self (e : α ≃ₗ[𝕜] β) : e.symm ∘ e = id := e.to_equiv.symm_comp_self
@[simp] lemma self_comp_symm (e : α ≃ₗ[𝕜] β) : e ∘ e.symm = id := e.to_equiv.self_comp_symm

end linear_equiv

namespace measure_theory
open finite_dimensional fintype function measure set topological_space
open_locale pointwise

namespace measure
variables {E : Type*} [normed_add_comm_group E] [measurable_space E] [normed_space ℝ E]
[finite_dimensional ℝ E] [borel_space E] (μ : measure_theory.measure E) [is_add_haar_measure μ]

lemma add_haar_smul_of_nonneg {r : ℝ} (hr : 0 ≤ r) (s : set E) :
μ (r • s) = ennreal.of_real (r ^ finrank ℝ E) * μ s :=
by rw [add_haar_smul, abs_pow, abs_of_nonneg hr]

end measure

section
variables {𝕜 G H : Type*} [nontrivially_normed_field 𝕜] [complete_space 𝕜] [measurable_space G]
[topological_space G] [add_comm_group G] [module 𝕜 G] [finite_dimensional 𝕜 G]
[has_continuous_smul 𝕜 G] (μ : measure G) [is_add_haar_measure μ] [borel_space G] [t2_space G]
[topological_add_group G] [topological_space H] [add_comm_group H] [module 𝕜 H]
[finite_dimensional 𝕜 H] [has_continuous_smul 𝕜 H] [measurable_space H] [borel_space H]
[t2_space H] [topological_add_group H]

instance (e : G ≃ₗ[𝕜] H) : is_add_haar_measure (μ.map e) :=
e.to_add_equiv.is_add_haar_measure_map _ (e : G →ₗ[𝕜] H).continuous_of_finite_dimensional
(e.symm : H →ₗ[𝕜] G).continuous_of_finite_dimensional

end

section
variables {α G V : Type*} [measurable_space G] [measurable_space α] {μ : measure G}

@[to_additive]
instance is_mul_left_invariant.to_smul_invariant_measure [has_mul G] [has_measurable_mul G]
[μ.is_mul_left_invariant] : smul_invariant_measure G G μ :=
⟨λ g s hs, by simp_rw [smul_eq_mul, ←map_apply (measurable_const_mul g) hs, map_mul_left_eq_self]⟩
open smul_invariant_measure

variables [group G]

@[to_additive] instance subgroup.smul_invariant_measure [has_measurable_mul G]
[μ.is_mul_left_invariant] {Γ : subgroup G} : smul_invariant_measure Γ G μ :=
⟨λ c s hs, measure_preimage_mul μ _ s⟩

@[to_additive] instance subgroup.smul_invariant_measure_op [has_measurable_mul G]
[μ.is_mul_right_invariant] {Γ : subgroup G} : smul_invariant_measure Γ.opposite G μ :=
⟨λ c s hs, measure_preimage_mul_right μ _ s⟩

end

lemma rescale (ι : Type*) [fintype ι] {r : ℝ} (hr : 0 < r) :
comap ((•) r) (volume : measure (ι → ℝ)) = ennreal.of_real r ^ card ι • volume :=
begin
suffices : (ennreal.of_real r ^ card ι)⁻¹ • comap ((•) r) (volume : measure (ι → ℝ)) = volume,
{ conv_rhs { rw ←this },
rw [ennreal.inv_pow, smul_smul, ←mul_pow, ennreal.mul_inv_cancel (ennreal.of_real_pos.2 hr).ne'
ennreal.of_real_ne_top, one_pow, one_smul] },
refine (pi_eq $ λ s hS, _).symm,
simp only [smul_eq_mul, measure.coe_smul, pi.smul_apply],
rw [comap_apply _ (smul_right_injective (ι → ℝ) hr.ne') (λ S hS, hS.const_smul₀ r) _
(measurable_set.univ_pi hS), image_smul, smul_univ_pi, volume_pi_pi],
simp only [add_haar_smul, finite_dimensional.finrank_self, pow_one, abs_of_pos hr, pi.smul_apply,
finset.prod_mul_distrib, finset.card_univ, ←mul_assoc, finset.prod_const],
rw [ennreal.inv_mul_cancel _ (ennreal.pow_ne_top ennreal.of_real_ne_top), one_mul],
positivity,
end
xroblot marked this conversation as resolved.
Show resolved Hide resolved

namespace is_fundamental_domain
variables {G H α β E : Type*} [group G] [group H]
[mul_action G α] [measurable_space α]
[mul_action H β] [measurable_space β]
[normed_add_comm_group E] {s t : set α} {μ : measure α} {ν : measure β}

@[to_additive measure_theory.is_add_fundamental_domain.preimage_of_equiv']
lemma preimage_of_equiv' [measurable_space H]
[has_measurable_smul H β] [smul_invariant_measure H β ν]
{s : set β} (h : is_fundamental_domain H s ν) {f : α → β}
(hf : quasi_measure_preserving f μ ν) {e : H → G} (he : bijective e)
(hef : ∀ g, semiconj f ((•) (e g)) ((•) g)) :
is_fundamental_domain G (f ⁻¹' s) μ :=
{ null_measurable_set := h.null_measurable_set.preimage hf,
ae_covers := (hf.ae h.ae_covers).mono $ λ x ⟨g, hg⟩, ⟨e g, by rwa [mem_preimage, hef g x]⟩,
ae_disjoint := λ g hg,
begin
lift e to H ≃ G using he,
have : (e.symm g⁻¹)⁻¹ ≠ (e.symm 1)⁻¹, by simp [hg],
convert (h.pairwise_ae_disjoint this).preimage hf using 1,
{ simp only [←preimage_smul_inv, preimage_preimage, ←hef _ _, e.apply_symm_apply, inv_inv] },
{ ext1 x,
simp only [mem_preimage, ←preimage_smul, ←hef _ _, e.apply_symm_apply, one_smul] }
end }

@[to_additive measure_theory.is_add_fundamental_domain.image_of_equiv']
lemma image_of_equiv' [measurable_space G] [has_measurable_smul G α] [smul_invariant_measure G α μ]
(h : is_fundamental_domain G s μ)
(f : α ≃ β) (hf : quasi_measure_preserving f.symm ν μ)
(e : H ≃ G) (hef : ∀ g, semiconj f ((•) (e g)) ((•) g)) :
is_fundamental_domain H (f '' s) ν :=
begin
rw f.image_eq_preimage,
refine h.preimage_of_equiv' hf e.symm.bijective (λ g x, _),
rcases f.surjective x with ⟨x, rfl⟩,
rw [←hef, f.symm_apply_apply, f.symm_apply_apply, e.apply_symm_apply]
end

end is_fundamental_domain

namespace is_fundamental_domain
variables {G α : Type*} [group G] [mul_action G α] [measurable_space G] [measurable_space α]
[has_measurable_mul G] {L : subgroup G}

/- TODO: Prove the version giving `⌈volume S / volume F⌉` points whose difference is in a subgroup.
This needs the `m`-fold version of `exists_nonempty_inter_of_measure_univ_lt_tsum_measure` when
`m * measure < measure`, giving some element in `m` sets. -/
@[to_additive]
lemma exists_ne_div_mem {μ : measure G} [countable L] {s t : set G} (hs : null_measurable_set s μ)
(fund : is_fundamental_domain L t μ) (hlt : μ t < μ s)
[is_mul_left_invariant (μ : measure G)] :
∃ x y ∈ s, x ≠ y ∧ y / x ∈ L :=
let ⟨x, hx, y, hy, g, hg, rfl⟩ := fund.exists_ne_one_smul_eq hs hlt in
by refine ⟨x, hx, _, hy, _, _⟩; simp [subgroup.smul_def]; assumption

end is_fundamental_domain

namespace is_add_fundamental_domain
variables {E G : Type*} [normed_add_comm_group E] [normed_add_comm_group G] [normed_space ℝ E]
[normed_space ℝ G] [measurable_space E] [measurable_space G] [borel_space E] [borel_space G]
[finite_dimensional ℝ E] [finite_dimensional ℝ G] {L : add_subgroup E} {F : set E}

lemma map_linear_equiv (μ : measure E) [is_add_haar_measure μ]
(fund : is_add_fundamental_domain L F μ) (e : E ≃ₗ[ℝ] G) :
is_add_fundamental_domain (L.map (e : E →+ G)) (e '' F) (map e μ) :=
begin
refine fund.image_of_equiv' e.to_equiv _ _ (λ g x, _),
{ refine ⟨_, _⟩, -- TODO lemma
convert e.to_continuous_linear_equiv.to_homeomorph.to_measurable_equiv.symm.measurable,
ext,
refl,
simp only [linear_equiv.coe_to_equiv_symm],
rw [map_map, e.symm_comp_self, map_id],
convert e.symm.to_continuous_linear_equiv.to_homeomorph.to_measurable_equiv.measurable,
convert e.to_continuous_linear_equiv.to_homeomorph.to_measurable_equiv.measurable,
ext,
refl },
{ refine ((L.equiv_map_of_injective _ _).symm.to_equiv : L.map (e : E →+ G) ≃ L),
exact e.injective },
{ simp only [add_subgroup.vadd_def, add_equiv.to_equiv_symm, add_equiv.to_equiv_eq_coe,
vadd_eq_add, linear_equiv.coe_to_equiv, _root_.map_add, _root_.add_left_inj],
refine e.symm.injective _,
simp only [add_equiv.coe_to_equiv, linear_equiv.symm_apply_apply],
convert add_subgroup.coe_equiv_map_of_injective_symm_apply e.to_add_equiv,
exact e.injective }
end

end is_add_fundamental_domain
end measure_theory

open ennreal finite_dimensional fintype measure_theory measure_theory.measure set topological_space
topological_space.positive_compacts
open_locale pointwise

namespace measure_theory
variables {ι E : Type*} [fintype ι]

-- TODO: The proof shows that there is a point in the interior of T, perhaps we should expose this
lemma exists_ne_zero_mem_subgroup_of_volume_mul_two_pow_card_lt_measure {L : add_subgroup (ι → ℝ)}
[countable L] {F T : set (ι → ℝ)} (μ : measure (ι → ℝ)) [is_add_haar_measure μ]
(fund : is_add_fundamental_domain L F μ) (h : μ F * 2 ^ card ι < μ T) (h_symm : ∀ x ∈ T, -x ∈ T)
(h_conv : convex ℝ T) :
∃ x : L, x ≠ 0 ∧ (x : ι → ℝ) ∈ T :=
begin
rw [add_haar_measure_unique μ (pi_Icc01 ι), add_haar_measure_eq_volume_pi] at fund,
have fund_vol : is_add_fundamental_domain L F volume,
{ refine fund.mono (absolutely_continuous.mk $ λ s hs h, _),
rw [measure.smul_apply, smul_eq_zero] at h,
-- TODO nice lemma for this?
exact h.resolve_left (measure_pos_of_nonempty_interior _ (pi_Icc01 _).interior_nonempty).ne' },
rw [add_haar_measure_unique μ (pi_Icc01 ι), add_haar_measure_eq_volume_pi, measure.smul_apply,
measure.smul_apply, smul_mul_assoc, smul_eq_mul, smul_eq_mul] at h,
rw ←measure_interior_of_null_frontier (h_conv.add_haar_frontier volume) at *,
set S := interior T,
have h2 : volume F < volume ((2⁻¹ : ℝ) • S),
{ rw [←ennreal.mul_lt_mul_right (pow_ne_zero (card ι) $ two_ne_zero' _) (pow_ne_top two_ne_top),
add_haar_smul_of_nonneg],
simpa [ennreal.of_real_pow, ←inv_pow, ←ennreal.of_real_inv_of_pos zero_lt_two, mul_right_comm,
←mul_pow, ennreal.inv_mul_cancel _root_.two_ne_zero] using lt_of_mul_lt_mul_left' h,
positivity },
rw [←one_smul ℝ T, ←_root_.add_halves (1 : ℝ), one_div, h_conv.add_smul (inv_nonneg.2 zero_le_two)
(inv_nonneg.2 zero_le_two)],
obtain ⟨x, hx, y, hy, hne, hsub⟩ := fund_vol.exists_ne_sub_mem
(measurable_set_interior.const_smul₀ _).null_measurable_set h2,
refine ⟨⟨y - x, hsub⟩, subtype.ne_of_val_ne $ sub_ne_zero.2 hne.symm, y, -x,
smul_set_mono interior_subset hy, _, rfl⟩,
rw mem_inv_smul_set_iff₀ (two_ne_zero' ℝ) at ⊢ hx,
rw smul_neg,
exact h_symm _ (interior_subset hx),
end

lemma exists_ne_zero_mem_lattice_of_measure_mul_two_pow_finrank_lt_measure
xroblot marked this conversation as resolved.
Show resolved Hide resolved
[normed_add_comm_group E] [normed_space ℝ E] [measurable_space E] [borel_space E]
[finite_dimensional ℝ E] (μ : measure E) [is_add_haar_measure μ] {L : add_subgroup E}
[countable L] {F T : set E} (fund : is_add_fundamental_domain L F μ)
(h : μ F * 2 ^ finrank ℝ E < μ T) (h_symm : ∀ x ∈ T, -x ∈ T) (h_conv : convex ℝ T) :
∃ (x : L) (h : x ≠ 0), (x : E) ∈ T :=
begin
let ι := fin (finrank ℝ E),
have : finrank ℝ E = finrank ℝ (ι → ℝ), by simp,
have e : E ≃ₗ[ℝ] ι → ℝ := linear_equiv.of_finrank_eq E (ι → ℝ) this,
have hfund : is_add_fundamental_domain (L.map (e : E →+ ι → ℝ)) (e '' F) (map e μ),
{ convert fund.map_linear_equiv μ e },
haveI : countable (L.map (e : E →+ ι → ℝ)),
{ refine (L.equiv_map_of_injective _ _).symm.injective.countable,
exact equiv_like.injective e },
obtain ⟨x, hx, hxT⟩ :=
exists_ne_zero_mem_subgroup_of_volume_mul_two_pow_card_lt_measure (map e μ) hfund
(_ : map e μ (e '' F) * _ < map e μ (e '' T)) _ (h_conv.linear_image e.to_linear_map),
{ refine ⟨(L.equiv_map_of_injective _ _).symm x, _, _⟩,
{ exact equiv_like.injective e },
{ simp only [hx, ne.def, add_equiv_class.map_eq_zero_iff, not_false_iff, exists_true_left] },
erw add_subgroup.coe_equiv_map_of_injective_symm_apply e.to_add_equiv,
exact mem_image_equiv.mp hxT },
{ erw [measurable_equiv.map_apply e.to_continuous_linear_equiv.to_homeomorph.to_measurable_equiv,
measurable_equiv.map_apply e.to_continuous_linear_equiv.to_homeomorph.to_measurable_equiv,
preimage_image_eq _ e.injective, preimage_image_eq _ e.injective],
convert h,
simp [ι] },
{ rintro _ ⟨x, hx, rfl⟩,
exact ⟨-x, h_symm _ hx, map_neg _ _⟩ }
end

end measure_theory