|
| 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