Skip to content

Commit b5eb6ae

Browse files
carlokclaude
andcommitted
RC1: Roy 1992, Cor. 1 for (Qbar, L~) with no hypothesis (10 nodes, 628/628)
- roy_rank_bound (milestone 185): Roy's Corollary 1. A d x l matrix M with entries in L~ is equivalent over Qbar to one whose top right d' x (l - l') block vanishes, with d l' <= rank(M) (d' + l'). It applies multiplicityEstimateElem, so it has no hypothesis. - roy_theorem_four: Roy's Theorem 4 in the form of DALAG Prop. 11.19. - roy_slope_bound, roy_semistable_node: an induction on d that splits along a rational subspace of maximal slope and applies linear_subgroup_transcendence (DALAG Th. 11.21) once at each semistable step; six leaves (lifts through Roy's map, its dimension counts, the image of an integer kernel, the rank of the relations, a space of periods, adapted coordinates). - Porter: one v4.35 patch, synthInstance.maxHeartbeats 200000 on main_P in roy_slope_bound (v4.33.1 compiles as published); port --verify 576 identical. - Audit 201 theorems, standard axioms only; lake build Diaz green. - Blueprint 415 results (chapter 5, new last section; chapter 14 notes the two routine steps not found in the sources read); README 628; note v1.42 (46 pp.): Roy's Cor. 1 and Th. 4 in the setting section and the table, and a version-history line that also records the Theorem B and Li2(1/2) changes of 8 November. Co-Authored-By: Claude Opus 5.5 <[email protected]>
1 parent 42235e8 commit b5eb6ae

43 files changed

Lines changed: 5606 additions & 4 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Diaz/Mirror.lean‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,3 +577,13 @@ import Diaz.Mirror.exp_mul_or_exp_sq_mul_transcendental
577577
import Diaz.Mirror.two_pow_pi_or_three_pow_pi_transcendental
578578
import Diaz.Mirror.quadric_trdeg_two_alg
579579
import Diaz.Mirror.log_modulus_forces_independence_alg
580+
import Diaz.Mirror.roy_field_lifts
581+
import Diaz.Mirror.roy_upsilon_dims
582+
import Diaz.Mirror.roy_intKer_image
583+
import Diaz.Mirror.roy_relation_rank_le
584+
import Diaz.Mirror.roy_period_space
585+
import Diaz.Mirror.roy_rational_adapted_basis
586+
import Diaz.Mirror.roy_semistable_node
587+
import Diaz.Mirror.roy_slope_bound
588+
import Diaz.Mirror.roy_theorem_four
589+
import Diaz.Mirror.roy_rank_bound

‎Diaz/Mirror/roy_field_lifts.lean‎

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/-
2+
Mirrored from Prove2Me: `DiazModulus.roy_field_lifts`.
3+
4+
Ported mechanically from the accepted submission archived as
5+
`archive/prove2me/DiazModulus.roy_field_lifts__5d99fcfe.lean`. Statement and proof are the platform's; only
6+
imports, namespaces and the theorem's name were rewritten.
7+
-/
8+
import Mathlib
9+
import Diaz.Platform
10+
11+
namespace Diaz
12+
13+
open Complex ComplexConjugate
14+
15+
/-! # The number field of the coefficients and the lifts `η`
16+
Write each coordinate `z_{i,j} ∈ ℒ̃` as a finite sum `Σ_l f_l g_l` with `f_l ∈ Q̄` and
17+
`g_l ∈ {1} ∪ ℒ` (`Submodule.mem_span_set'`). Let `k = ℚ(all f_l)`, a number field
18+
(`IntermediateField.finiteDimensional_adjoin`), and let `ω` be a ℚ-basis of `k`; so `m ≥ 1`,
19+
`ω` is ℚ-free and algebraic, and `span_ℚ ω = k` contains `1` and the products `ω_a ω_b`.
20+
`ℒ` is a ℚ-vector space: it contains `0`, is closed under addition (`exp` turns sums into
21+
products), and under rational multiples, since `exp(r g)^{den r} = exp(g)^{num r}` and a
22+
number whose power is algebraic is algebraic. For `c ∈ k` and `g ∈ {1} ∪ ℒ` the product
23+
`c g` has the shape `u + Σ_k ω_k v_k` with `u ∈ k` and `v_k ∈ ℒ`: take `u = c, v = 0` if
24+
`g = 1`, and otherwise expand `c = Σ_k r_k ω_k` and take `u = 0`, `v_k = r_k g`. The shape
25+
survives finite sums. Applied to `ω_a z_{i,j} = Σ_l (ω_a f_l) g_l`, with `ω_a f_l ∈ k`, this
26+
gives `x` and `y` with `ω_a z_{i,j} = x_j + Σ_c ω_c y_{(c,j)}`, and `η_{(a,i)} = (x, y)`
27+
satisfies `Υ(η_{(a,i)}) = ω_a z_i`. -/
28+
29+
namespace RC1_FL
30+
theorem roy_field_lifts_logAlg_add {u v : ℂ} (hu : u ∈ LogAlg) (hv : v ∈ LogAlg) : u + v ∈ LogAlg := by
31+
show IsAlgebraic ℚ (Complex.exp (u + v))
32+
rw [Complex.exp_add]
33+
exact mem_Qbar_iff.mp (Qbar.mul_mem (mem_Qbar_iff.mpr hu) (mem_Qbar_iff.mpr hv))
34+
35+
theorem roy_field_lifts_logAlg_zero : (0 : ℂ) ∈ LogAlg := by
36+
show IsAlgebraic ℚ (Complex.exp 0)
37+
rw [Complex.exp_zero]
38+
exact isAlgebraic_one
39+
40+
theorem logAlg_ratMul {g : ℂ} (hg : g ∈ LogAlg) (r : ℚ) : (r : ℂ) * g ∈ LogAlg := by
41+
show IsAlgebraic ℚ (Complex.exp ((r : ℂ) * g))
42+
have h1 : Complex.exp ((r : ℂ) * g) ^ r.den = Complex.exp g ^ r.num := by
43+
rw [← Complex.exp_nat_mul, ← Complex.exp_int_mul]
44+
congr 1
45+
have hd : (r.den : ℂ) ≠ 0 := by exact_mod_cast r.den_ne_zero
46+
rw [Rat.cast_def]
47+
field_simp
48+
have h2 : Complex.exp g ^ r.num ∈ Qbar := zpow_mem (mem_Qbar_iff.mpr hg) _
49+
exact IsAlgebraic.of_pow r.den_pos (h1 ▸ mem_Qbar_iff.mp h2)
50+
51+
/-- Coordinates of `c ∈ K` in the basis `Module.finBasis ℚ K`. -/
52+
theorem rep (K : IntermediateField ℚ ℂ) [FiniteDimensional ℚ K] {c : ℂ} (hc : c ∈ K) :
53+
c = ∑ k, (((Module.finBasis ℚ K).repr ⟨c, hc⟩ k : ℚ) : ℂ) *
54+
((Module.finBasis ℚ K k : K) : ℂ) := by
55+
have h := congrArg (fun w : K => (w : ℂ)) ((Module.finBasis ℚ K).sum_repr ⟨c, hc⟩)
56+
simp only [IntermediateField.coe_sum] at h
57+
refine h.symm.trans (Finset.sum_congr rfl (fun k _ => ?_))
58+
rw [IntermediateField.coe_smul, Rat.smul_def]
59+
60+
theorem mem_span_of_mem (K : IntermediateField ℚ ℂ) [FiniteDimensional ℚ K] {c : ℂ}
61+
(hc : c ∈ K) :
62+
c ∈ Submodule.span ℚ (Set.range fun k => ((Module.finBasis ℚ K k : K) : ℂ)) := by
63+
rw [rep K hc]
64+
refine Submodule.sum_mem _ fun k _ => ?_
65+
rw [← Rat.smul_def]
66+
exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨k, rfl⟩)
67+
68+
/-- The shape `u + Σ_k ω_k v_k`, `u ∈ K`, `v_k ∈ ℒ`. -/
69+
def roy_field_lifts_Shape (K : IntermediateField ℚ ℂ) {m : ℕ} (ω : Fin m → ℂ) (w : ℂ) : Prop :=
70+
∃ u ∈ K, ∃ v : Fin m → ℂ, (∀ k, v k ∈ LogAlg) ∧ w = u + ∑ k, ω k * v k
71+
72+
theorem roy_field_lifts_shape_zero (K : IntermediateField ℚ ℂ) {m : ℕ} (ω : Fin m → ℂ) : roy_field_lifts_Shape K ω 0 :=
73+
⟨0, K.zero_mem, 0, fun _ => roy_field_lifts_logAlg_zero, by simp⟩
74+
75+
theorem roy_field_lifts_shape_add (K : IntermediateField ℚ ℂ) {m : ℕ} (ω : Fin m → ℂ) {w w' : ℂ}
76+
(hw : roy_field_lifts_Shape K ω w) (hw' : roy_field_lifts_Shape K ω w') : roy_field_lifts_Shape K ω (w + w') := by
77+
obtain ⟨u, hu, v, hv, rfl⟩ := hw
78+
obtain ⟨u', hu', v', hv', rfl⟩ := hw'
79+
refine ⟨u + u', K.add_mem hu hu', v + v', fun k => roy_field_lifts_logAlg_add (hv k) (hv' k), ?_⟩
80+
simp only [Pi.add_apply, mul_add, Finset.sum_add_distrib]
81+
ring
82+
83+
theorem roy_field_lifts_shape_term (K : IntermediateField ℚ ℂ) [FiniteDimensional ℚ K] {c g : ℂ} (hc : c ∈ K)
84+
(hg : g ∈ insert (1 : ℂ) LogAlg) :
85+
roy_field_lifts_Shape K (fun k => ((Module.finBasis ℚ K k : K) : ℂ)) (c * g) := by
86+
rcases hg with rfl | hg
87+
· exact ⟨c, hc, 0, fun _ => roy_field_lifts_logAlg_zero, by simp⟩
88+
· refine ⟨0, K.zero_mem, fun k => (((Module.finBasis ℚ K).repr ⟨c, hc⟩ k : ℚ) : ℂ) * g,
89+
fun k => logAlg_ratMul hg _, ?_⟩
90+
refine (congrArg (· * g) (rep K hc)).trans ?_
91+
rw [zero_add, Finset.sum_mul]
92+
exact Finset.sum_congr rfl (fun k _ => by ring)
93+
94+
end RC1_FL
95+
96+
open RC1_FL in
97+
theorem roy_field_lifts {d ℓ : ℕ} (z : Fin ℓ → Fin d → ℂ) (hz : ∀ i j, z i j ∈ LogAlgTilde) :
98+
∃ (m : ℕ) (ω : Fin m → ℂ) (η : Fin m × Fin ℓ → (Fin d → ℂ) × (Fin m × Fin d → ℂ)),
99+
0 < m ∧ LinearIndependent ℚ ω ∧ (∀ a, ω a ∈ Qbar) ∧
100+
(1 : ℂ) ∈ Submodule.span ℚ (Set.range ω) ∧
101+
(∀ a b, ω a * ω b ∈ Submodule.span ℚ (Set.range ω)) ∧
102+
(∀ p, (∀ i, (η p).1 i ∈ Submodule.span ℚ (Set.range ω)) ∧ ∀ q, (η p).2 q ∈ LogAlg) ∧
103+
∀ p, (LinearMap.pi fun i : Fin d =>
104+
(LinearMap.proj i : (Fin d → ℂ) →ₗ[ℂ] ℂ) ∘ₗ LinearMap.fst ℂ (Fin d → ℂ) (Fin m × Fin d → ℂ)
105+
+ ∑ k, ω k • (LinearMap.proj (k, i) : (Fin m × Fin d → ℂ) →ₗ[ℂ] ℂ) ∘ₗ
106+
LinearMap.snd ℂ (Fin d → ℂ) (Fin m × Fin d → ℂ)) (η p) = ω p.1 • z p.2 := by
107+
choose n f g hfg using fun ij : Fin ℓ × Fin d => Submodule.mem_span_set'.mp (hz ij.1 ij.2)
108+
set S : Set ℂ :=
109+
Set.range (fun p : (Σ ij : Fin ℓ × Fin d, Fin (n ij)) => ((f p.1 p.2 : Qbar) : ℂ))
110+
have hSQ : ∀ c ∈ S, c ∈ Qbar := by
111+
rintro _ ⟨p, rfl⟩
112+
exact (f p.1 p.2).2
113+
set K := IntermediateField.adjoin ℚ S
114+
have : FiniteDimensional ℚ K :=
115+
IntermediateField.finiteDimensional_adjoin (fun c hc => (mem_Qbar_iff.mp (hSQ c hc)).isIntegral)
116+
have hK : ∀ c ∈ K, c ∈ Qbar := fun c hc =>
117+
mem_Qbar_iff.mpr (IntermediateField.isAlgebraic_iff.mp
118+
(Algebra.IsAlgebraic.isAlgebraic (⟨c, hc⟩ : K)))
119+
set ω : Fin (Module.finrank ℚ K) → ℂ := fun k => ((Module.finBasis ℚ K k : K) : ℂ) with hω
120+
have hkey : ∀ (a : Fin (Module.finrank ℚ K)) (i : Fin ℓ) (j : Fin d),
121+
roy_field_lifts_Shape K ω (ω a * z i j) := by
122+
intro a i j
123+
rw [← hfg (i, j), Finset.mul_sum]
124+
refine Finset.sum_induction _ (roy_field_lifts_Shape K ω) (fun _ _ => roy_field_lifts_shape_add K ω) (roy_field_lifts_shape_zero K ω) ?_
125+
intro l _
126+
rw [Subfield.smul_def, smul_eq_mul, ← mul_assoc]
127+
have hfK : ((f (i, j) l : Qbar) : ℂ) ∈ K :=
128+
IntermediateField.subset_adjoin _ _ ⟨⟨(i, j), l⟩, rfl⟩
129+
exact roy_field_lifts_shape_term K (K.mul_mem (Module.finBasis ℚ K a).2 hfK) (g (i, j) l).2
130+
choose U hU V hV hUV using hkey
131+
refine ⟨Module.finrank ℚ K, ω, fun p => (fun j => U p.1 p.2 j, fun kj => V p.1 p.2 kj.2 kj.1),
132+
Module.finrank_pos, ?_, fun a => hK _ (Module.finBasis ℚ K a).2,
133+
mem_span_of_mem K K.one_mem,
134+
fun a b => mem_span_of_mem K (K.mul_mem (Module.finBasis ℚ K a).2 (Module.finBasis ℚ K b).2),
135+
fun p => ⟨fun j => mem_span_of_mem K (hU _ _ _), fun kj => hV _ _ _ _⟩, ?_⟩
136+
· exact (Module.finBasis ℚ K).linearIndependent.map' K.val.toLinearMap
137+
(LinearMap.ker_eq_bot.mpr Subtype.val_injective)
138+
· rintro ⟨a, i⟩
139+
funext j
140+
simp only [LinearMap.pi_apply, LinearMap.add_apply, LinearMap.coe_comp, Function.comp_apply,
141+
LinearMap.coe_fst, LinearMap.coe_snd, LinearMap.coe_proj, Function.eval,
142+
LinearMap.sum_apply, LinearMap.smul_apply, smul_eq_mul, Pi.smul_apply]
143+
exact (hUV a i j).symm
144+
145+
end Diaz

‎Diaz/Mirror/roy_intKer_image.lean‎

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
/-
2+
Mirrored from Prove2Me: `DiazModulus.roy_intKer_image`.
3+
4+
Ported mechanically from the accepted submission archived as
5+
`archive/prove2me/DiazModulus.roy_intKer_image__f3dd0055.lean`. Statement and proof are the platform's; only
6+
imports, namespaces and the theorem's name were rewritten.
7+
-/
8+
import Mathlib
9+
import Diaz.Platform
10+
11+
namespace Diaz
12+
13+
open Complex ComplexConjugate
14+
15+
/-! # The kernel of an integer matrix and its image under `Υ₁`
16+
Write `Υ₁(y)_i = Σ_k ω_k y_{(k,i)}` and let `L_ℚ ⊆ ℚ^{m×d}` be the rational kernel of `φ`.
17+
(1) `L₁` is the ℂ-span of `L_ℚ`: for `y ∈ L₁`, expand its coordinates in a ℚ-basis `c_t` of
18+
the ℚ-span of the coordinates, `y = Σ_t c_t r_t` with `r_t` rational; applying the
19+
coordinate map of that basis to `Σ_i φ_{k,i} y_i = 0` gives `Σ_i φ_{k,i} (r_t)_i = 0`, so
20+
`r_t ∈ L_ℚ`. Casts of a ℚ-basis of `L_ℚ` then span `L₁`, so `dim_ℂ L₁ ≤ dim_ℚ L_ℚ`.
21+
(2) Put `W = Υ₁(L₁)`. The coordinate functionals restricted to `W` span its dual, so some
22+
`w = dim W` of them, at coordinates `a_j`, already separate the points of `W`. The ℚ-linear
23+
map `r ↦ (r_{(k, a_j)})_{j,k}` from `L_ℚ` to `ℚ^{w×m}` is injective: if it kills `r`, then
24+
`Υ₁(r) ∈ W` vanishes at every `a_j`, so `Υ₁(r) = 0`, and the ℚ-independence of `ω` forces
25+
`r = 0`. Hence `dim_ℚ L_ℚ ≤ m·w`, and with (1), `dim L₁ ≤ m·dim W`.
26+
(3) `W = Υ₁(span L_ℚ) = span Υ₁(L_ℚ)`, and each `Υ₁(r)` with `r` rational has algebraic
27+
coordinates `Σ_k ω_k r_{(k,i)}`; so `W` is spanned by its algebraic points. -/
28+
29+
namespace RC1_IK
30+
/-- The map `Υ₁`, verbatim. -/
31+
noncomputable def Ups1 (d m : ℕ) (ω : Fin m → ℂ) : (Fin m × Fin d → ℂ) →ₗ[ℂ] (Fin d → ℂ) :=
32+
LinearMap.pi fun i : Fin d => ∑ k, ω k • (LinearMap.proj (k, i) : (Fin m × Fin d → ℂ) →ₗ[ℂ] ℂ)
33+
34+
theorem Ups1_apply {d m : ℕ} (ω : Fin m → ℂ) (y : Fin m × Fin d → ℂ) (i : Fin d) :
35+
Ups1 d m ω y i = ∑ k, ω k * y (k, i) := by
36+
simp [Ups1, LinearMap.sum_apply]
37+
38+
/-- The rational kernel of `φ`. -/
39+
def Lq {ι : Type} [Fintype ι] {q : ℕ} (φ : Fin q → ι → ℤ) : Submodule ℚ (ι → ℚ) where
40+
carrier := {r | ∀ k, ∑ i, (φ k i : ℚ) * r i = 0}
41+
add_mem' {r s} hr hs k := by
42+
simp only [Set.mem_ofPred_eq, Pi.add_apply, mul_add, Finset.sum_add_distrib] at *
43+
rw [hr k, hs k, add_zero]
44+
zero_mem' k := by simp
45+
smul_mem' c r hr k := by
46+
simp only [Set.mem_ofPred_eq, Pi.smul_apply, smul_eq_mul] at *
47+
rw [← mul_zero c, ← hr k, Finset.mul_sum]
48+
exact Finset.sum_congr rfl fun _ _ => by ring
49+
50+
/-- The coordinatewise cast `ℚ^ι → ℂ^ι`. -/
51+
def castL {ι : Type} : (ι → ℚ) →ₗ[ℚ] (ι → ℂ) where
52+
toFun r i := (r i : ℂ)
53+
map_add' r s := by funext i; simp
54+
map_smul' c r := by funext i; simp [Rat.smul_def]
55+
56+
theorem castL_mem {ι : Type} [Fintype ι] {q : ℕ} (φ : Fin q → ι → ℤ) {r : ι → ℚ}
57+
(hr : r ∈ Lq φ) (k : Fin q) : ∑ i, (φ k i : ℂ) * castL r i = 0 := by
58+
have := congrArg (fun x : ℚ => (x : ℂ)) (hr k)
59+
simpa [castL] using this
60+
61+
/-- Every complex kernel vector is a ℂ-combination of rational kernel vectors. -/
62+
theorem mem_span_of_ker {ι : Type} [Fintype ι] {q : ℕ} (φ : Fin q → ι → ℤ) (y : ι → ℂ)
63+
(hy : ∀ k, ∑ i, (φ k i : ℂ) * y i = 0) :
64+
y ∈ Submodule.span ℂ (castL '' (Lq φ : Set (ι → ℚ))) := by
65+
set C := Submodule.span ℚ (Set.range y)
66+
have : FiniteDimensional ℚ C := FiniteDimensional.span_of_finite ℚ (Set.finite_range y)
67+
set c := Module.finBasis ℚ C
68+
set e := c.equivFun
69+
let yC : ι → C := fun i => ⟨y i, Submodule.subset_span ⟨i, rfl⟩⟩
70+
have hsum0 : ∀ k, ∑ i, (φ k i : ℚ) • yC i = 0 := by
71+
intro k
72+
apply Subtype.ext
73+
simp only [Submodule.coe_sum, Submodule.coe_smul, Submodule.coe_zero, yC, Rat.smul_def,
74+
Rat.cast_intCast]
75+
exact hy k
76+
have hr : ∀ t, (fun i => e (yC i) t) ∈ Lq φ := by
77+
intro t k
78+
have := congrArg (fun x => e x t) (hsum0 k)
79+
simpa [map_sum, map_smul] using this
80+
have hyexp : y = ∑ t, ((c t : C) : ℂ) • castL (fun i => e (yC i) t) := by
81+
funext i
82+
have := congrArg Subtype.val (c.sum_equivFun (yC i))
83+
simp only [Submodule.coe_sum, Submodule.coe_smul, Rat.smul_def, yC] at this
84+
rw [Finset.sum_apply]
85+
refine this.symm.trans (Finset.sum_congr rfl fun t _ => ?_)
86+
simp [castL, e, yC, mul_comm]
87+
rw [hyexp]
88+
exact Submodule.sum_mem _ fun t _ =>
89+
Submodule.smul_mem _ _ (Submodule.subset_span ⟨_, hr t, rfl⟩)
90+
91+
/-- The ℂ-span of the casts of `L_ℚ` has dimension at most `dim_ℚ L_ℚ`. -/
92+
theorem finrank_span_cast_le {ι : Type} [Fintype ι] (L : Submodule ℚ (ι → ℚ)) :
93+
Module.finrank ℂ ↥(Submodule.span ℂ (castL '' (L : Set (ι → ℚ)))) ≤ Module.finrank ℚ L := by
94+
set b := Module.finBasis ℚ L
95+
have hle : Submodule.span ℂ (castL '' (L : Set (ι → ℚ))) ≤
96+
Submodule.span ℂ (Set.range fun j => castL ((b j : L) : ι → ℚ)) := by
97+
rw [Submodule.span_le]
98+
rintro _ ⟨r, hr, rfl⟩
99+
have h := congrArg (fun x : L => castL (x : ι → ℚ)) (b.sum_equivFun ⟨r, hr⟩)
100+
simp only [Submodule.coe_sum, Submodule.coe_smul, map_sum, map_smul] at h
101+
rw [← h]
102+
exact Submodule.sum_mem _ fun j _ =>
103+
Submodule.smul_of_tower_mem _ _ (Submodule.subset_span ⟨j, rfl⟩)
104+
refine (Submodule.finrank_mono hle).trans ?_
105+
have := finrank_range_le_card (R := ℂ) (fun j => castL ((b j : L) : ι → ℚ))
106+
simpa [Set.finrank] using this
107+
108+
/-- Some `dim W` coordinates separate the points of `W`. -/
109+
theorem exists_coords {d : ℕ} (W : Submodule ℂ (Fin d → ℂ)) :
110+
∃ (κ : Type) (a : κ → Fin d) (_ : Fintype κ), Fintype.card κ ≤ Module.finrank ℂ W ∧
111+
∀ x ∈ W, (∀ j, x (a j) = 0) → x = 0 := by
112+
let f : Fin d → Module.Dual ℂ W := fun i => (LinearMap.proj i).comp W.subtype
113+
obtain ⟨κ, a, ha, hspan, hli⟩ := exists_linearIndependent' ℂ f
114+
have : Fintype κ := Fintype.ofInjective a ha
115+
refine ⟨κ, a, inferInstance, ?_, ?_⟩
116+
· have := hli.fintype_card_le_finrank
117+
rwa [Subspace.dual_finrank_eq] at this
118+
· intro x hx h0
119+
have hall : ∀ g ∈ Submodule.span ℂ (Set.range (f ∘ a)), g ⟨x, hx⟩ = 0 := by
120+
intro g hg
121+
induction hg using Submodule.span_induction with
122+
| mem g hg => obtain ⟨j, rfl⟩ := hg; exact h0 j
123+
| zero => rfl
124+
| add g h _ _ hg hh => simp [hg, hh]
125+
| smul c g _ hg => simp [hg]
126+
funext i
127+
have := hall (f i) (hspan ▸ Submodule.subset_span ⟨i, rfl⟩)
128+
simpa [f] using this
129+
130+
/-- The ℚ-dimension count. -/
131+
theorem finrank_le_of_maps {d m : ℕ} (ω : Fin m → ℂ) (hω : LinearIndependent ℚ ω)
132+
(L : Submodule ℚ (Fin m × Fin d → ℚ)) (W : Submodule ℂ (Fin d → ℂ))
133+
(hW : ∀ r ∈ L, Ups1 d m ω (castL r) ∈ W) :
134+
Module.finrank ℚ L ≤ m * Module.finrank ℂ W := by
135+
obtain ⟨κ, a, _, hcard, hinj⟩ := exists_coords W
136+
let G : (Fin m × Fin d → ℚ) →ₗ[ℚ] (κ × Fin m → ℚ) :=
137+
{ toFun := fun r p => r (p.2, a p.1)
138+
map_add' := fun _ _ => rfl
139+
map_smul' := fun _ _ => rfl }
140+
have hG : Function.Injective (G ∘ₗ L.subtype) := by
141+
rw [← LinearMap.ker_eq_bot, LinearMap.ker_eq_bot']
142+
intro r hr
143+
have hr' : ∀ j k, (r : Fin m × Fin d → ℚ) (k, a j) = 0 := fun j k =>
144+
congrFun hr (j, k)
145+
have h1 : Ups1 d m ω (castL (r : Fin m × Fin d → ℚ)) = 0 := by
146+
refine hinj _ (hW r r.2) fun j => ?_
147+
rw [Ups1_apply]
148+
simp [castL, hr' j]
149+
apply Subtype.ext
150+
funext ⟨k, i⟩
151+
have h2 := congrFun h1 i
152+
rw [Ups1_apply] at h2
153+
have h3 := Fintype.linearIndependent_iff.mp hω (fun k => (r : Fin m × Fin d → ℚ) (k, i))
154+
(by simpa [Rat.smul_def, castL, mul_comm] using h2) k
155+
simpa using h3
156+
have := LinearMap.finrank_le_finrank_of_injective hG
157+
rw [Module.finrank_fintype_fun_eq_card, Fintype.card_prod, Fintype.card_fin] at this
158+
calc Module.finrank ℚ L ≤ Fintype.card κ * m := this
159+
_ ≤ Module.finrank ℂ W * m := Nat.mul_le_mul_right _ hcard
160+
_ = m * Module.finrank ℂ W := Nat.mul_comm _ _
161+
162+
end RC1_IK
163+
164+
open RC1_IK in
165+
theorem roy_intKer_image {d m q : ℕ} (ω : Fin m → ℂ) (hωQ : LinearIndependent ℚ ω)
166+
(hωalg : ∀ a, ω a ∈ Qbar) (φ : Fin q → Fin m × Fin d → ℤ) (L₁ : Submodule ℂ (Fin m × Fin d → ℂ))
167+
(hL₁ : ∀ v, v ∈ L₁ ↔ ∀ k, ∑ i, (φ k i : ℂ) * v i = 0) :
168+
Module.finrank ℂ ↥(L₁) ≤ m * Module.finrank ℂ ↥(L₁.map (LinearMap.pi fun i : Fin d =>
169+
∑ k, ω k • (LinearMap.proj (k, i) : (Fin m × Fin d → ℂ) →ₗ[ℂ] ℂ))) ∧
170+
Submodule.span ℂ {v : Fin d → ℂ | v ∈ L₁.map (LinearMap.pi fun i : Fin d =>
171+
∑ k, ω k • (LinearMap.proj (k, i) : (Fin m × Fin d → ℂ) →ₗ[ℂ] ℂ)) ∧ ∀ i, v i ∈ Qbar} = L₁.map (LinearMap.pi fun i : Fin d =>
172+
∑ k, ω k • (LinearMap.proj (k, i) : (Fin m × Fin d → ℂ) →ₗ[ℂ] ℂ)) := by
173+
change Module.finrank ℂ ↥L₁ ≤ m * Module.finrank ℂ ↥(L₁.map (Ups1 d m ω)) ∧
174+
Submodule.span ℂ {v : Fin d → ℂ | v ∈ L₁.map (Ups1 d m ω) ∧ ∀ i, v i ∈ Qbar} =
175+
L₁.map (Ups1 d m ω)
176+
have hcastL : ∀ r ∈ Lq φ, castL r ∈ L₁ := fun r hr => (hL₁ _).mpr (castL_mem φ hr)
177+
have hspan : L₁ = Submodule.span ℂ (castL '' (Lq φ : Set (Fin m × Fin d → ℚ))) := by
178+
apply le_antisymm
179+
· intro y hy
180+
exact mem_span_of_ker φ y ((hL₁ y).mp hy)
181+
· rw [Submodule.span_le]
182+
rintro _ ⟨r, hr, rfl⟩
183+
exact hcastL r hr
184+
refine ⟨?_, ?_⟩
185+
· calc Module.finrank ℂ ↥L₁ ≤ Module.finrank ℚ (Lq φ) := by
186+
rw [hspan]; exact finrank_span_cast_le _
187+
_ ≤ m * Module.finrank ℂ ↥(L₁.map (Ups1 d m ω)) :=
188+
finrank_le_of_maps ω hωQ _ _ fun r hr => Submodule.mem_map_of_mem (hcastL r hr)
189+
· apply le_antisymm
190+
· rw [Submodule.span_le]
191+
exact fun v hv => hv.1
192+
· conv_lhs => rw [hspan]
193+
rw [Submodule.map_span]
194+
apply Submodule.span_mono
195+
rintro _ ⟨_, ⟨r, hr, rfl⟩, rfl⟩
196+
refine ⟨Submodule.mem_map_of_mem (hcastL r hr), fun i => ?_⟩
197+
rw [Ups1_apply]
198+
exact Qbar.sum_mem fun k _ => Qbar.mul_mem (hωalg k) (SubfieldClass.ratCast_mem Qbar _)
199+
200+
end Diaz

0 commit comments

Comments
 (0)