sorgfresser commited on
Commit
528aa48
·
verified ·
1 Parent(s): a973a26

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/ground_truth.lean +552 -0
  2. results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/input_messages_compress_2.json +10 -0
  3. results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/postprocessed_dedup_predictions.jsonl +7 -0
  4. results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/raw_completion.json +518 -0
  5. results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/validity_results.jsonl +50 -0
  6. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/ground_truth.lean +897 -0
  7. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/input_messages_compress_3.json +10 -0
  8. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/postprocessed_dedup_predictions.jsonl +4 -0
  9. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/raw_completion.json +518 -0
  10. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/validity_results.jsonl +50 -0
  11. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/ground_truth.lean +764 -0
  12. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/input_messages_compress_3.json +10 -0
  13. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/postprocessed_dedup_predictions.jsonl +5 -0
  14. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/raw_completion.json +518 -0
  15. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/validity_results.jsonl +50 -0
  16. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/ground_truth.lean +725 -0
  17. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/input_messages_compress_3.json +10 -0
  18. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/postprocessed_dedup_predictions.jsonl +4 -0
  19. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/raw_completion.json +518 -0
  20. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/validity_results.jsonl +50 -0
  21. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/ground_truth.lean +781 -0
  22. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/input_messages_compress_3.json +10 -0
  23. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/postprocessed_dedup_predictions.jsonl +9 -0
  24. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/raw_completion.json +518 -0
  25. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/validity_results.jsonl +50 -0
  26. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/ground_truth.lean +798 -0
  27. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/input_messages_compress_3.json +10 -0
  28. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/postprocessed_dedup_predictions.jsonl +9 -0
  29. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/raw_completion.json +518 -0
  30. results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/validity_results.jsonl +50 -0
  31. results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/ground_truth.lean +64 -0
  32. results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/input_messages_compress_0.json +10 -0
  33. results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/postprocessed_dedup_predictions.jsonl +18 -0
  34. results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/raw_completion.json +518 -0
  35. results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/validity_results.jsonl +50 -0
  36. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/ground_truth.lean +72 -0
  37. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/input_messages_compress_0.json +10 -0
  38. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/postprocessed_dedup_predictions.jsonl +6 -0
  39. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/raw_completion.json +518 -0
  40. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/validity_results.jsonl +50 -0
  41. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/ground_truth.lean +67 -0
  42. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/input_messages_compress_0.json +10 -0
  43. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/postprocessed_dedup_predictions.jsonl +13 -0
  44. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/raw_completion.json +518 -0
  45. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/validity_results.jsonl +50 -0
  46. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/ground_truth.lean +47 -0
  47. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/input_messages_compress_0.json +10 -0
  48. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/postprocessed_dedup_predictions.jsonl +28 -0
  49. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/raw_completion.json +518 -0
  50. results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/validity_results.jsonl +50 -0
results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/ground_truth.lean ADDED
@@ -0,0 +1,552 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Jou Glasheen. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Jou Glasheen, Amelia Livingston, Jujian Zhang, Kevin Buzzard
5
+ -/
6
+ import Mathlib.FieldTheory.Cardinality
7
+ import Mathlib.RingTheory.DedekindDomain.Ideal
8
+ import Mathlib.RingTheory.Ideal.Pointwise
9
+ import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
10
+ import Mathlib.RingTheory.Ideal.Pointwise
11
+ import Mathlib.RingTheory.Ideal.Over
12
+ import Mathlib.FieldTheory.Normal
13
+ import Mathlib.FieldTheory.SeparableClosure
14
+ import Mathlib.RingTheory.OreLocalization.Ring
15
+
16
+ /-!
17
+
18
+ # Frobenius elements.
19
+
20
+ This file proves a general result in commutative algebra which can be used to define Frobenius
21
+ elements of Galois groups of local or fields (for example number fields).
22
+
23
+ KB was alerted to this very general result (which needs no Noetherian or finiteness assumptions
24
+ on the rings, just on the Galois group) by Joel Riou
25
+ here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112
26
+
27
+ ## Mathematical details
28
+
29
+ ### The general commutative algebra result
30
+
31
+ This is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.
32
+ Let `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,
33
+ such that the `G`-invariants of `B` are exactly the image of `A`.
34
+
35
+ The two claims of the theorem are:
36
+ (i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.
37
+ (ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`
38
+ in `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is
39
+ surjective.
40
+
41
+ We say "automorphism group" rather than "Galois group" because the extension might not be
42
+ separable (it is algebraic and normal however, but it can be infinite; however its maximal
43
+ separable subextension is finite).
44
+
45
+ This result means that if the inertia group I_Q is trivial and the residue fields are finite,
46
+ there's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class
47
+ Frob_P in G.
48
+
49
+ -/
50
+
51
+
52
+ variable {A : Type*} [CommRing A]
53
+ {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]
54
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
55
+
56
+
57
+
58
+ open scoped algebraMap
59
+
60
+ --variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
61
+ --variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
62
+
63
+ section misc
64
+
65
+ variable {A : Type*} [CommRing A]
66
+ {B : Type*} [CommRing B] [Algebra A B]
67
+ {G : Type*} [Group G] [MulSemiringAction G B]
68
+ [SMulCommClass G A B]
69
+
70
+ open scoped Pointwise
71
+
72
+ /-
73
+ If you're happy to stick to finite G, it's just this:
74
+
75
+ private theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
76
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
77
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
78
+ fun x ↦ smul_smul g x b
79
+
80
+ But the below proof works in general.
81
+ -/
82
+
83
+ private theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := by
84
+ obtain (hfin | hinf) := em <| Finite G
85
+ · calc
86
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
87
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
88
+ fun x ↦ smul_smul g x b
89
+ · obtain (rfl | hb) := eq_or_ne b 1
90
+ · simp
91
+ · suffices (Function.mulSupport ((· • b) : G → B)).Infinite by
92
+ classical
93
+ simp [finprod_def, dif_neg this]
94
+ have htop : (⊤ : Set G).Infinite := by simpa using Set.infinite_univ_iff.mpr ({ not_finite := hinf })
95
+ convert htop
96
+ rw [eq_top_iff]
97
+ intro g _
98
+ simp only [Function.mem_mulSupport]
99
+ contrapose! hb
100
+ apply_fun (fun x ↦ g⁻¹ • x) at hb
101
+ simpa using hb
102
+
103
+ theorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]
104
+ (I : Ideal S) [hI : I.IsPrime] (f : R → S) :
105
+ ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := by
106
+ have := Fintype.ofFinite R
107
+ rw [finprod_eq_prod_of_fintype, Finset.prod_eq_multiset_prod, hI.multiset_prod_mem_iff_exists_mem]
108
+ simp
109
+
110
+ end misc
111
+
112
+ section charpoly
113
+
114
+ open Polynomial BigOperators
115
+
116
+ variable {A : Type*} [CommRing A]
117
+ {B : Type*} [CommRing B] [Algebra A B]
118
+ {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]
119
+
120
+
121
+ variable (G) in
122
+ /-- The characteristic polynomial of an element `b` of a `G`-semiring `B`
123
+ is the polynomial `∏_{g ∈ G} (X - g • b)` (here `G` is finite; junk
124
+ returned in the infinite case) .-/
125
+ noncomputable def MulSemiringAction.CharacteristicPolynomial.F (b : B) : B[X] :=
126
+ ∏ᶠ τ : G, (X - C (τ ��� b))
127
+
128
+ namespace MulSemiringAction.CharacteristicPolynomial
129
+
130
+ theorem F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
131
+
132
+ section F_API
133
+
134
+ variable [Finite G]
135
+
136
+ theorem F_monic [Nontrivial B] (b : B) : (F G b).Monic := by
137
+ have := Fintype.ofFinite G
138
+ rw [Monic, F_spec, finprod_eq_prod_of_fintype, leadingCoeff_prod'] <;> simp
139
+
140
+ theorem F_natdegree [Nontrivial B] (b : B) : (F G b).natDegree = Nat.card G := by
141
+ have := Fintype.ofFinite G
142
+ rw [F_spec, finprod_eq_prod_of_fintype, natDegree_prod_of_monic _ _ (fun _ _ => monic_X_sub_C _)]
143
+ simp only [natDegree_X_sub_C, Finset.sum_const, Finset.card_univ, Fintype.card_eq_nat_card,
144
+ nsmul_eq_mul, mul_one, Nat.cast_id]
145
+
146
+ variable (G) in
147
+ theorem F_degree [Nontrivial B] (b : B) : (F G b).degree = Nat.card G := by
148
+ have := Fintype.ofFinite G
149
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos, F_natdegree]
150
+
151
+ theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
152
+ σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rw [F_spec]
153
+ _ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := smul_finprod' _
154
+ _ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]
155
+ _ = ∏ᶠ τ' : G, (X - C (τ' • b)) := finprod_eq_of_bijective (fun τ ↦ σ * τ)
156
+ (Group.mulLeft_bijective σ) (fun _ ↦ rfl)
157
+ _ = F G b := by rw [F_spec]
158
+
159
+ theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
160
+ let foo := Fintype.ofFinite G
161
+ simp [F_spec,finprod_eq_prod_of_fintype,eval_prod]
162
+ apply @Finset.prod_eq_zero _ _ _ _ _ (1 : G) (Finset.mem_univ 1)
163
+ simp
164
+
165
+ private theorem F_coeff_fixed (b : B) (n : ℕ) (g : G) :
166
+ g • (F G b).coeff n = (F G b).coeff n := by
167
+ change (g • (F G b)).coeff n = _
168
+ rw [F_smul_eq_self]
169
+
170
+ end F_API
171
+
172
+ open scoped algebraMap
173
+
174
+ noncomputable local instance : Algebra A[X] B[X] :=
175
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
176
+
177
+ @[simp, norm_cast]
178
+ theorem _root_.coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
179
+ map_monomial _
180
+
181
+ section full_descent
182
+
183
+ variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
184
+
185
+ -- Remark: the `splitting_of_full` approach is lousy and should be
186
+ -- replaced by the commented-out code below (lines 275-296 currently)
187
+
188
+ /-- This "splitting" function from B to A will only ever be evaluated on
189
+ G-invariant elements of B, and the two key facts about it are
190
+ that it lifts such an element to `A`, and for reasons of
191
+ convenience it lifts `1` to `1`. -/
192
+ noncomputable def splitting_of_full
193
+ (b : B) : A := by classical
194
+ exact
195
+ if b = 1 then 1 else
196
+ if h : ∀ σ : G, σ • b = b then (hFull b h).choose
197
+ else 37
198
+
199
+ theorem splitting_of_full_spec {b : B} (hb : ∀ σ : G, σ • b = b) :
200
+ splitting_of_full hFull b = b := by
201
+ unfold splitting_of_full
202
+ split_ifs with h1
203
+ · rw_mod_cast [h1]
204
+ · exact (hFull b hb).choose_spec.symm
205
+
206
+ theorem splitting_of_full_one : splitting_of_full hFull 1 = 1 := by
207
+ unfold splitting_of_full
208
+ rw [if_pos rfl]
209
+
210
+ noncomputable def M (b : B) : A[X] :=
211
+ (∑ x ∈ (F G b).support, monomial x (splitting_of_full hFull ((F G b).coeff x)))
212
+
213
+ theorem M_deg_le (b : B) : (M hFull b).degree ≤ (F G b).degree := by
214
+ unfold M
215
+ have := Polynomial.degree_sum_le (F G b).support (fun x => monomial x (splitting_of_full hFull ((F G b).coeff x)))
216
+ refine le_trans this ?_
217
+ rw [Finset.sup_le_iff]
218
+ intro n hn
219
+ apply le_trans (degree_monomial_le n _) ?_
220
+ exact le_degree_of_mem_supp n hn
221
+
222
+ variable [Nontrivial B] [Finite G]
223
+
224
+ theorem M_coeff_card (b : B) :
225
+ (M hFull b).coeff (Nat.card G) = 1 := by
226
+ unfold M
227
+ simp only [finset_sum_coeff]
228
+ have hdeg := F_degree G b
229
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos] at hdeg
230
+ rw [ ← hdeg]
231
+ rw [Finset.sum_eq_single_of_mem ((F G b).natDegree)]
232
+ · have : (F G b).Monic := F_monic b
233
+ simp
234
+ simp_all [splitting_of_full_one]
235
+ · refine natDegree_mem_support_of_nonzero ?h.H
236
+ intro h
237
+ rw [h] at hdeg
238
+ have : 0 < Nat.card G := Nat.card_pos
239
+ simp_all
240
+ · intro d _ hd
241
+ exact coeff_monomial_of_ne (splitting_of_full hFull ((F G b).coeff d)) hd
242
+
243
+ theorem M_deg_eq_F_deg [Nontrivial A] (b : B) : (M hFull b).degree = (F G b).degree := by
244
+ apply le_antisymm (M_deg_le hFull b)
245
+ rw [F_degree]
246
+ have := M_coeff_card hFull b
247
+ refine le_degree_of_ne_zero ?h
248
+ rw [this]
249
+ exact one_ne_zero
250
+
251
+ theorem M_deg [Nontrivial A] (b : B) : (M hFull b).degree = Nat.card G := by
252
+ rw [M_deg_eq_F_deg hFull b]
253
+ exact F_degree G b
254
+
255
+ theorem M_monic (b : B) : (M hFull b).Monic := by
256
+ have this1 := M_deg_le hFull b
257
+ have this2 := M_coeff_card hFull b
258
+ have this3 : 0 < Nat.card G := Nat.card_pos
259
+ rw [← F_natdegree b] at this2 this3
260
+ -- then the hypos say deg(M)<=n, coefficient of X^n is 1 in M
261
+ have this4 : (M hFull b).natDegree ≤ (F G b).natDegree := natDegree_le_natDegree this1
262
+ exact Polynomial.monic_of_natDegree_le_of_coeff_eq_one _ this4 this2
263
+
264
+ omit [Nontrivial B] in
265
+ theorem M_spec (b : B) : ((M hFull b : A[X]) : B[X]) = F G b := by
266
+ unfold M
267
+ ext N
268
+ push_cast
269
+ simp_rw [splitting_of_full_spec hFull <| F_coeff_fixed b _]
270
+ simp_rw [finset_sum_coeff, ← lcoeff_apply, lcoeff_apply, coeff_monomial]
271
+ aesop
272
+
273
+ omit [Nontrivial B] in
274
+ theorem M_spec_map (b : B) : (map (algebraMap A B) (M hFull b)) = F G b := by
275
+ rw [← M_spec hFull b]; rfl
276
+
277
+ omit [Nontrivial B] in
278
+ theorem M_eval_eq_zero (b : B) : (M hFull b).eval₂ (algebraMap A B) b = 0 := by
279
+ rw [eval₂_eq_eval_map, M_spec_map, F_eval_eq_zero]
280
+
281
+ include hFull in
282
+ theorem isIntegral : Algebra.IsIntegral A B where
283
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
284
+
285
+ end full_descent
286
+
287
+ end MulSemiringAction.CharacteristicPolynomial
288
+
289
+ end charpoly
290
+
291
+ section part_a
292
+
293
+ open MulSemiringAction.CharacteristicPolynomial
294
+
295
+ variable {A : Type*} [CommRing A]
296
+ {B : Type*} [CommRing B] [Algebra A B] [Nontrivial B]
297
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
298
+
299
+ theorem isIntegral_of_Full (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
300
+ Algebra.IsIntegral A B where
301
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
302
+
303
+ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
304
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
305
+
306
+ open scoped Pointwise
307
+
308
+ theorem Nontrivial_of_exists_prime {R : Type*} [CommRing R]
309
+ (h : ∃ P : Ideal R, P.IsPrime) : Nontrivial R := by
310
+ contrapose! h
311
+ intro P hP
312
+ rw [@not_nontrivial_iff_subsingleton] at h
313
+ obtain ⟨h, _⟩ := hP
314
+ apply h
315
+ apply Subsingleton.elim
316
+
317
+ -- (Part a of Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
318
+ omit [Nontrivial B] in
319
+ theorem part_a [SMulCommClass G A B]
320
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
321
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
322
+ ∃ g : G, Q = g • P := by
323
+ haveI : Nontrivial B := Nontrivial_of_exists_prime ⟨Q, inferInstance⟩
324
+ haveI : Algebra.IsIntegral A B := isIntegral_of_Full hFull'
325
+ cases nonempty_fintype G
326
+ suffices ∃ g : G, Q ≤ g • P by
327
+ obtain ⟨g, hg⟩ := this
328
+ use g
329
+ by_contra! hQ
330
+ have : Q < g • P := lt_of_le_of_ne hg hQ
331
+ obtain ⟨x, hxP, hxQ⟩ := Set.exists_of_ssubset <| this
332
+ apply (Ideal.comap_lt_comap_of_integral_mem_sdiff (R := A) hg ⟨hxP, hxQ⟩ <|
333
+ Algebra.isIntegral_def.1 inferInstance x).ne
334
+ rw [← hPQ]
335
+ ext x
336
+ specialize hFull' (algebraMap A B x)
337
+ have : ∀ (g : G), g • (algebraMap A B x) = (algebraMap A B x) := fun g ↦ by
338
+ rw [Algebra.algebraMap_eq_smul_one, smul_comm, smul_one]
339
+ simp only [Ideal.mem_comap]
340
+ nth_rw 2 [← this]
341
+ exact Ideal.smul_mem_pointwise_smul_iff.symm
342
+ suffices ∃ g ∈ (⊤ : Finset G), Q ≤ g • P by
343
+ convert this; simp
344
+ rw [← Ideal.subset_union_prime 1 1 <| fun g _ _ _ ↦ ?_]; swap
345
+ · exact Ideal.map_isPrime_of_equiv (MulSemiringAction.toRingEquiv _ _ g)
346
+ intro x hx
347
+ specialize hFull' (∏ᶠ σ : G, σ • x)
348
+ obtain ⟨a, ha⟩ := hFull' (norm_fixed _)
349
+ have : (a : B) ∈ Q := by
350
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem]
351
+ use 1
352
+ simpa using hx
353
+ have : (a : B) ∈ P := by
354
+ unfold Algebra.cast
355
+ rwa [← Ideal.mem_comap, hPQ, Ideal.mem_comap]
356
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem] at this
357
+ obtain ⟨σ, hσ⟩ : ∃ σ : G, σ • x ∈ P := this
358
+ simp only [Finset.top_eq_univ, Finset.coe_univ, Set.mem_univ, Set.iUnion_true, Set.mem_iUnion,
359
+ SetLike.mem_coe]
360
+ use σ⁻¹
361
+ rwa [Ideal.mem_inv_pointwise_smul_iff]
362
+
363
+ end part_a
364
+
365
+ -- section normal_elements
366
+ -- I'm going to avoid this because I'm just going to use scaling.
367
+ -- I'll show that every nonzero element of B/Q divides an element of A/P.
368
+
369
+ -- variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
370
+
371
+ -- open Polynomial
372
+
373
+ -- I've commented out the next section because ACL suggested
374
+ -- reading up-to-date Bourbaki here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
375
+ -- and apparently this will avoid the def below.
376
+
377
+ -- def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
378
+
379
+ -- namespace IsNormalElement
380
+
381
+ -- theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
382
+ -- IsNormalElement K x ↔
383
+ -- ∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
384
+ -- constructor
385
+ -- · intro h
386
+ -- exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
387
+ -- · rintro ⟨P, hPmonic, hPeval, hPsplits⟩
388
+ -- -- need min poly divides P and then it should all be over
389
+ -- sorry -- presumably some form of this is in the library
390
+
391
+ -- theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
392
+ -- (hx : IsNormalElement K x) (hy : IsNormalElement K y) :
393
+ -- IsNormalElement K (x * y) := by
394
+ -- rw [iff_exists_monic_splits K hxint] at hx
395
+ -- obtain ⟨Px, hx1, hx2, hx3⟩ := hx
396
+ -- rw [iff_exists_monic_splits K hyint] at hy
397
+ -- obtain ⟨Py, hy1, hy2, hy3⟩ := hy
398
+ -- rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
399
+ -- -- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
400
+ -- -- Do we have this?
401
+ -- -- Is this even the best way to go about this?
402
+ -- -- Note: Chambert-Loir says there's a proof in Bourbaki
403
+ -- sorry
404
+
405
+ -- -- API
406
+
407
+ -- end IsNormalElement
408
+
409
+ -- end normal_elements
410
+
411
+ section part_b
412
+
413
+ variable {A : Type*} [CommRing A]
414
+ {B : Type*} [CommRing B] [Algebra A B]
415
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B]
416
+
417
+ /-
418
+ Set-up for part (b) of the lemma. G acts on B with invariants A (or more precisely the
419
+ image of A). Warning: `P` was a prime ideal of `B` in part (a) but it's a prime ideal
420
+ of `A` here, in fact it's `Q ∩ A`, the preimage of `Q` in `A`.
421
+
422
+ We want to consider the following commutative diagram.
423
+
424
+ B ---> B / Q -----> L = Frac(B/Q)
425
+ /\ /\ /\
426
+ | | |
427
+ | | |
428
+ A ---> A / P ----> K = Frac(A/P)
429
+
430
+ We will get to L, K, and the second square later.
431
+ First let's explain how to do P and Q.
432
+ -/
433
+ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
434
+ -- #synth Algebra A (B ⧸ Q) #exit -- works
435
+ ---synth IsScalarTower A B (B ⧸ Q) #exit-- works
436
+ -- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the
437
+ -- commutativity of the diagram! This is a trick I learnt from Jou who apparently
438
+ -- learnt it from Amelia
439
+ [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]
440
+ -- So now we know the left square commutes.
441
+ -- Amelia's first trick: commutativity of th LH diagram implies `P ⊆ Q ∩ A`
442
+ -- For the map `A -> A/P -> B/Q` must equal the map `A -> B -> B/Q` so `P` must
443
+ -- be a subset of the kernel of `A → B/Q`, which is `A ∩ Q`
444
+
445
+ omit [P.IsPrime] in
446
+ theorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :
447
+ algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
448
+ Ideal.Quotient.eq_zero_iff_mem
449
+
450
+ section B_mod_Q_over_A_mod_P_stuff
451
+
452
+ section Mathlib.RingTheory.Ideal.Quotient
453
+
454
+ namespace Ideal
455
+
456
+ variable {R : Type*} [CommRing R] {I : Ideal R}
457
+
458
+ protected noncomputable
459
+ def Quotient.out (x : R ⧸ I) :=
460
+ Quotient.out' x
461
+
462
+ theorem Quotient.out_eq (x : R ⧸ I) : Ideal.Quotient.mk I (Ideal.Quotient.out x) = x := by
463
+ simp only [Ideal.Quotient.out, Ideal.Quotient.mk, RingHom.coe_mk, MonoidHom.coe_mk, OneHom.coe_mk,
464
+ Submodule.Quotient.mk, Quotient.out_eq']
465
+
466
+ @[elab_as_elim]
467
+ protected theorem Quotient.induction_on
468
+ {p : R ⧸ I → Prop} (x : R ⧸ I) (h : ∀ a, p (Ideal.Quotient.mk I a)) : p x :=
469
+ Quotient.inductionOn x h
470
+
471
+ end Ideal
472
+
473
+ end Mathlib.RingTheory.Ideal.Quotient
474
+
475
+ namespace MulSemiringAction.CharacteristicPolynomial
476
+
477
+
478
+ open Polynomial
479
+ /-
480
+ I didn't check that this definition was independent
481
+ of the lift `b` of `bbar` (and it might not even be true).
482
+ But this doesn't matter, because `G` no longer acts on `B/Q`.
483
+ All we need is that `Mbar` is monic of degree `|G|`, is defined over the bottom ring
484
+ and kills `bbar`.
485
+ -/
486
+ variable {Q} in
487
+ noncomputable def Mbar
488
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
489
+ (bbar : B ⧸ Q) : (A ⧸ P)[X] :=
490
+ Polynomial.map (Ideal.Quotient.mk P) <| M hFull' <| Ideal.Quotient.out bbar
491
+
492
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
493
+
494
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
495
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
496
+ theorem Mbar_monic [Nontrivial B] (bbar : B ⧸ Q) : (Mbar P hFull' bbar).Monic := by
497
+ have := M_monic hFull'
498
+ simp [Mbar, (M_monic hFull' _).map]
499
+
500
+ omit [SMulCommClass G A B] [Q.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
501
+ theorem Mbar_deg [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
502
+ degree (Mbar P hFull' bbar) = Nat.card G := by
503
+ simp only [Mbar]
504
+ rw [degree_map_eq_of_leadingCoeff_ne_zero]
505
+ · exact M_deg hFull' _
506
+ · rw [(M_monic hFull' _).leadingCoeff]
507
+ simp only [map_one, ne_eq, one_ne_zero, not_false_eq_true]
508
+
509
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
510
+ theorem Mbar_eval_eq_zero [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
511
+ eval₂ (algebraMap (A ⧸ P) (B ⧸ Q)) bbar (Mbar P hFull' bbar) = 0 := by
512
+ have h := congr_arg (algebraMap B (B ⧸ Q)) (M_eval_eq_zero hFull' (Ideal.Quotient.out bbar))
513
+ rw [map_zero, hom_eval₂, Ideal.Quotient.algebraMap_eq, Ideal.Quotient.out_eq] at h
514
+ simpa [Mbar, eval₂_map, ← Ideal.Quotient.algebraMap_eq,
515
+ ← IsScalarTower.algebraMap_eq A (A ⧸ P) (B ⧸ Q), IsScalarTower.algebraMap_eq A B (B ⧸ Q)]
516
+
517
+ end CharacteristicPolynomial
518
+
519
+ open CharacteristicPolynomial in
520
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
521
+ theorem reduction_isIntegral
522
+ [Nontrivial A] [Nontrivial B]
523
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
524
+ Algebra.IsIntegral (A ⧸ P) (B ⧸ Q) where
525
+ isIntegral x := ⟨Mbar P hFull' x, Mbar_monic Q P hFull' x, Mbar_eval_eq_zero Q P hFull' x⟩
526
+
527
+ end MulSemiringAction
528
+
529
+ theorem Polynomial.nonzero_const_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
530
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
531
+ ∃ (q : Polynomial R), q.coeff 0 ≠ 0 ∧ q.eval₂ (algebraMap R S) s = 0 := by
532
+ obtain ⟨p, p_monic, p_eval⟩ := (@Algebra.isIntegral_def R S).mp inferInstance s
533
+ have p_nzero := ne_zero_of_ne_zero_of_monic X_ne_zero p_monic
534
+ obtain ⟨q, p_eq, q_ndvd⟩ := Polynomial.exists_eq_pow_rootMultiplicity_mul_and_not_dvd p p_nzero 0
535
+ rw [C_0, sub_zero] at p_eq
536
+ rw [C_0, sub_zero] at q_ndvd
537
+ use q
538
+ constructor
539
+ . intro q_coeff_0
540
+ exact q_ndvd <| X_dvd_iff.mpr q_coeff_0
541
+ . rw [p_eq, eval₂_mul] at p_eval
542
+ rcases NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero p_eval with Xpow_eval | q_eval
543
+ . by_contra
544
+ apply hs
545
+ rw [eval₂_X_pow] at Xpow_eval
546
+ exact pow_eq_zero Xpow_eval
547
+ . exact q_eval
548
+
549
+
550
+ theorem Algebra.exists_dvd_nonzero_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
551
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
552
+ ∃ r : R, r ≠ 0 ∧ s ∣ (algebraMap R S) r := by sorry
results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/input_messages_compress_2.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.FieldTheory.Cardinality\nimport Mathlib.RingTheory.DedekindDomain.Ideal\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.IntegralClosure.IntegralRestrict\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.Ideal.Over\nimport Mathlib.FieldTheory.Normal\nimport Mathlib.FieldTheory.SeparableClosure\nimport Mathlib.RingTheory.OreLocalization.Ring\n\n/-!\n\n# Frobenius elements.\n\nThis file proves a general result in commutative algebra which can be used to define Frobenius\nelements of Galois groups of local or fields (for example number fields).\n\nKB was alerted to this very general result (which needs no Noetherian or finiteness assumptions\non the rings, just on the Galois group) by Joel Riou\nhere https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112\n\n## Mathematical details\n\n### The general commutative algebra result\n\nThis is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.\nLet `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,\nsuch that the `G`-invariants of `B` are exactly the image of `A`.\n\nThe two claims of the theorem are:\n(i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.\n(ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`\nin `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is\nsurjective.\n\nWe say \"automorphism group\" rather than \"Galois group\" because the extension might not be\nseparable (it is algebraic and normal however, but it can be infinite; however its maximal\nseparable subextension is finite).\n\nThis result means that if the inertia group I_Q is trivial and the residue fields are finite,\nthere's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class\nFrob_P in G.\n\n-/\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nopen scoped algebraMap\n\n--variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)\n--variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n\nsection misc\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B]\n\nopen scoped Pointwise\n\n/-\nIf you're happy to stick to finite G, it's just this:\n\nprivate theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc\n g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _\n _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)\n fun x ↦ smul_smul g x b\n\nBut the below proof works in general.\n-/\n\nprivate theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := sorry\n\ntheorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]\n (I : Ideal S) [hI : I.IsPrime] (f : R → S) :\n ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := sorry\n\nend misc\n\nsection charpoly\n\nopen Polynomial BigOperators\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]\n\nvariable (G) in\n... [TRUNCATED] ...\n/\\ /\\ /\\\n| | |\n| | |\nA ---> A / P ----> K = Frac(A/P)\n\nWe will get to L, K, and the second square later.\nFirst let's explain how to do P and Q.\n-/\nvariable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]\n-- #synth Algebra A (B ⧸ Q) #exit -- works\n---synth IsScalarTower A B (B ⧸ Q) #exit-- works\n-- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the\n-- commutativity of the diagram! This is a trick I learnt from Jou who apparently\n-- learnt it from Amelia\n [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]\n-- So now we know the left square commutes.\n-- Amelia's first trick: commutativity of th LH diagram implies `P ⊆ Q ∩ A`\n-- For the map `A -> A/P -> B/Q` must equal the map `A -> B -> B/Q` so `P` must\n-- be a subset of the kernel of `A → B/Q`, which is `A ∩ Q`\n\nomit [P.IsPrime] in\ntheorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :\n algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P := sorry\n\nsection B_mod_Q_over_A_mod_P_stuff\n\nsection Mathlib.RingTheory.Ideal.Quotient\n\nnamespace Ideal\n\nvariable {R : Type*} [CommRing R] {I : Ideal R}\n\nprotected noncomputable\ndef Quotient.out (x : R ⧸ I) :=\n Quotient.out' x\n\ntheorem Quotient.out_eq (x : R ⧸ I) : Ideal.Quotient.mk I (Ideal.Quotient.out x) = x := sorry\n\n@[elab_as_elim]\nprotected theorem Quotient.induction_on\n {p : R ⧸ I → Prop} (x : R ⧸ I) (h : ∀ a, p (Ideal.Quotient.mk I a)) : p x := sorry\n\nend Ideal\n\nend Mathlib.RingTheory.Ideal.Quotient\n\nnamespace MulSemiringAction.CharacteristicPolynomial\n\nopen Polynomial\n/-\nI didn't check that this definition was independent\nof the lift `b` of `bbar` (and it might not even be true).\nBut this doesn't matter, because `G` no longer acts on `B/Q`.\nAll we need is that `Mbar` is monic of degree `|G|`, is defined over the bottom ring\nand kills `bbar`.\n-/\nvariable {Q} in\nnoncomputable def Mbar\n (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n (bbar : B ⧸ Q) : (A ⧸ P)[X] :=\n Polynomial.map (Ideal.Quotient.mk P) <| M hFull' <| Ideal.Quotient.out bbar\n\nvariable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n\nomit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in\ntheorem Mbar_monic [Nontrivial B] (bbar : B ⧸ Q) : (Mbar P hFull' bbar).Monic := sorry\n\nomit [SMulCommClass G A B] [Q.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in\ntheorem Mbar_deg [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :\n degree (Mbar P hFull' bbar) = Nat.card G := sorry\n\nomit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in\ntheorem Mbar_eval_eq_zero [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :\n eval₂ (algebraMap (A ⧸ P) (B ⧸ Q)) bbar (Mbar P hFull' bbar) = 0 := sorry\n\nend CharacteristicPolynomial\n\nopen CharacteristicPolynomial in\nomit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in\ntheorem reduction_isIntegral\n [Nontrivial A] [Nontrivial B]\n (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :\n Algebra.IsIntegral (A ⧸ P) (B ⧸ Q) where := sorry\n\nend MulSemiringAction\n\ntheorem Polynomial.nonzero_const_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]\n [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :\n ∃ (q : Polynomial R), q.coeff 0 ≠ 0 ∧ q.eval₂ (algebraMap R S) s = 0 := sorry\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nIf $\\beta \\in B/Q$ is nonzero then there’s some nonzero $\\alpha \\in A/P$ such that $\\beta $ divides the image of $\\alpha $ in $B/Q$."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {P : Ideal A} (hP : P.IsPrime) {Q : Ideal B} (hQ : Q.IsPrime)\n (hPQ : Ideal.comap (algebraMap A B) P = p) :\n ∀ (β : B ⧸ Q), β ≠ 0 → ∃ (α : A ⧸ P), α ≠ 0 ∧ β ∣ α := by sorry"}
3
+ {"prediction": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] {P : Ideal A} [P.IsPrime] {Q : Ideal B} [Q.IsPrime] (hP : P.IsPrime) (hQ : Q.IsPrime) (h : Ideal.comap (algebraMap A B) P = p) (h' : Ideal.comap (algebraMap A B) Q = q) (h'' : Ideal.Quotient.mk P p ≠ 0) (h''' : Ideal.Quotient.mk B q ≠ 0) : (∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) → (∃ α : A, α ≠ 0 ∧ β ∣ (Ideal.Quotient.mk A α)) := by sorry"}
4
+ {"prediction": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {A B : Type*} [CommRing A] [CommRing B] {G : Type*} [Group G] [MulSemiringAction G B] {p : Ideal A} (hp : p.IsPrime) {q : Ideal B} (hq : q.IsPrime) (hq1 : q = p) :\n ∀ (x : B ⧸ q), x ≠ 0 → ∃ (y : A ⧸ p), y ≠ 0 ∧ x ∣ ( Ideal.Quotient.mk p ) y := by sorry"}
5
+ {"prediction": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {A B : Type*} {P Q : Ideal A} {G : Type*} [Group G] [MulSemiringAction G B] [Finite G]\n (hP : P.IsPrime) (hQ : Q.IsPrime) (hPQ : Ideal.comap (algebraMap A B) P = p) :\n ∃ x, x ∈ P ∧ x ^ Nat.card G - 1 = 0 := by sorry"}
6
+ {"prediction": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {P Q : Ideal A} {b : B} (hP : P.IsPrime) (hQ : Q.IsPrime)\n (h : P = algebraMap A B b) (hb : b ≠ 0) : ∃ (a : A), a ≠ 0 ∧ b ∣ (a : B) := by sorry"}
7
+ {"prediction": "theorem Algebra.exists_dvd_nonzero_if_isIntegral Mem P : Ideal A, Ideal B, Nonempty G, G.IsGroup, MulSemiringAction G B, Ideal.Polynomial.mk P, Ideal.Quotient.mk P, Ideal.out.mk P, Ideal.Mbar.mk P hFull', Ideal.Mbar.eval.mk P hFull', Ideal.Mbar.deg.mk P hFull', Ideal.Mbar.map.mk P hFull', Ideal.Mbar.kill.mk P hFull', Ideal.Polynomial.X : Ideal A → Ideal B → G → G → Ideal B → Ideal A → Ideal B → Ideal X := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-cdc8b876c72c43a2b41bf5ac039dd8a9",
3
+ "created": 1749028681,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "def frobenius_element (A : Type*) [CommRing A] [Fintype G] (hG : Group.Finite G)\n (hG1 : Fintype.card G = p) (P : Ideal A) [P.IsPrime] [Fintype P] (hP : Fintype.card P = p)\n (Q : Ideal B) [Q.IsPrime] (hQ : Fintype.card Q = p) (hQ1 : Q.LiesOver P)\n (β : B ⧸ Q) (hβ : β ≠ 0) :\n ∃ (α : A ⧸ P), α ≠ 0 ∧ β ∣ (Ideal.Quotient.mk P α) ",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] : G ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] (p : Ideal B) [hp : p.IsPrime] : G ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "variable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]\n\ntheorem my_favorite_theorem {P : Ideal A} (hP : P.IsPrime) {Q : Ideal B} (hQ : Q.IsPrime)\n (hPQ : Ideal.comap (algebraMap A B) P = p) :\n ∀ (β : B ⧸ Q), β ≠ 0 → ∃ (α : A ⧸ P), α ≠ 0 ∧ β ∣ α ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] : G ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "def Frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] (p : Ideal B) : G ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] [Fintype R] : R → R ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "theorem my_favorite_theorem {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] {P : Ideal A} [P.IsPrime] {Q : Ideal B} [Q.IsPrime] (hP : P.IsPrime) (hQ : Q.IsPrime) (h : Ideal.comap (algebraMap A B) P = p) (h' : Ideal.comap (algebraMap A B) Q = q) (h'' : Ideal.Quotient.mk P p ≠ 0) (h''' : Ideal.Quotient.mk B q ≠ 0) : (∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) → (∃ α : A, α ≠ 0 ∧ β ∣ (Ideal.Quotient.mk A α)) ",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] [IsFintype R] : R ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "variable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]\n\ndef frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] : G ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "noncomputable def FrobeniusElement.mk {A B : Type*} [CommRing A] [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [MulSemiringAction G B] [Finite G] :\n ∃ f : A → B, (∀ x, f x = x ^ (Nat.card G)) ∧\n ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = f a ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] [Nontrivial R] (P : Ideal R) [P.IsPrime] (hP : P ≠ ⊤) : R → R ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "def frobenius_element (R : Type*) [CommRing R] [Fintype G] [MulSemiringAction G R] : G ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "noncomputable def frobenius_element (p : Ideal A) (hp : p.IsPrime) : Ideal A ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "noncomputable def frobenius conjugacy_class : G → Ideal B → Prop ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n : G ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] : G ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "noncomputable def frobenius (G : Type*) [Group G] [MulSemiringAction G B] [Fintype G] : B ⧸ Q →ₗ[B]ₗ[A] B ⧸ Q ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] (h : ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) :\n ∃ (F : G →ₗ[B] B), (∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) ∧\n (∀ b : B, (∀ g : G, g • b = b) → F b ≠ 0) ∧ (∀ b : B, (∀ g : G, g • b = b) → F b • b = b) ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] [Fintype G] [MulSemiringAction G R] : R ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "def frobenius conjugate (R : Type*) [CommRing R] [Nontrivial R] (G : Type*) [Group G] [Fintype G] [MulSemiringAction G R] : Prop ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "noncomputable def frobenius_element (p : G) : G :=\n",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "def frosh (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B] (A : Type*) [CommRing A] [Algebra A B] : Prop ",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "noncomputable def FrobeniusCharCode (R : Type) [CommRing R] [Fintype R] [IsField R] (a : R) : ℕ ",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "def frobenius_element (R : Type*) [CommRing R] [Fintype R] : R ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "noncomputable def frobenius conjugacy_class : Prop := ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] [Fintype R] : R ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "noncomputable def frobenius_element : Ideal (A ⧸ P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal (A ⧸ P))) := Ideal.mk (Ideal.Quotient.mk P) (Ideal.Quotient.mk P)\n\nnoncomputable def frobenius_conjugacy_class : Ideal (A ⧸ P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal (A ⧸ P))) := Ideal.mk (Ideal.Quotient.mk P) (Ideal.Quotient.mk P)\n\nnoncomputable def image_of_frobenius_element : Ideal (A ⧸ P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal (A ⧸ P))) := Ideal.mk (Ideal.Quotient.mk P) (Ideal.Quotient.mk P)\n\nnoncomputable def image_of_frobenius_conjugacy_class : Ideal (A ⧸ P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal (A ⧸ P))) := Ideal.mk (Ideal.Quotient.mk P) (Ideal.Quotient.mk P)\n\nnoncomputable def frobenius_elementrels : Ideal (A ⧸ P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal (A ⧸ P))) → Ideal (A ⧸ P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal (A ⧸ P))) → Prop ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "noncomputable def frobenius (R : Type*) [CommRing R] [Fintype G] [MulSemiringAction G R] : R → R ",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "theorem my_favorite_theorem {A B : Type*} [CommRing A] [CommRing B] {G : Type*} [Group G] [MulSemiringAction G B] {p : Ideal A} (hp : p.IsPrime) {q : Ideal B} (hq : q.IsPrime) (hq1 : q = p) :\n ∀ (x : B ⧸ q), x ≠ 0 → ∃ (y : A ⧸ p), y ≠ 0 ∧ x ∣ ( Ideal.Quotient.mk p ) y ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] [Fintype R] (P : Ideal R) [P.IsPrime] : R ⧸ P ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "variable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]\n [Fintype G] [Algebra.IsIntegral A B]\n\ndef frobenius conjugate (G : Type*) [Group G] [MulSemiringAction G B] : G ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "def FrobeniusElement (R : Type*) [CommRing R] [Fintype G] [Group G] [MulSemiringAction G R] : G ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "def Frobenius conjugacy_class (R : Type*) [CommRing R] (G : Type*) [Group G] [MulSemiringAction G R] (β : R ⧸ Q) : G ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "noncomputable def frobenius_element (p : Ideal A) (hp : p.IsPrime) : Ideal A := Ideal.mk (p : Submodule A) (Ideal.Quotient.mk p)\n\ntheorem my_favorite_theorem {A B : Type*} {P Q : Ideal A} {G : Type*} [Group G] [MulSemiringAction G B] [Finite G]\n (hP : P.IsPrime) (hQ : Q.IsPrime) (hPQ : Ideal.comap (algebraMap A B) P = p) :\n ∃ x, x ∈ P ∧ x ^ Nat.card G - 1 = 0 ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "variable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]\n\nopen Ideal\n\ntheorem my_favorite_theorem {P Q : Ideal A} {b : B} (hP : P.IsPrime) (hQ : Q.IsPrime)\n (h : P = algebraMap A B b) (hb : b ≠ 0) : ∃ (a : A), a ≠ 0 ∧ b ∣ (a : B) ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "noncomputable def frobenius_element (R S : Type) [CommRing R] [CommRing S] [Algebra R S] [IsDomain S] [Fintype S] : R ⧸ domainAlgebra.mk R S ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "noncomputable def Frobenius conjugacy_class (R : Type*) [CommRing R] (S : Type*) [CommRing S] [Algebra R S] (P : Ideal R) [P.IsPrime] (hP : P ≠ ⊤) (hP1 : P ≠ ⊥) : (Ideal.Quotient.mk P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal.Quotient.mk P)) ≃* (Ideal.Quotient.mk P) ⧸ span ({Ideal.Quotient.mk P} : Set (Ideal.Quotient.mk P)) ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "def FrobeniusConjugacyClass (B : Type*) [CommRing B] [Fintype G] : G →* B ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable def frobenius_element (A : Type*) [Field A] (G : Type*) [Group G] [MulSemiringAction G A] : G ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] [IsIntegral R B] [Fintype G] : G ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "noncomputable def frobenius_element (R : Type*) [CommRing R] (P : Ideal R) [P.IsPrime] (F : Ideal.RingHom R P) : Ideal.RingHom R P ",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "noncomputable def Frobenius_element (R S : Type*) (h : CommRing R) [Nontrivial R] (h' : CommRing S) [Algebra R S] [IsDomain S] : R ⧸ S ",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "noncomputable def galois_group (A B : Type*) [CommRing A] [CommRing B] [Algebra A B] (h : Nontrivial B) : Type := Nonempty\nnoncomputable def galois_group (A B : Type*) [CommRing A] [CommRing B] [Algebra A B] (h : Nontrivial B) ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "def frobenius_element (R : Type*) [CommRing R] [Fintype R] [IsGaloid R] : R ",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "noncomputable def frobenius_element (p : Ideal A) (hp : p.IsPrime) : Ideal A ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "variable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]\n\ntheorem _root_.Ideal.IsPrime.mem_iff_exists Mem P : Ideal A, Ideal B, Nonempty G, G.IsGroup, MulSemiringAction G B, Ideal.Polynomial.mk P, Ideal.Quotient.mk P, Ideal.out.mk P, Ideal.Mbar.mk P hFull', Ideal.Mbar.eval.mk P hFull', Ideal.Mbar.deg.mk P hFull', Ideal.Mbar.map.mk P hFull', Ideal.Mbar.kill.mk P hFull', Ideal.Polynomial.X : Ideal A → Ideal B → G → G → Ideal B → Ideal A → Ideal B → Ideal X ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "noncomputable def frobenius_element (P : Ideal A) [P.IsPrime] (g : G) : Ideal.mk A P ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "noncomputable def lift (x : A ⧸ P) := Ideal.Quotient.mk P x\n\nnoncomputable def image (x : A ⧸ P) := lift x\n\ndef witnessed_nonempty_kernel : Ideal.Quotient.mk P '' {x : A ⧸ P | image x ≠ 0} ≠ ∅ ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "noncomputable def Frobenius_element (R : Type*) [CommRing R] [Fintype G] : G ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 3443,
511
+ "prompt_tokens": 2464,
512
+ "total_tokens": 5907,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/Algebra.exists_dvd_nonzero_if_isIntegral/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {P : Ideal A} (hP : P.IsPrime) {Q : Ideal B} (hQ : Q.IsPrime)\n (hPQ : Ideal.comap (algebraMap A B) P = p) :\n ∀ (β : B ⧸ Q), β ≠ 0 → ∃ (α : A ⧸ P), α ≠ 0 ∧ β ∣ α := by sorry", "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] {P : Ideal A} [P.IsPrime] {Q : Ideal B} [Q.IsPrime] (hP : P.IsPrime) (hQ : Q.IsPrime) (h : Ideal.comap (algebraMap A B) P = p) (h' : Ideal.comap (algebraMap A B) Q = q) (h'' : Ideal.Quotient.mk P p ≠ 0) (h''' : Ideal.Quotient.mk B q ≠ 0) : (∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) → (∃ α : A, α ≠ 0 ∧ β ∣ (Ideal.Quotient.mk A α)) := by sorry", "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {A B : Type*} [CommRing A] [CommRing B] {G : Type*} [Group G] [MulSemiringAction G B] {p : Ideal A} (hp : p.IsPrime) {q : Ideal B} (hq : q.IsPrime) (hq1 : q = p) :\n ∀ (x : B ⧸ q), x ≠ 0 → ∃ (y : A ⧸ p), y ≠ 0 ∧ x ∣ ( Ideal.Quotient.mk p ) y := by sorry", "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {A B : Type*} {P Q : Ideal A} {G : Type*} [Group G] [MulSemiringAction G B] [Finite G]\n (hP : P.IsPrime) (hQ : Q.IsPrime) (hPQ : Ideal.comap (algebraMap A B) P = p) :\n ∃ x, x ∈ P ∧ x ^ Nat.card G - 1 = 0 := by sorry", "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": "theorem Algebra.exists_dvd_nonzero_if_isIntegral {P Q : Ideal A} {b : B} (hP : P.IsPrime) (hQ : Q.IsPrime)\n (h : P = algebraMap A B b) (hb : b ≠ 0) : ∃ (a : A), a ≠ 0 ∧ b ∣ (a : B) := by sorry", "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": "theorem Algebra.exists_dvd_nonzero_if_isIntegral Mem P : Ideal A, Ideal B, Nonempty G, G.IsGroup, MulSemiringAction G B, Ideal.Polynomial.mk P, Ideal.Quotient.mk P, Ideal.out.mk P, Ideal.Mbar.mk P hFull', Ideal.Mbar.eval.mk P hFull', Ideal.Mbar.deg.mk P hFull', Ideal.Mbar.map.mk P hFull', Ideal.Mbar.kill.mk P hFull', Ideal.Polynomial.X : Ideal A → Ideal B → G → G → Ideal B → Ideal A → Ideal B → Ideal X := by sorry", "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/ground_truth.lean ADDED
@@ -0,0 +1,897 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Jou Glasheen. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Jou Glasheen, Amelia Livingston, Jujian Zhang, Kevin Buzzard
5
+ -/
6
+ import Mathlib.FieldTheory.Cardinality
7
+ import Mathlib.RingTheory.DedekindDomain.Ideal
8
+ import Mathlib.RingTheory.Ideal.Pointwise
9
+ import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
10
+ import Mathlib.RingTheory.Ideal.Pointwise
11
+ import Mathlib.RingTheory.Ideal.Over
12
+ import Mathlib.FieldTheory.Normal
13
+ import Mathlib.FieldTheory.SeparableClosure
14
+ import Mathlib.RingTheory.OreLocalization.Ring
15
+
16
+ /-!
17
+
18
+ # Frobenius elements.
19
+
20
+ This file proves a general result in commutative algebra which can be used to define Frobenius
21
+ elements of Galois groups of local or fields (for example number fields).
22
+
23
+ KB was alerted to this very general result (which needs no Noetherian or finiteness assumptions
24
+ on the rings, just on the Galois group) by Joel Riou
25
+ here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112
26
+
27
+ ## Mathematical details
28
+
29
+ ### The general commutative algebra result
30
+
31
+ This is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.
32
+ Let `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,
33
+ such that the `G`-invariants of `B` are exactly the image of `A`.
34
+
35
+ The two claims of the theorem are:
36
+ (i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.
37
+ (ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`
38
+ in `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is
39
+ surjective.
40
+
41
+ We say "automorphism group" rather than "Galois group" because the extension might not be
42
+ separable (it is algebraic and normal however, but it can be infinite; however its maximal
43
+ separable subextension is finite).
44
+
45
+ This result means that if the inertia group I_Q is trivial and the residue fields are finite,
46
+ there's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class
47
+ Frob_P in G.
48
+
49
+ -/
50
+
51
+
52
+ variable {A : Type*} [CommRing A]
53
+ {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]
54
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
55
+
56
+
57
+
58
+ open scoped algebraMap
59
+
60
+ --variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
61
+ --variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
62
+
63
+ section misc
64
+
65
+ variable {A : Type*} [CommRing A]
66
+ {B : Type*} [CommRing B] [Algebra A B]
67
+ {G : Type*} [Group G] [MulSemiringAction G B]
68
+ [SMulCommClass G A B]
69
+
70
+ open scoped Pointwise
71
+
72
+ /-
73
+ If you're happy to stick to finite G, it's just this:
74
+
75
+ private theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
76
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
77
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
78
+ fun x ↦ smul_smul g x b
79
+
80
+ But the below proof works in general.
81
+ -/
82
+
83
+ private theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := by
84
+ obtain (hfin | hinf) := em <| Finite G
85
+ · calc
86
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
87
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
88
+ fun x ↦ smul_smul g x b
89
+ · obtain (rfl | hb) := eq_or_ne b 1
90
+ · simp
91
+ · suffices (Function.mulSupport ((· • b) : G → B)).Infinite by
92
+ classical
93
+ simp [finprod_def, dif_neg this]
94
+ have htop : (⊤ : Set G).Infinite := by simpa using Set.infinite_univ_iff.mpr ({ not_finite := hinf })
95
+ convert htop
96
+ rw [eq_top_iff]
97
+ intro g _
98
+ simp only [Function.mem_mulSupport]
99
+ contrapose! hb
100
+ apply_fun (fun x ↦ g⁻¹ • x) at hb
101
+ simpa using hb
102
+
103
+ theorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]
104
+ (I : Ideal S) [hI : I.IsPrime] (f : R → S) :
105
+ ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := by
106
+ have := Fintype.ofFinite R
107
+ rw [finprod_eq_prod_of_fintype, Finset.prod_eq_multiset_prod, hI.multiset_prod_mem_iff_exists_mem]
108
+ simp
109
+
110
+ end misc
111
+
112
+ section charpoly
113
+
114
+ open Polynomial BigOperators
115
+
116
+ variable {A : Type*} [CommRing A]
117
+ {B : Type*} [CommRing B] [Algebra A B]
118
+ {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]
119
+
120
+
121
+ variable (G) in
122
+ /-- The characteristic polynomial of an element `b` of a `G`-semiring `B`
123
+ is the polynomial `∏_{g ∈ G} (X - g • b)` (here `G` is finite; junk
124
+ returned in the infinite case) .-/
125
+ noncomputable def MulSemiringAction.CharacteristicPolynomial.F (b : B) : B[X] :=
126
+ ∏ᶠ τ : G, (X - C (τ ��� b))
127
+
128
+ namespace MulSemiringAction.CharacteristicPolynomial
129
+
130
+ theorem F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
131
+
132
+ section F_API
133
+
134
+ variable [Finite G]
135
+
136
+ theorem F_monic [Nontrivial B] (b : B) : (F G b).Monic := by
137
+ have := Fintype.ofFinite G
138
+ rw [Monic, F_spec, finprod_eq_prod_of_fintype, leadingCoeff_prod'] <;> simp
139
+
140
+ theorem F_natdegree [Nontrivial B] (b : B) : (F G b).natDegree = Nat.card G := by
141
+ have := Fintype.ofFinite G
142
+ rw [F_spec, finprod_eq_prod_of_fintype, natDegree_prod_of_monic _ _ (fun _ _ => monic_X_sub_C _)]
143
+ simp only [natDegree_X_sub_C, Finset.sum_const, Finset.card_univ, Fintype.card_eq_nat_card,
144
+ nsmul_eq_mul, mul_one, Nat.cast_id]
145
+
146
+ variable (G) in
147
+ theorem F_degree [Nontrivial B] (b : B) : (F G b).degree = Nat.card G := by
148
+ have := Fintype.ofFinite G
149
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos, F_natdegree]
150
+
151
+ theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
152
+ σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rw [F_spec]
153
+ _ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := smul_finprod' _
154
+ _ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]
155
+ _ = ∏ᶠ τ' : G, (X - C (τ' • b)) := finprod_eq_of_bijective (fun τ ↦ σ * τ)
156
+ (Group.mulLeft_bijective σ) (fun _ ↦ rfl)
157
+ _ = F G b := by rw [F_spec]
158
+
159
+ theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
160
+ let foo := Fintype.ofFinite G
161
+ simp [F_spec,finprod_eq_prod_of_fintype,eval_prod]
162
+ apply @Finset.prod_eq_zero _ _ _ _ _ (1 : G) (Finset.mem_univ 1)
163
+ simp
164
+
165
+ private theorem F_coeff_fixed (b : B) (n : ℕ) (g : G) :
166
+ g • (F G b).coeff n = (F G b).coeff n := by
167
+ change (g • (F G b)).coeff n = _
168
+ rw [F_smul_eq_self]
169
+
170
+ end F_API
171
+
172
+ open scoped algebraMap
173
+
174
+ noncomputable local instance : Algebra A[X] B[X] :=
175
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
176
+
177
+ @[simp, norm_cast]
178
+ theorem _root_.coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
179
+ map_monomial _
180
+
181
+ section full_descent
182
+
183
+ variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
184
+
185
+ -- Remark: the `splitting_of_full` approach is lousy and should be
186
+ -- replaced by the commented-out code below (lines 275-296 currently)
187
+
188
+ /-- This "splitting" function from B to A will only ever be evaluated on
189
+ G-invariant elements of B, and the two key facts about it are
190
+ that it lifts such an element to `A`, and for reasons of
191
+ convenience it lifts `1` to `1`. -/
192
+ noncomputable def splitting_of_full
193
+ (b : B) : A := by classical
194
+ exact
195
+ if b = 1 then 1 else
196
+ if h : ∀ σ : G, σ • b = b then (hFull b h).choose
197
+ else 37
198
+
199
+ theorem splitting_of_full_spec {b : B} (hb : ∀ σ : G, σ • b = b) :
200
+ splitting_of_full hFull b = b := by
201
+ unfold splitting_of_full
202
+ split_ifs with h1
203
+ · rw_mod_cast [h1]
204
+ · exact (hFull b hb).choose_spec.symm
205
+
206
+ theorem splitting_of_full_one : splitting_of_full hFull 1 = 1 := by
207
+ unfold splitting_of_full
208
+ rw [if_pos rfl]
209
+
210
+ noncomputable def M (b : B) : A[X] :=
211
+ (∑ x ∈ (F G b).support, monomial x (splitting_of_full hFull ((F G b).coeff x)))
212
+
213
+ theorem M_deg_le (b : B) : (M hFull b).degree ≤ (F G b).degree := by
214
+ unfold M
215
+ have := Polynomial.degree_sum_le (F G b).support (fun x => monomial x (splitting_of_full hFull ((F G b).coeff x)))
216
+ refine le_trans this ?_
217
+ rw [Finset.sup_le_iff]
218
+ intro n hn
219
+ apply le_trans (degree_monomial_le n _) ?_
220
+ exact le_degree_of_mem_supp n hn
221
+
222
+ variable [Nontrivial B] [Finite G]
223
+
224
+ theorem M_coeff_card (b : B) :
225
+ (M hFull b).coeff (Nat.card G) = 1 := by
226
+ unfold M
227
+ simp only [finset_sum_coeff]
228
+ have hdeg := F_degree G b
229
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos] at hdeg
230
+ rw [ ← hdeg]
231
+ rw [Finset.sum_eq_single_of_mem ((F G b).natDegree)]
232
+ · have : (F G b).Monic := F_monic b
233
+ simp
234
+ simp_all [splitting_of_full_one]
235
+ · refine natDegree_mem_support_of_nonzero ?h.H
236
+ intro h
237
+ rw [h] at hdeg
238
+ have : 0 < Nat.card G := Nat.card_pos
239
+ simp_all
240
+ · intro d _ hd
241
+ exact coeff_monomial_of_ne (splitting_of_full hFull ((F G b).coeff d)) hd
242
+
243
+ theorem M_deg_eq_F_deg [Nontrivial A] (b : B) : (M hFull b).degree = (F G b).degree := by
244
+ apply le_antisymm (M_deg_le hFull b)
245
+ rw [F_degree]
246
+ have := M_coeff_card hFull b
247
+ refine le_degree_of_ne_zero ?h
248
+ rw [this]
249
+ exact one_ne_zero
250
+
251
+ theorem M_deg [Nontrivial A] (b : B) : (M hFull b).degree = Nat.card G := by
252
+ rw [M_deg_eq_F_deg hFull b]
253
+ exact F_degree G b
254
+
255
+ theorem M_monic (b : B) : (M hFull b).Monic := by
256
+ have this1 := M_deg_le hFull b
257
+ have this2 := M_coeff_card hFull b
258
+ have this3 : 0 < Nat.card G := Nat.card_pos
259
+ rw [← F_natdegree b] at this2 this3
260
+ -- then the hypos say deg(M)<=n, coefficient of X^n is 1 in M
261
+ have this4 : (M hFull b).natDegree ≤ (F G b).natDegree := natDegree_le_natDegree this1
262
+ exact Polynomial.monic_of_natDegree_le_of_coeff_eq_one _ this4 this2
263
+
264
+ omit [Nontrivial B] in
265
+ theorem M_spec (b : B) : ((M hFull b : A[X]) : B[X]) = F G b := by
266
+ unfold M
267
+ ext N
268
+ push_cast
269
+ simp_rw [splitting_of_full_spec hFull <| F_coeff_fixed b _]
270
+ simp_rw [finset_sum_coeff, ← lcoeff_apply, lcoeff_apply, coeff_monomial]
271
+ aesop
272
+
273
+ omit [Nontrivial B] in
274
+ theorem M_spec_map (b : B) : (map (algebraMap A B) (M hFull b)) = F G b := by
275
+ rw [← M_spec hFull b]; rfl
276
+
277
+ omit [Nontrivial B] in
278
+ theorem M_eval_eq_zero (b : B) : (M hFull b).eval₂ (algebraMap A B) b = 0 := by
279
+ rw [eval₂_eq_eval_map, M_spec_map, F_eval_eq_zero]
280
+
281
+ include hFull in
282
+ theorem isIntegral : Algebra.IsIntegral A B where
283
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
284
+
285
+ end full_descent
286
+
287
+ end MulSemiringAction.CharacteristicPolynomial
288
+
289
+ end charpoly
290
+
291
+ section part_a
292
+
293
+ open MulSemiringAction.CharacteristicPolynomial
294
+
295
+ variable {A : Type*} [CommRing A]
296
+ {B : Type*} [CommRing B] [Algebra A B] [Nontrivial B]
297
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
298
+
299
+ theorem isIntegral_of_Full (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
300
+ Algebra.IsIntegral A B where
301
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
302
+
303
+ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
304
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
305
+
306
+ open scoped Pointwise
307
+
308
+ theorem Nontrivial_of_exists_prime {R : Type*} [CommRing R]
309
+ (h : ∃ P : Ideal R, P.IsPrime) : Nontrivial R := by
310
+ contrapose! h
311
+ intro P hP
312
+ rw [@not_nontrivial_iff_subsingleton] at h
313
+ obtain ⟨h, _⟩ := hP
314
+ apply h
315
+ apply Subsingleton.elim
316
+
317
+ -- (Part a of Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
318
+ omit [Nontrivial B] in
319
+ theorem part_a [SMulCommClass G A B]
320
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
321
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
322
+ ∃ g : G, Q = g • P := by
323
+ haveI : Nontrivial B := Nontrivial_of_exists_prime ⟨Q, inferInstance⟩
324
+ haveI : Algebra.IsIntegral A B := isIntegral_of_Full hFull'
325
+ cases nonempty_fintype G
326
+ suffices ∃ g : G, Q ≤ g • P by
327
+ obtain ⟨g, hg⟩ := this
328
+ use g
329
+ by_contra! hQ
330
+ have : Q < g • P := lt_of_le_of_ne hg hQ
331
+ obtain ⟨x, hxP, hxQ⟩ := Set.exists_of_ssubset <| this
332
+ apply (Ideal.comap_lt_comap_of_integral_mem_sdiff (R := A) hg ⟨hxP, hxQ⟩ <|
333
+ Algebra.isIntegral_def.1 inferInstance x).ne
334
+ rw [← hPQ]
335
+ ext x
336
+ specialize hFull' (algebraMap A B x)
337
+ have : ∀ (g : G), g • (algebraMap A B x) = (algebraMap A B x) := fun g ↦ by
338
+ rw [Algebra.algebraMap_eq_smul_one, smul_comm, smul_one]
339
+ simp only [Ideal.mem_comap]
340
+ nth_rw 2 [← this]
341
+ exact Ideal.smul_mem_pointwise_smul_iff.symm
342
+ suffices ∃ g ∈ (⊤ : Finset G), Q ≤ g • P by
343
+ convert this; simp
344
+ rw [← Ideal.subset_union_prime 1 1 <| fun g _ _ _ ↦ ?_]; swap
345
+ · exact Ideal.map_isPrime_of_equiv (MulSemiringAction.toRingEquiv _ _ g)
346
+ intro x hx
347
+ specialize hFull' (∏ᶠ σ : G, σ • x)
348
+ obtain ⟨a, ha⟩ := hFull' (norm_fixed _)
349
+ have : (a : B) ∈ Q := by
350
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem]
351
+ use 1
352
+ simpa using hx
353
+ have : (a : B) ∈ P := by
354
+ unfold Algebra.cast
355
+ rwa [← Ideal.mem_comap, hPQ, Ideal.mem_comap]
356
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem] at this
357
+ obtain ⟨σ, hσ⟩ : ∃ σ : G, σ • x ∈ P := this
358
+ simp only [Finset.top_eq_univ, Finset.coe_univ, Set.mem_univ, Set.iUnion_true, Set.mem_iUnion,
359
+ SetLike.mem_coe]
360
+ use σ⁻¹
361
+ rwa [Ideal.mem_inv_pointwise_smul_iff]
362
+
363
+ end part_a
364
+
365
+ -- section normal_elements
366
+ -- I'm going to avoid this because I'm just going to use scaling.
367
+ -- I'll show that every nonzero element of B/Q divides an element of A/P.
368
+
369
+ -- variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
370
+
371
+ -- open Polynomial
372
+
373
+ -- I've commented out the next section because ACL suggested
374
+ -- reading up-to-date Bourbaki here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
375
+ -- and apparently this will avoid the def below.
376
+
377
+ -- def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
378
+
379
+ -- namespace IsNormalElement
380
+
381
+ -- theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
382
+ -- IsNormalElement K x ↔
383
+ -- ∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
384
+ -- constructor
385
+ -- · intro h
386
+ -- exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
387
+ -- · rintro ⟨P, hPmonic, hPeval, hPsplits⟩
388
+ -- -- need min poly divides P and then it should all be over
389
+ -- sorry -- presumably some form of this is in the library
390
+
391
+ -- theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
392
+ -- (hx : IsNormalElement K x) (hy : IsNormalElement K y) :
393
+ -- IsNormalElement K (x * y) := by
394
+ -- rw [iff_exists_monic_splits K hxint] at hx
395
+ -- obtain ⟨Px, hx1, hx2, hx3⟩ := hx
396
+ -- rw [iff_exists_monic_splits K hyint] at hy
397
+ -- obtain ⟨Py, hy1, hy2, hy3⟩ := hy
398
+ -- rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
399
+ -- -- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
400
+ -- -- Do we have this?
401
+ -- -- Is this even the best way to go about this?
402
+ -- -- Note: Chambert-Loir says there's a proof in Bourbaki
403
+ -- sorry
404
+
405
+ -- -- API
406
+
407
+ -- end IsNormalElement
408
+
409
+ -- end normal_elements
410
+
411
+ section part_b
412
+
413
+ variable {A : Type*} [CommRing A]
414
+ {B : Type*} [CommRing B] [Algebra A B]
415
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B]
416
+
417
+ /-
418
+ Set-up for part (b) of the lemma. G acts on B with invariants A (or more precisely the
419
+ image of A). Warning: `P` was a prime ideal of `B` in part (a) but it's a prime ideal
420
+ of `A` here, in fact it's `Q ∩ A`, the preimage of `Q` in `A`.
421
+
422
+ We want to consider the following commutative diagram.
423
+
424
+ B ---> B / Q -----> L = Frac(B/Q)
425
+ /\ /\ /\
426
+ | | |
427
+ | | |
428
+ A ---> A / P ----> K = Frac(A/P)
429
+
430
+ We will get to L, K, and the second square later.
431
+ First let's explain how to do P and Q.
432
+ -/
433
+ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
434
+ -- #synth Algebra A (B ⧸ Q) #exit -- works
435
+ ---synth IsScalarTower A B (B ⧸ Q) #exit-- works
436
+ -- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the
437
+ -- commutativity of the diagram! This is a trick I learnt from Jou who apparently
438
+ -- learnt it from Amelia
439
+ [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]
440
+ -- So now we know the left square commutes.
441
+ -- Amelia's first trick: commutativity of th LH diagram implies `P ⊆ Q ∩ A`
442
+ -- For the map `A -> A/P -> B/Q` must equal the map `A -> B -> B/Q` so `P` must
443
+ -- be a subset of the kernel of `A → B/Q`, which is `A ∩ Q`
444
+
445
+ omit [P.IsPrime] in
446
+ theorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :
447
+ algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
448
+ Ideal.Quotient.eq_zero_iff_mem
449
+
450
+ section B_mod_Q_over_A_mod_P_stuff
451
+
452
+ section Mathlib.RingTheory.Ideal.Quotient
453
+
454
+ namespace Ideal
455
+
456
+ variable {R : Type*} [CommRing R] {I : Ideal R}
457
+
458
+ protected noncomputable
459
+ def Quotient.out (x : R ⧸ I) :=
460
+ Quotient.out' x
461
+
462
+ theorem Quotient.out_eq (x : R ⧸ I) : Ideal.Quotient.mk I (Ideal.Quotient.out x) = x := by
463
+ simp only [Ideal.Quotient.out, Ideal.Quotient.mk, RingHom.coe_mk, MonoidHom.coe_mk, OneHom.coe_mk,
464
+ Submodule.Quotient.mk, Quotient.out_eq']
465
+
466
+ @[elab_as_elim]
467
+ protected theorem Quotient.induction_on
468
+ {p : R ⧸ I → Prop} (x : R ⧸ I) (h : ∀ a, p (Ideal.Quotient.mk I a)) : p x :=
469
+ Quotient.inductionOn x h
470
+
471
+ end Ideal
472
+
473
+ end Mathlib.RingTheory.Ideal.Quotient
474
+
475
+ namespace MulSemiringAction.CharacteristicPolynomial
476
+
477
+
478
+ open Polynomial
479
+ /-
480
+ I didn't check that this definition was independent
481
+ of the lift `b` of `bbar` (and it might not even be true).
482
+ But this doesn't matter, because `G` no longer acts on `B/Q`.
483
+ All we need is that `Mbar` is monic of degree `|G|`, is defined over the bottom ring
484
+ and kills `bbar`.
485
+ -/
486
+ variable {Q} in
487
+ noncomputable def Mbar
488
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
489
+ (bbar : B ⧸ Q) : (A ⧸ P)[X] :=
490
+ Polynomial.map (Ideal.Quotient.mk P) <| M hFull' <| Ideal.Quotient.out bbar
491
+
492
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
493
+
494
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
495
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
496
+ theorem Mbar_monic [Nontrivial B] (bbar : B ⧸ Q) : (Mbar P hFull' bbar).Monic := by
497
+ have := M_monic hFull'
498
+ simp [Mbar, (M_monic hFull' _).map]
499
+
500
+ omit [SMulCommClass G A B] [Q.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
501
+ theorem Mbar_deg [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
502
+ degree (Mbar P hFull' bbar) = Nat.card G := by
503
+ simp only [Mbar]
504
+ rw [degree_map_eq_of_leadingCoeff_ne_zero]
505
+ · exact M_deg hFull' _
506
+ · rw [(M_monic hFull' _).leadingCoeff]
507
+ simp only [map_one, ne_eq, one_ne_zero, not_false_eq_true]
508
+
509
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
510
+ theorem Mbar_eval_eq_zero [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
511
+ eval₂ (algebraMap (A ⧸ P) (B ⧸ Q)) bbar (Mbar P hFull' bbar) = 0 := by
512
+ have h := congr_arg (algebraMap B (B ⧸ Q)) (M_eval_eq_zero hFull' (Ideal.Quotient.out bbar))
513
+ rw [map_zero, hom_eval₂, Ideal.Quotient.algebraMap_eq, Ideal.Quotient.out_eq] at h
514
+ simpa [Mbar, eval₂_map, ← Ideal.Quotient.algebraMap_eq,
515
+ ← IsScalarTower.algebraMap_eq A (A ⧸ P) (B ⧸ Q), IsScalarTower.algebraMap_eq A B (B ⧸ Q)]
516
+
517
+ end CharacteristicPolynomial
518
+
519
+ open CharacteristicPolynomial in
520
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
521
+ theorem reduction_isIntegral
522
+ [Nontrivial A] [Nontrivial B]
523
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
524
+ Algebra.IsIntegral (A ⧸ P) (B ⧸ Q) where
525
+ isIntegral x := ⟨Mbar P hFull' x, Mbar_monic Q P hFull' x, Mbar_eval_eq_zero Q P hFull' x⟩
526
+
527
+ end MulSemiringAction
528
+
529
+ theorem Polynomial.nonzero_const_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
530
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
531
+ ∃ (q : Polynomial R), q.coeff 0 ≠ 0 ∧ q.eval₂ (algebraMap R S) s = 0 := by
532
+ obtain ⟨p, p_monic, p_eval⟩ := (@Algebra.isIntegral_def R S).mp inferInstance s
533
+ have p_nzero := ne_zero_of_ne_zero_of_monic X_ne_zero p_monic
534
+ obtain ⟨q, p_eq, q_ndvd⟩ := Polynomial.exists_eq_pow_rootMultiplicity_mul_and_not_dvd p p_nzero 0
535
+ rw [C_0, sub_zero] at p_eq
536
+ rw [C_0, sub_zero] at q_ndvd
537
+ use q
538
+ constructor
539
+ . intro q_coeff_0
540
+ exact q_ndvd <| X_dvd_iff.mpr q_coeff_0
541
+ . rw [p_eq, eval₂_mul] at p_eval
542
+ rcases NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero p_eval with Xpow_eval | q_eval
543
+ . by_contra
544
+ apply hs
545
+ rw [eval₂_X_pow] at Xpow_eval
546
+ exact pow_eq_zero Xpow_eval
547
+ . exact q_eval
548
+
549
+ theorem Algebra.exists_dvd_nonzero_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
550
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
551
+ ∃ r : R, r ≠ 0 ∧ s ∣ (algebraMap R S) r := by
552
+ obtain ⟨q, q_zero_coeff, q_eval_zero⟩ := Polynomial.nonzero_const_if_isIntegral R S s hs
553
+ use q.coeff 0
554
+ refine ⟨q_zero_coeff, ?_⟩
555
+ rw [← Polynomial.eval₂_X (algebraMap R S) s, ← dvd_neg, ← Polynomial.eval₂_C (algebraMap R S) s]
556
+ rw [← zero_add (-_), Mathlib.Tactic.RingNF.add_neg, ← q_eval_zero, ← Polynomial.eval₂_sub]
557
+ apply Polynomial.eval₂_dvd
558
+ exact Polynomial.X_dvd_sub_C
559
+
560
+ end B_mod_Q_over_A_mod_P_stuff
561
+
562
+ /-
563
+ \section{The extension $L/K$.}
564
+
565
+ \begin{theorem}
566
+ \label{foo1}
567
+ If $\lambda\in L$ then there's a monic polynomial $P_\lambda\in K[X]$ of degree $|G|$
568
+ with $\lambda$ as a root, and which splits completely in $L[X]$.
569
+ \end{theorem}
570
+ \begin{proof}
571
+ A general $\lambda\in L$ can be written as $\beta_1/\beta_2$ where $\beta_1,\beta_2\in B/Q$.
572
+ The previous corollary showed that there's some nonzero $\alpha\in A/P$ such that $\beta_2$
573
+ divides $\alpha$, and hence $\alpha\lambda\in B/Q$ (we just cleared denominators).
574
+ Thus $\alpha\lambda$ is a root of some monic polynomial $f(x)\in (A/P)[X]$,
575
+ by~\ref{MulSemiringAction.CharacteristicPolynomial.Mbar_eval_eq_zero}.
576
+ The polynomial $f(\alpha x)\in (A/P)[X]$ thus
577
+ has $\lambda$ as a root, but it is not monic; its leading term is $\alpha^n$.
578
+ Dividing through in $K[X]$ gives us the polynomial we seek.
579
+ \end{proof}
580
+
581
+ \begin{corollary} The extension $L/K$ is algebraic and normal.
582
+ \end{corollary}
583
+ \begin{proof} \uses{foo1}
584
+ Exercise using the previous theorem.
585
+ \end{proof}
586
+
587
+ Note that $L/K$ might not be separable and might have infinite degree. However
588
+
589
+ \begin{corollary} Any subextension of $L/K$ which is finite and separable over $K$
590
+ has degree at most $|G|$.
591
+ \end{corollary}
592
+ \begin{proof}
593
+ Finite and separable implies simple, and we've already seen that any
594
+ element of $L$ has degree at most $|G|$ over $K$.
595
+ \end{proof}
596
+
597
+ \begin{corollary} The maximal separable subextension $M$ of $L/K$ has degree at most $|G|$.
598
+ \end{corollary}
599
+ \begin{proof} If it has dimension greater than $|G|$ over $K$, then it has a finitely-generated
600
+ subfeld of $K$-dimension greater than $|G|$, and is finite and separable, contradicting
601
+ the previous result.
602
+ \end{proof}
603
+
604
+ \begin{corollary} $\Aut_K(L)$ is finite.
605
+ \end{corollary}
606
+ \begin{proof} Any $K$-automorphism of $L$ is determined by where it sends $M$.
607
+ \end{proof}
608
+
609
+ \begin{corollary} $\Aut_{A/P}(B/Q)$ is finite.
610
+ \end{corollary}
611
+ \begin{proof}
612
+ Two elements of $\Aut_{A/P}(B/Q)$ which agree once extended to automorphisms of $L$
613
+ must have already been equal, as $B/Q\subseteq L$. Hence the canonical map
614
+ from $\Aut_{A/P}(B/Q)$ to $\Aut_K(L)$ is injective.
615
+ \end{proof}
616
+
617
+ \section{Proof of surjectivity.}
618
+
619
+ \begin{definition} We fix once and for all some nonzero $y\in B/Q$ such that $M=K(y)$,
620
+ with $M$ the maximal separable subextension of $L/K$.
621
+ \end{definition}
622
+
623
+ Note that the existence of some $\lambda\in L$ with this property just comes from finite
624
+ and separable implies simple; we can use the ``clear denominator'' technique introduced
625
+ earlier to scale this by some nonzero $\alpha\in A$ into $B/Q$, as
626
+ $K(\lambda)=K(\alpha\lambda)$.
627
+
628
+ Here is a slightly delicate result whose proof I haven't thought too hard about.
629
+ \begin{theorem} There exists some $x\in B$ and $\alpha\in A$ with the following
630
+ properties.
631
+ \begin{enumerate}
632
+ \item $x=\alpha y$ mod $Q$ and $\alpha$ isn't zero mod $Q$.
633
+ \item $x\in Q'$ for all $Q'\not=Q$ in the $G$-orbit of $Q$.
634
+ \end{enumerate}
635
+ \end{theorem}
636
+ \begin{proof}
637
+ Idea. Localise away from P, then all the $Q_i$ are maximal, use CRT and then clear denominators.
638
+ \end{proof}
639
+
640
+ We now choose some $x\in B[1/S]$ which is $y$ modulo $Q$ and $0$ modulo all the other
641
+ primes of $B$ above $P$, and consider the monic degree $|G|$ polynomial $f$ in $K[X]$
642
+ with $x$ and its conjugates as roots. If $\sigma\in\Aut_K(L)$ then $\sigma(\overline{x})$
643
+ is a root of $f$ as $\sigma$ fixes $K$ pointwise. Hence $\sigma(\overline{x})=\overline{g(x)}$
644
+ for some $g\in G$, and because $\sigma(\overline{x})\not=0$ we have $\overline{g(x)}\not=0$
645
+ and hence $g(x)\notin Q[1/S]$. Hence $x\notin g^{-1} Q[1/S]$ and thus $g^{-1}Q=Q$ and $g\in SD_Q$.
646
+ Finally we have $\phi_g=\sigma$ on $K$ and on $y$, so they are equal on $M$ and hence on $L$ as
647
+ $L/M$ is purely inseparable.
648
+
649
+ This part of the argument seems weak.
650
+ -/
651
+
652
+ section L_over_K_stuff
653
+
654
+ -- Let's now make the right square. First `L`
655
+ variable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]
656
+ -- Now top left triangle: A / P → B / Q → L commutes
657
+ [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
658
+ -- now introduce K
659
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
660
+ -- now make bottom triangle commute
661
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L]
662
+ -- So now both squares commute.
663
+
664
+ -- do I need this?
665
+ -- [Algebra A K] [IsScalarTower A (A ⧸ P) K]
666
+
667
+ -- Do I need this:
668
+ -- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
669
+
670
+ variable [Nontrivial B]
671
+
672
+
673
+ -- Do we need a version of Ideal.Quotient.eq_zero_iff_mem with algebraMap?
674
+
675
+
676
+ -- not sure if we need this but let's prove it just to check our setup is OK.
677
+ -- The claim is that the preimage of Q really is P (rather than just containing P)
678
+ -- and the proof is that A/P -> B/Q extends to a map of fields which is injective,
679
+ -- so A/P -> B/Q must also be injective.
680
+ open IsScalarTower in
681
+ example : Ideal.comap (algebraMap A B) Q = P := by
682
+ ext x
683
+ simp only [Ideal.mem_comap]
684
+ rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']
685
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
686
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
687
+ rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]
688
+ rw [← algebraMap_apply A B (B ⧸ Q)]
689
+ rw [← algebraMap_apply (A ⧸ P) K L]
690
+ rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]
691
+ rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
692
+
693
+ open Polynomial BigOperators
694
+
695
+ open scoped algebraMap
696
+
697
+ noncomputable local instance : Algebra A[X] B[X] :=
698
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
699
+
700
+ theorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}
701
+ (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry
702
+
703
+ theorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]
704
+ [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):
705
+ IsAlgebraic K (IsLocalization.mk' S 1 x) := by
706
+ rw [← IsAlgebraic.invOf_iff, IsLocalization.invertible_mk'_one_invOf]
707
+ exact h
708
+
709
+ open MulSemiringAction.CharacteristicPolynomial
710
+
711
+ namespace Bourbaki52222
712
+
713
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in
714
+ variable (G) in
715
+ noncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=
716
+ if x = 0 then monomial (Nat.card G) 1
717
+ else 37 -- this is not actually right. In the nonzero case you
718
+ -- clear denominators with a nonzero element of A, using
719
+ -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar
720
+ -- scaled appropriately.
721
+
722
+ theorem f_exists [DecidableEq L] (l : L) :
723
+ ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧
724
+ eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by
725
+ use Bourbaki52222.residueFieldExtensionPolynomial G L K l
726
+ sorry
727
+
728
+ theorem algebraMap_cast {R S: Type*} [CommRing R] [CommRing S] [Algebra R S] (r : R) :
729
+ (r : S) = (algebraMap R S) r := by
730
+ rfl
731
+
732
+ theorem algebraMap_algebraMap {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] [Algebra R S]
733
+ [Algebra S T] [Algebra R T] [IsScalarTower R S T] (r : R) :
734
+ (algebraMap S T) ((algebraMap R S) r) = (algebraMap R T) r := by
735
+ exact Eq.symm (IsScalarTower.algebraMap_apply R S T r)
736
+
737
+ theorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
738
+ [CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
739
+ (h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
740
+ rw [Algebra.isAlgebraic_def]
741
+ let M := nonZeroDivisors R
742
+ intro x
743
+ have ⟨r, s, h'⟩ := IsLocalization.mk'_surjective M x
744
+ have : x = r * IsLocalization.mk' K 1 s := by
745
+ rw [← h', IsLocalization.mul_mk'_eq_mk'_of_mul]
746
+ simp
747
+ rw [this]
748
+ apply IsAlgebraic.mul (h r)
749
+ exact IsAlgebraic.invLoc (h s)
750
+
751
+ -- this uses `Algebra.isAlgebraic_of_subring_isAlgebraic` but I think we're going to have
752
+ -- to introduce `f` anyway because we need not just that the extension is algebraic but
753
+ -- that every element satisfies a poly of degree <= |G|.
754
+ theorem algebraic {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]
755
+ [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)
756
+ [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
757
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]
758
+ [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
759
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
760
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]
761
+ [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]
762
+ [IsScalarTower A B L]
763
+ (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by
764
+ apply @Algebra.isAlgebraic_of_subring_isAlgebraic (B ⧸ Q)
765
+ intro b_bar
766
+ have ⟨b, hb⟩ := Ideal.Quotient.mk_surjective b_bar
767
+ have hb : (algebraMap B (B ⧸ Q)) b = b_bar := hb
768
+ use ((M hFull b).map (algebraMap A (A ⧸ P))).map (algebraMap (A ⧸ P) K)
769
+ constructor
770
+ . apply ne_zero_of_ne_zero_of_monic X_ne_zero
771
+ apply Monic.map
772
+ apply Monic.map
773
+ exact M_monic hFull b
774
+ . rw [← hb, algebraMap_cast, map_map, ← IsScalarTower.algebraMap_eq]
775
+ rw [algebraMap_algebraMap, aeval_def, eval₂_eq_eval_map, map_map, ← IsScalarTower.algebraMap_eq]
776
+ rw [IsScalarTower.algebraMap_eq A B L, ← map_map, M_spec_map]
777
+ rw [eval_map, eval₂_hom, F_eval_eq_zero]
778
+ exact algebraMap.coe_zero
779
+
780
+ include G in
781
+ theorem normal [DecidableEq L] : Normal K L := by
782
+ rw [normal_iff]
783
+ intro l
784
+ obtain ⟨f, hfmonic, _, hf, hfsplits⟩ := @f_exists G _ _ L _ K _ _ _ l
785
+ have hnz : f ≠ 0 := hfmonic.ne_zero
786
+ constructor
787
+ · rw [← isAlgebraic_iff_isIntegral]
788
+ exact ⟨f, hfmonic.ne_zero, hf⟩
789
+ refine Polynomial.splits_of_splits_of_dvd (algebraMap K L) hnz hfsplits ?_
790
+ exact minpoly.dvd _ _ hf
791
+
792
+ open Module
793
+
794
+ theorem separableClosure_finiteDimensional : FiniteDimensional K (separableClosure K L) := sorry
795
+
796
+ -- degree of max sep subextension is ≤ |G|
797
+ theorem separableClosure_finrank_le : finrank K (separableClosure K L) ≤ Nat.card G := sorry
798
+
799
+ open scoped IntermediateField
800
+ theorem primitive_element : ∃ y : L, K⟮y⟯ = separableClosure K L := sorry
801
+
802
+ -- this definition might break when primitive_element is proved because there will be
803
+ -- more hypotheses.
804
+ noncomputable def y : L := (primitive_element L K).choose
805
+
806
+ --noncomputable def y_spec : K⟮y⟯ = separableClosure K L := (primitive_element L K).choose_spec
807
+
808
+ end Bourbaki52222
809
+
810
+ end L_over_K_stuff
811
+
812
+ section main_theorem_statement
813
+
814
+ namespace Bourbaki52222
815
+
816
+ open scoped Pointwise
817
+
818
+ -- Basic API for what we're doing here. Writing down a map from the stabiliser of Q to
819
+ -- the residual Galois group `L ≃ₐ[K] L`, where L=Frac(B/Q) and K=Frac(A/P).
820
+ -- Hopefully sorrys aren't too hard
821
+
822
+ def quotientRingAction (Q' : Ideal B) (g : G) (hg : g • Q = Q') :
823
+ B ⧸ Q ≃+* B ⧸ Q' :=
824
+ Ideal.quotientEquiv Q Q' (MulSemiringAction.toRingEquiv G B g) hg.symm
825
+
826
+ def quotientAlgebraAction (g : G) (hg : g • Q = Q) : (B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q where
827
+ __ := quotientRingAction Q Q g hg
828
+ commutes' := by
829
+ intro a_bar; dsimp
830
+ have ⟨a, ha⟩ := Ideal.Quotient.mk_surjective a_bar
831
+ rw [quotientRingAction]; dsimp
832
+ rw [← ha, ← Ideal.Quotient.algebraMap_eq, algebraMap_algebraMap]
833
+ rw [@Ideal.quotientMap_algebraMap A B _ _ _ B _ Q Q _ ]
834
+ simp
835
+
836
+ def Pointwise.quotientAlgebraActionMonoidHom :
837
+ MulAction.stabilizer G Q →* ((B ⧸ Q) ≃ₐ[A ⧸ P] (B ⧸ Q)) where
838
+ toFun gh := quotientAlgebraAction Q P gh.1 gh.2
839
+ map_one' := by
840
+ apply AlgEquiv.ext
841
+ intro b_bar; dsimp
842
+ unfold quotientAlgebraAction
843
+ unfold quotientRingAction
844
+ have ⟨b, hb⟩ := Ideal.Quotient.mk_surjective b_bar
845
+ rw [← hb, ← Ideal.Quotient.algebraMap_eq]
846
+ simp
847
+ map_mul' := by
848
+ intro ⟨x, hx⟩ ⟨y, hy⟩
849
+ apply AlgEquiv.ext
850
+ intro b_bar; dsimp
851
+ unfold quotientAlgebraAction
852
+ unfold quotientRingAction
853
+ have ⟨b, hb⟩ := Ideal.Quotient.mk_surjective b_bar
854
+ rw [← hb, ← Ideal.Quotient.algebraMap_eq]
855
+ simp
856
+ rw [smul_smul]
857
+
858
+ variable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]
859
+ [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
860
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
861
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L]
862
+
863
+
864
+
865
+ noncomputable def IsFractionRing.algEquiv_lift (e : (B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q) : L ≃ₐ[K] L where
866
+ __ := IsFractionRing.ringEquivOfRingEquiv e.toRingEquiv
867
+ commutes' := by
868
+ intro k
869
+ dsimp
870
+ obtain ⟨x, y, _, rfl⟩ := @IsFractionRing.div_surjective (A ⧸ P) _ K _ _ _ k
871
+ simp [algebraMap_algebraMap]
872
+ unfold IsFractionRing.ringEquivOfRingEquiv
873
+ unfold IsLocalization.ringEquivOfRingEquiv
874
+ simp [IsScalarTower.algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
875
+
876
+ noncomputable def stabilizer.toGaloisGroup : MulAction.stabilizer G Q →* (L ≃ₐ[K] L) where
877
+ toFun gh := IsFractionRing.algEquiv_lift Q P L K (Pointwise.quotientAlgebraActionMonoidHom Q P gh)
878
+ map_one' := by
879
+ apply AlgEquiv.ext
880
+ intro l; simp
881
+ obtain ⟨x, y, _, rfl⟩ := @IsFractionRing.div_surjective (B ⧸ Q) _ L _ _ _ l
882
+ unfold IsFractionRing.algEquiv_lift
883
+ unfold IsFractionRing.ringEquivOfRingEquiv
884
+ simp
885
+ map_mul' := by
886
+ intro ⟨x, hx⟩ ⟨y, hy⟩
887
+ apply AlgEquiv.ext
888
+ intro l; dsimp
889
+ obtain ⟨r, s, _, rfl⟩ := @IsFractionRing.div_surjective (B ⧸ Q) _ L _ _ _ l
890
+ unfold IsFractionRing.algEquiv_lift
891
+ unfold IsFractionRing.ringEquivOfRingEquiv
892
+ simp
893
+ sorry
894
+
895
+ variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
896
+ theorem MulAction.stabilizer_surjective_of_action : Function.Surjective
897
+ (stabilizer.toGaloisGroup Q P L K : MulAction.stabilizer G Q → (L ≃ₐ[K] L)) := by sorry
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/input_messages_compress_3.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.FieldTheory.Cardinality\nimport Mathlib.RingTheory.DedekindDomain.Ideal\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.IntegralClosure.IntegralRestrict\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.Ideal.Over\nimport Mathlib.FieldTheory.Normal\nimport Mathlib.FieldTheory.SeparableClosure\nimport Mathlib.RingTheory.OreLocalization.Ring\n\n/-!\n\n# Frobenius elements.\n\nThis file proves a general result in commutative algebra which can be used to define Frobenius\nelements of Galois groups of local or fields (for example number fields).\n\nKB was alerted to this very general result (which needs no Noetherian or finiteness assumptions\non the rings, just on the Galois group) by Joel Riou\nhere https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112\n\n## Mathematical details\n\n### The general commutative algebra result\n\nThis is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.\nLet `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,\nsuch that the `G`-invariants of `B` are exactly the image of `A`.\n\nThe two claims of the theorem are:\n(i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.\n(ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`\nin `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is\nsurjective.\n\nWe say \"automorphism group\" rather than \"Galois group\" because the extension might not be\nseparable (it is algebraic and normal however, but it can be infinite; however its maximal\nseparable subextension is finite).\n\nThis result means that if the inertia group I_Q is trivial and the residue fields are finite,\nthere's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class\nFrob_P in G.\n\n-/\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nopen scoped algebraMap\n\n--variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)\n--variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n\nsection misc\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B]\n\nopen scoped Pointwise\n\n/-\nIf you're happy to stick to finite G, it's just this:\n\nprivate theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc\n g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _\n _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)\n fun x ↦ smul_smul g x b\n\nBut the below proof works in general.\n-/\n\nprivate theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := sorry\n\ntheorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]\n (I : Ideal S) [hI : I.IsPrime] (f : R → S) :\n ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := sorry\n\nend misc\n\n... [TRUNCATED] ...\n\nnamespace Bourbaki52222\n\nopen scoped Pointwise\n\n-- Basic API for what we're doing here. Writing down a map from the stabiliser of Q to\n-- the residual Galois group `L ≃ₐ[K] L`, where L=Frac(B/Q) and K=Frac(A/P).\n-- Hopefully sorrys aren't too hard\n\ndef quotientRingAction (Q' : Ideal B) (g : G) (hg : g • Q = Q') :\n B ⧸ Q ≃+* B ⧸ Q' :=\n Ideal.quotientEquiv Q Q' (MulSemiringAction.toRingEquiv G B g) hg.symm\n\ndef quotientAlgebraAction (g : G) (hg : g • Q = Q) : (B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q where\n __ := quotientRingAction Q Q g hg\n commutes' := by\n intro a_bar; dsimp\n have ⟨a, ha⟩ := Ideal.Quotient.mk_surjective a_bar\n rw [quotientRingAction]; dsimp\n rw [← ha, ← Ideal.Quotient.algebraMap_eq, algebraMap_algebraMap]\n rw [@Ideal.quotientMap_algebraMap A B _ _ _ B _ Q Q _ ]\n simp\n\ndef Pointwise.quotientAlgebraActionMonoidHom :\n MulAction.stabilizer G Q →* ((B ⧸ Q) ≃ₐ[A ⧸ P] (B ⧸ Q)) where\n toFun gh := quotientAlgebraAction Q P gh.1 gh.2\n map_one' := by\n apply AlgEquiv.ext\n intro b_bar; dsimp\n unfold quotientAlgebraAction\n unfold quotientRingAction\n have ⟨b, hb⟩ := Ideal.Quotient.mk_surjective b_bar\n rw [← hb, ← Ideal.Quotient.algebraMap_eq]\n simp\n map_mul' := by\n intro ⟨x, hx⟩ ⟨y, hy⟩\n apply AlgEquiv.ext\n intro b_bar; dsimp\n unfold quotientAlgebraAction\n unfold quotientRingAction\n have ⟨b, hb⟩ := Ideal.Quotient.mk_surjective b_bar\n rw [← hb, ← Ideal.Quotient.algebraMap_eq]\n simp\n rw [smul_smul]\n\nvariable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]\n [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L]\n\nnoncomputable def IsFractionRing.algEquiv_lift (e : (B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q) : L ≃ₐ[K] L where\n __ := IsFractionRing.ringEquivOfRingEquiv e.toRingEquiv\n commutes' := by\n intro k\n dsimp\n obtain ⟨x, y, _, rfl⟩ := @IsFractionRing.div_surjective (A ⧸ P) _ K _ _ _ k\n simp [algebraMap_algebraMap]\n unfold IsFractionRing.ringEquivOfRingEquiv\n unfold IsLocalization.ringEquivOfRingEquiv\n simp [IsScalarTower.algebraMap_apply (A ⧸ P) (B ⧸ Q) L]\n\nnoncomputable def stabilizer.toGaloisGroup : MulAction.stabilizer G Q →* (L ≃ₐ[K] L) where\n toFun gh := IsFractionRing.algEquiv_lift Q P L K (Pointwise.quotientAlgebraActionMonoidHom Q P gh)\n map_one' := by\n apply AlgEquiv.ext\n intro l; simp\n obtain ⟨x, y, _, rfl⟩ := @IsFractionRing.div_surjective (B ⧸ Q) _ L _ _ _ l\n unfold IsFractionRing.algEquiv_lift\n unfold IsFractionRing.ringEquivOfRingEquiv\n simp\n map_mul' := by\n intro ⟨x, hx⟩ ⟨y, hy⟩\n apply AlgEquiv.ext\n intro l; dsimp\n obtain ⟨r, s, _, rfl⟩ := @IsFractionRing.div_surjective (B ⧸ Q) _ L _ _ _ l\n unfold IsFractionRing.algEquiv_lift\n unfold IsFractionRing.ringEquivOfRingEquiv\n simp\n sorry\n\nvariable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a) in\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nThe map $g\\mapsto \\phi _g$ from $D_Q$ to $\\operatorname{Aut}_K(L)$ defined above is surjective."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem MulAction.stabilizer_surjective_of_action : Function.Surjective (λ g ↦ stabilizer.toGaloisGroup g.toSemigroupAlgebra) := by sorry"}
3
+ {"prediction": "theorem MulAction.stabilizer_surjective_of_action : Function.Surjective (λ g ↦ quotientAlgebraAction g.1 g.2) := by sorry"}
4
+ {"prediction": "theorem MulAction.stabilizer_surjective_of_action : Function.Surjective (λ g ↦ (stabilizer.toGaloisGroup g).toMap) := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-8bcddfa94beb4903b5553e5c27a814b2",
3
+ "created": 1749028655,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "noncomputable def GaloisGroup.mk (G : Type*) [Group G] [MulSemiringAction G B]\n : G →+* (B ⧸ Q) ≃ₗ[K] B ⧸ Q where\n __ := MulSemiringAction.toRingEquiv G B\n commutes' ",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "def frosh (g : G) : (B ⧸ Q) ≃ₗ[K] (B ⧸ Q) ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "theorem my_favorite_theorem : Function.Surjective (λ g ↦ stabilizer.toGaloisGroup g.toSemigroupAlgebra) ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "noncomputable def frobeniusConjugacyClass (F : Ideal B) : Ideal B ≃ₗ[K] Ideal.L where\n __ := Ideal.mk_surjective _ _\n commutes' ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "def frobeniusElement (g : G) (hg : g • Q = Q) : ((B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q)ˣ :=\n",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "noncomputable def frobeniusMap : MulAction.stabilizer G Q →* (L ≃ₗ[K] L) ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "def gToAuto (g : G) : (B ⧸ Q) ≃ₗ[K] (B ⧸ Q) ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "noncomputable def frobenius (g : G) : L ≃ₗ[K] L ",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "noncomputable def frobeniusElements (G : Type*) [Group G] [Finite G] [MulSemiringAction G B]\n (Q : Ideal B) [hQ : Ideal.IsPrime Q] (hQ1 : Q ≠ ⊥) (hQ2 : Q ≠ ⊤) :\n (MulAction.stabilizer G Q).Surjective ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "noncomputable def frobenius_element (g : G) : (B ⧸ Q) ≃ₗ[K] (B ⧸ Q) where\n __ := quotientAlgebraAction Q P g Pgh\n commutes' ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "noncomputable def frobenius (g : G) : L ≃ₗ[K] L ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "noncomputable def frobeniusMonoidHom (gh : Pointwise.quotientAlgebraActionMonoidHom Q P) : DihedralMonoidHom Q (B ⧸ Q) K L ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "noncomputable def frobenius conjugacy_class : MulAction.stabilizer G Q →* (L ≃ₐ[K] L) × conjugacy_class G (MulAction.stabilizer G Q) ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "noncomputable def frobenius (g : MulAction.stabilizer G Q) : (B ⧸ Q) ≃ₗ[K] (B ⧸ Q) ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "noncomputable def frobeniusMap (g : G) : (B ⧸ Q) ≃ₗ[K] L ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "noncomputable def frobenius (P : Ideal B) : G ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "noncomputable def frobenius_element (g : MulAction.stabilizer G Q) : (B ⧸ Q) ≃ₗ[K] B ⧸ Q ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "def map_gh (gh : Pointwise.quotientAlgebraActionMonoidHom Q P) : (G →* (L ≃ₐ[K] L)) ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "noncomputable def frobenius (p : Ideal B) : G ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "noncomputable def frobeniusConjugacyClass : Ideal G (B ⧸ Q) ≃* Ideal G (B ⧸ Q) ⧸ span ({⟨1, by norm_num⟩} : Set (Ideal G (B ⧸ Q))) ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "noncomputable def frobenius conjugacyGroup : MulAction stabilizer G Q →* (L ≃ₗ[K] L) ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "noncomputable def frobenius conjugacyClass : (MulAction stabs G Q) →* ((B ⧸ Q) ≃ₐ[A ⧸ P] B ⧸ Q) ",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "def frobenius_element (Q : Ideal B) : MulAction stably G Q :=\n",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "def frobenius_automorphism (p : Ideal B) : (B ⧸ p) ≃ₗ[K]ₗ[K] (B ⧸ p) ",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "def isFrobenius (g : MulAction.stabilizer G Q) : Prop :=\n g.toMonoidHom ∘ g.toGaloisGroup = id ∧ g.toMonoidHom ∘ g.toGalL ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "noncomputable def frobenius conjugacyClass : Ideal B → G → Prop where\n intro Q g; apply instDecidablePredicates; intro _\n have : g • Q = Q ↔ ∃ a : A, a • Q = Q ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "noncomputable def frobenius (g : MulAction.stabilizer G Q) : (B ⧸ Q) ≃ₗ[K] L ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "theorem my_favorite_theorem : Function.Surjective (λ g ↦ quotientAlgebraAction g.1 g.2) ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "noncomputable def GaloisGroup : Type* := MulAction.stabilizer G Q\n\nnoncomputable def frobeniusElements : Type* := MulAction.stabilizer G Q\n\nnoncomputable def conjugacyClasses : Type* := MulAction.stabilizer G Q\n\nnoncomputable def LocalFrobenius : Type* := MulAction.stabilizer G Q\n\nnoncomputable def SeparableL closure : Type* := MulAction.stabilizer G Q\n\nnoncomputable def light Bulb : Type* := MulAction.stabilizer G Q\n\nnoncomputable defheavy Bulb : Type* := MulAction.stabilizer G Q\n\nnoncomputable def extensionVariables : Type* := MulAction.stabilizer G Q\n\nnoncomputable def sectionVariables : Type* := MulAction.stabilizer G Q\n\nnoncomputable def baseVariables : Type* := MulAction.stabilizer G Q\n\nnoncomputable def daydreamVariables : Type* := MulAction.stabilizer G Q\n\nnoncomputable def _root_.Ideal.IsPrime.mem_iff_exists : Ideal B → Prop ",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "def frobeniusConjugacyClass : Ideal B → G → (Ideal B ⧸ span ({↑g, ↑g⁻¹} : Set (Ideal B))) ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] [Fintype G] : G ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "noncomputable def frobenius conj action : G →* (L ≃ₐ[K] L) ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "noncomputable def frobenius (P : Ideal B) (g : G) : B ⧸ P ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def frobenius (p : Ideal B) : G ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "noncomputable def Dijkstra_chosen_route (d : Dijkstra_graph (B ⧸ Q) L) : (B ⧸ Q) ≃ₗ[K] L ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "noncomputable def frobenius (Q : Ideal B) (g : G) : (B ⧸ Q) ≃ₗ[K] L where\n __ := Pointwise.quotientAlgebraActionMonoidHom Q P g\n commutes' ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "noncomputable def frobenius(L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]\n [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L] (hQ : Q ≠ ⊥) (hP : P ≠ ⊥) : (B ⧸ Q) ≃ₗ[K] L ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "noncomputable def frobenius conjugacy : G ≃* (L ≃ₐ[K] L) ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "noncomputable def frobenius_element (Q : Ideal B) (hQ : Q.IsPrime) : (B ⧸ Q) ≃ₗ[K] L where\n __ := Pointwise.quotientAlgebraActionMonoidHom Q P\n commutes' ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable def frobenius_element (g : MulAction.stabilizer G Q) : g ≃* (L ≃ₗ[K] L) where\n toFun g ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "noncomputable def frobenius_element (g : MulAction.stabilizer G Q) : (B ⧸ Q) ≃ₐ[K] L where\n __ := Pointwise.quotientAlgebraActionMonoidHom Q P g.toMonoidHom\n commutes' ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "theorem my_favorite_theorem : Function.Surjective (λ g ↦ (stabilizer.toGaloisGroup g).toMap) ",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "noncomputable def frobeniusMonoidHom (Q : Ideal B) (g : G) : (B ⧸ Q) ≃ₗ[K] L where\n __ := Pointwise.quotientAlgebraActionMonoidHom Q P ( MulAction.mk_g hx )\n commutes' ",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "noncomputable def D := Ideal.Quotient.mk Q Q gh.1 gh.2\n\nnoncomputable def Aut := IsFractionRing.ringEquivOfRingEquiv (Pointwise.quotientAlgebraActionMonoidHom Q P gh)\n\nnoncomputable def phi := Ideal.Quotient.mk_surjective\n\nnoncomputable def hD : ∀ g, g • phi = phi ↔ g = 1 ∨ g = gh.1 ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "def frobenius (g : G) : (B ⧸ Q) ≃ₗ[K] L ",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "noncomputable def frobenius (Q : Ideal B) : Ideal B ≃ₗ[K] Ideal.B :=\n Ideal.mkHomIdealAlgebraUnit _ _ frobenius kaushalpah\n\nnoncomputable def frobenius conjugate : Ideal B ≃ₗ[K] Ideal.B ≃ₗ[K] Ideal.B ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "noncomputable def frobenius conjugacy class ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "def frobenius_element (F : Ideal B) : G ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "noncomputable def frobenius conjugacy_class : Ideal B → G → (Ideal B ≃ₗ[K] Ideal B) → Prop ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "noncomputable def frobenius_element (p : Ideal B) (g : G) : Ideal B ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 2258,
511
+ "prompt_tokens": 2239,
512
+ "total_tokens": 4497,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.MulAction.stabilizer_surjective_of_action/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": "theorem MulAction.stabilizer_surjective_of_action : Function.Surjective (λ g ↦ stabilizer.toGaloisGroup g.toSemigroupAlgebra) := by sorry", "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": "theorem MulAction.stabilizer_surjective_of_action : Function.Surjective (λ g ↦ quotientAlgebraAction g.1 g.2) := by sorry", "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": "theorem MulAction.stabilizer_surjective_of_action : Function.Surjective (λ g ↦ (stabilizer.toGaloisGroup g).toMap) := by sorry", "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/ground_truth.lean ADDED
@@ -0,0 +1,764 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Jou Glasheen. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Jou Glasheen, Amelia Livingston, Jujian Zhang, Kevin Buzzard
5
+ -/
6
+ import Mathlib.FieldTheory.Cardinality
7
+ import Mathlib.RingTheory.DedekindDomain.Ideal
8
+ import Mathlib.RingTheory.Ideal.Pointwise
9
+ import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
10
+ import Mathlib.RingTheory.Ideal.Pointwise
11
+ import Mathlib.RingTheory.Ideal.Over
12
+ import Mathlib.FieldTheory.Normal
13
+ import Mathlib.FieldTheory.SeparableClosure
14
+ import Mathlib.RingTheory.OreLocalization.Ring
15
+
16
+ /-!
17
+
18
+ # Frobenius elements.
19
+
20
+ This file proves a general result in commutative algebra which can be used to define Frobenius
21
+ elements of Galois groups of local or fields (for example number fields).
22
+
23
+ KB was alerted to this very general result (which needs no Noetherian or finiteness assumptions
24
+ on the rings, just on the Galois group) by Joel Riou
25
+ here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112
26
+
27
+ ## Mathematical details
28
+
29
+ ### The general commutative algebra result
30
+
31
+ This is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.
32
+ Let `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,
33
+ such that the `G`-invariants of `B` are exactly the image of `A`.
34
+
35
+ The two claims of the theorem are:
36
+ (i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.
37
+ (ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`
38
+ in `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is
39
+ surjective.
40
+
41
+ We say "automorphism group" rather than "Galois group" because the extension might not be
42
+ separable (it is algebraic and normal however, but it can be infinite; however its maximal
43
+ separable subextension is finite).
44
+
45
+ This result means that if the inertia group I_Q is trivial and the residue fields are finite,
46
+ there's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class
47
+ Frob_P in G.
48
+
49
+ -/
50
+
51
+
52
+ variable {A : Type*} [CommRing A]
53
+ {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]
54
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
55
+
56
+
57
+
58
+ open scoped algebraMap
59
+
60
+ --variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
61
+ --variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
62
+
63
+ section misc
64
+
65
+ variable {A : Type*} [CommRing A]
66
+ {B : Type*} [CommRing B] [Algebra A B]
67
+ {G : Type*} [Group G] [MulSemiringAction G B]
68
+ [SMulCommClass G A B]
69
+
70
+ open scoped Pointwise
71
+
72
+ /-
73
+ If you're happy to stick to finite G, it's just this:
74
+
75
+ private theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
76
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
77
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
78
+ fun x ↦ smul_smul g x b
79
+
80
+ But the below proof works in general.
81
+ -/
82
+
83
+ private theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := by
84
+ obtain (hfin | hinf) := em <| Finite G
85
+ · calc
86
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
87
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
88
+ fun x ↦ smul_smul g x b
89
+ · obtain (rfl | hb) := eq_or_ne b 1
90
+ · simp
91
+ · suffices (Function.mulSupport ((· • b) : G → B)).Infinite by
92
+ classical
93
+ simp [finprod_def, dif_neg this]
94
+ have htop : (⊤ : Set G).Infinite := by simpa using Set.infinite_univ_iff.mpr ({ not_finite := hinf })
95
+ convert htop
96
+ rw [eq_top_iff]
97
+ intro g _
98
+ simp only [Function.mem_mulSupport]
99
+ contrapose! hb
100
+ apply_fun (fun x ↦ g⁻¹ • x) at hb
101
+ simpa using hb
102
+
103
+ theorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]
104
+ (I : Ideal S) [hI : I.IsPrime] (f : R → S) :
105
+ ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := by
106
+ have := Fintype.ofFinite R
107
+ rw [finprod_eq_prod_of_fintype, Finset.prod_eq_multiset_prod, hI.multiset_prod_mem_iff_exists_mem]
108
+ simp
109
+
110
+ end misc
111
+
112
+ section charpoly
113
+
114
+ open Polynomial BigOperators
115
+
116
+ variable {A : Type*} [CommRing A]
117
+ {B : Type*} [CommRing B] [Algebra A B]
118
+ {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]
119
+
120
+
121
+ variable (G) in
122
+ /-- The characteristic polynomial of an element `b` of a `G`-semiring `B`
123
+ is the polynomial `∏_{g ∈ G} (X - g • b)` (here `G` is finite; junk
124
+ returned in the infinite case) .-/
125
+ noncomputable def MulSemiringAction.CharacteristicPolynomial.F (b : B) : B[X] :=
126
+ ∏ᶠ τ : G, (X - C (τ ��� b))
127
+
128
+ namespace MulSemiringAction.CharacteristicPolynomial
129
+
130
+ theorem F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
131
+
132
+ section F_API
133
+
134
+ variable [Finite G]
135
+
136
+ theorem F_monic [Nontrivial B] (b : B) : (F G b).Monic := by
137
+ have := Fintype.ofFinite G
138
+ rw [Monic, F_spec, finprod_eq_prod_of_fintype, leadingCoeff_prod'] <;> simp
139
+
140
+ theorem F_natdegree [Nontrivial B] (b : B) : (F G b).natDegree = Nat.card G := by
141
+ have := Fintype.ofFinite G
142
+ rw [F_spec, finprod_eq_prod_of_fintype, natDegree_prod_of_monic _ _ (fun _ _ => monic_X_sub_C _)]
143
+ simp only [natDegree_X_sub_C, Finset.sum_const, Finset.card_univ, Fintype.card_eq_nat_card,
144
+ nsmul_eq_mul, mul_one, Nat.cast_id]
145
+
146
+ variable (G) in
147
+ theorem F_degree [Nontrivial B] (b : B) : (F G b).degree = Nat.card G := by
148
+ have := Fintype.ofFinite G
149
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos, F_natdegree]
150
+
151
+ theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
152
+ σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rw [F_spec]
153
+ _ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := smul_finprod' _
154
+ _ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]
155
+ _ = ∏ᶠ τ' : G, (X - C (τ' • b)) := finprod_eq_of_bijective (fun τ ↦ σ * τ)
156
+ (Group.mulLeft_bijective σ) (fun _ ↦ rfl)
157
+ _ = F G b := by rw [F_spec]
158
+
159
+ theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
160
+ let foo := Fintype.ofFinite G
161
+ simp [F_spec,finprod_eq_prod_of_fintype,eval_prod]
162
+ apply @Finset.prod_eq_zero _ _ _ _ _ (1 : G) (Finset.mem_univ 1)
163
+ simp
164
+
165
+ private theorem F_coeff_fixed (b : B) (n : ℕ) (g : G) :
166
+ g • (F G b).coeff n = (F G b).coeff n := by
167
+ change (g • (F G b)).coeff n = _
168
+ rw [F_smul_eq_self]
169
+
170
+ end F_API
171
+
172
+ open scoped algebraMap
173
+
174
+ noncomputable local instance : Algebra A[X] B[X] :=
175
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
176
+
177
+ @[simp, norm_cast]
178
+ theorem _root_.coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
179
+ map_monomial _
180
+
181
+ section full_descent
182
+
183
+ variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
184
+
185
+ -- Remark: the `splitting_of_full` approach is lousy and should be
186
+ -- replaced by the commented-out code below (lines 275-296 currently)
187
+
188
+ /-- This "splitting" function from B to A will only ever be evaluated on
189
+ G-invariant elements of B, and the two key facts about it are
190
+ that it lifts such an element to `A`, and for reasons of
191
+ convenience it lifts `1` to `1`. -/
192
+ noncomputable def splitting_of_full
193
+ (b : B) : A := by classical
194
+ exact
195
+ if b = 1 then 1 else
196
+ if h : ∀ σ : G, σ • b = b then (hFull b h).choose
197
+ else 37
198
+
199
+ theorem splitting_of_full_spec {b : B} (hb : ∀ σ : G, σ • b = b) :
200
+ splitting_of_full hFull b = b := by
201
+ unfold splitting_of_full
202
+ split_ifs with h1
203
+ · rw_mod_cast [h1]
204
+ · exact (hFull b hb).choose_spec.symm
205
+
206
+ theorem splitting_of_full_one : splitting_of_full hFull 1 = 1 := by
207
+ unfold splitting_of_full
208
+ rw [if_pos rfl]
209
+
210
+ noncomputable def M (b : B) : A[X] :=
211
+ (∑ x ∈ (F G b).support, monomial x (splitting_of_full hFull ((F G b).coeff x)))
212
+
213
+ theorem M_deg_le (b : B) : (M hFull b).degree ≤ (F G b).degree := by
214
+ unfold M
215
+ have := Polynomial.degree_sum_le (F G b).support (fun x => monomial x (splitting_of_full hFull ((F G b).coeff x)))
216
+ refine le_trans this ?_
217
+ rw [Finset.sup_le_iff]
218
+ intro n hn
219
+ apply le_trans (degree_monomial_le n _) ?_
220
+ exact le_degree_of_mem_supp n hn
221
+
222
+ variable [Nontrivial B] [Finite G]
223
+
224
+ theorem M_coeff_card (b : B) :
225
+ (M hFull b).coeff (Nat.card G) = 1 := by
226
+ unfold M
227
+ simp only [finset_sum_coeff]
228
+ have hdeg := F_degree G b
229
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos] at hdeg
230
+ rw [ ← hdeg]
231
+ rw [Finset.sum_eq_single_of_mem ((F G b).natDegree)]
232
+ · have : (F G b).Monic := F_monic b
233
+ simp
234
+ simp_all [splitting_of_full_one]
235
+ · refine natDegree_mem_support_of_nonzero ?h.H
236
+ intro h
237
+ rw [h] at hdeg
238
+ have : 0 < Nat.card G := Nat.card_pos
239
+ simp_all
240
+ · intro d _ hd
241
+ exact coeff_monomial_of_ne (splitting_of_full hFull ((F G b).coeff d)) hd
242
+
243
+ theorem M_deg_eq_F_deg [Nontrivial A] (b : B) : (M hFull b).degree = (F G b).degree := by
244
+ apply le_antisymm (M_deg_le hFull b)
245
+ rw [F_degree]
246
+ have := M_coeff_card hFull b
247
+ refine le_degree_of_ne_zero ?h
248
+ rw [this]
249
+ exact one_ne_zero
250
+
251
+ theorem M_deg [Nontrivial A] (b : B) : (M hFull b).degree = Nat.card G := by
252
+ rw [M_deg_eq_F_deg hFull b]
253
+ exact F_degree G b
254
+
255
+ theorem M_monic (b : B) : (M hFull b).Monic := by
256
+ have this1 := M_deg_le hFull b
257
+ have this2 := M_coeff_card hFull b
258
+ have this3 : 0 < Nat.card G := Nat.card_pos
259
+ rw [← F_natdegree b] at this2 this3
260
+ -- then the hypos say deg(M)<=n, coefficient of X^n is 1 in M
261
+ have this4 : (M hFull b).natDegree ≤ (F G b).natDegree := natDegree_le_natDegree this1
262
+ exact Polynomial.monic_of_natDegree_le_of_coeff_eq_one _ this4 this2
263
+
264
+ omit [Nontrivial B] in
265
+ theorem M_spec (b : B) : ((M hFull b : A[X]) : B[X]) = F G b := by
266
+ unfold M
267
+ ext N
268
+ push_cast
269
+ simp_rw [splitting_of_full_spec hFull <| F_coeff_fixed b _]
270
+ simp_rw [finset_sum_coeff, ← lcoeff_apply, lcoeff_apply, coeff_monomial]
271
+ aesop
272
+
273
+ omit [Nontrivial B] in
274
+ theorem M_spec_map (b : B) : (map (algebraMap A B) (M hFull b)) = F G b := by
275
+ rw [← M_spec hFull b]; rfl
276
+
277
+ omit [Nontrivial B] in
278
+ theorem M_eval_eq_zero (b : B) : (M hFull b).eval₂ (algebraMap A B) b = 0 := by
279
+ rw [eval₂_eq_eval_map, M_spec_map, F_eval_eq_zero]
280
+
281
+ include hFull in
282
+ theorem isIntegral : Algebra.IsIntegral A B where
283
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
284
+
285
+ end full_descent
286
+
287
+ end MulSemiringAction.CharacteristicPolynomial
288
+
289
+ end charpoly
290
+
291
+ section part_a
292
+
293
+ open MulSemiringAction.CharacteristicPolynomial
294
+
295
+ variable {A : Type*} [CommRing A]
296
+ {B : Type*} [CommRing B] [Algebra A B] [Nontrivial B]
297
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
298
+
299
+ theorem isIntegral_of_Full (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
300
+ Algebra.IsIntegral A B where
301
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
302
+
303
+ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
304
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
305
+
306
+ open scoped Pointwise
307
+
308
+ theorem Nontrivial_of_exists_prime {R : Type*} [CommRing R]
309
+ (h : ∃ P : Ideal R, P.IsPrime) : Nontrivial R := by
310
+ contrapose! h
311
+ intro P hP
312
+ rw [@not_nontrivial_iff_subsingleton] at h
313
+ obtain ⟨h, _⟩ := hP
314
+ apply h
315
+ apply Subsingleton.elim
316
+
317
+ -- (Part a of Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
318
+ omit [Nontrivial B] in
319
+ theorem part_a [SMulCommClass G A B]
320
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
321
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
322
+ ∃ g : G, Q = g • P := by
323
+ haveI : Nontrivial B := Nontrivial_of_exists_prime ⟨Q, inferInstance⟩
324
+ haveI : Algebra.IsIntegral A B := isIntegral_of_Full hFull'
325
+ cases nonempty_fintype G
326
+ suffices ∃ g : G, Q ≤ g • P by
327
+ obtain ⟨g, hg⟩ := this
328
+ use g
329
+ by_contra! hQ
330
+ have : Q < g • P := lt_of_le_of_ne hg hQ
331
+ obtain ⟨x, hxP, hxQ⟩ := Set.exists_of_ssubset <| this
332
+ apply (Ideal.comap_lt_comap_of_integral_mem_sdiff (R := A) hg ⟨hxP, hxQ⟩ <|
333
+ Algebra.isIntegral_def.1 inferInstance x).ne
334
+ rw [← hPQ]
335
+ ext x
336
+ specialize hFull' (algebraMap A B x)
337
+ have : ∀ (g : G), g • (algebraMap A B x) = (algebraMap A B x) := fun g ↦ by
338
+ rw [Algebra.algebraMap_eq_smul_one, smul_comm, smul_one]
339
+ simp only [Ideal.mem_comap]
340
+ nth_rw 2 [← this]
341
+ exact Ideal.smul_mem_pointwise_smul_iff.symm
342
+ suffices ∃ g ∈ (⊤ : Finset G), Q ≤ g • P by
343
+ convert this; simp
344
+ rw [← Ideal.subset_union_prime 1 1 <| fun g _ _ _ ↦ ?_]; swap
345
+ · exact Ideal.map_isPrime_of_equiv (MulSemiringAction.toRingEquiv _ _ g)
346
+ intro x hx
347
+ specialize hFull' (∏ᶠ σ : G, σ • x)
348
+ obtain ⟨a, ha⟩ := hFull' (norm_fixed _)
349
+ have : (a : B) ∈ Q := by
350
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem]
351
+ use 1
352
+ simpa using hx
353
+ have : (a : B) ∈ P := by
354
+ unfold Algebra.cast
355
+ rwa [← Ideal.mem_comap, hPQ, Ideal.mem_comap]
356
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem] at this
357
+ obtain ⟨σ, hσ⟩ : ∃ σ : G, σ • x ∈ P := this
358
+ simp only [Finset.top_eq_univ, Finset.coe_univ, Set.mem_univ, Set.iUnion_true, Set.mem_iUnion,
359
+ SetLike.mem_coe]
360
+ use σ⁻¹
361
+ rwa [Ideal.mem_inv_pointwise_smul_iff]
362
+
363
+ end part_a
364
+
365
+ -- section normal_elements
366
+ -- I'm going to avoid this because I'm just going to use scaling.
367
+ -- I'll show that every nonzero element of B/Q divides an element of A/P.
368
+
369
+ -- variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
370
+
371
+ -- open Polynomial
372
+
373
+ -- I've commented out the next section because ACL suggested
374
+ -- reading up-to-date Bourbaki here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
375
+ -- and apparently this will avoid the def below.
376
+
377
+ -- def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
378
+
379
+ -- namespace IsNormalElement
380
+
381
+ -- theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
382
+ -- IsNormalElement K x ↔
383
+ -- ∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
384
+ -- constructor
385
+ -- · intro h
386
+ -- exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
387
+ -- · rintro ⟨P, hPmonic, hPeval, hPsplits⟩
388
+ -- -- need min poly divides P and then it should all be over
389
+ -- sorry -- presumably some form of this is in the library
390
+
391
+ -- theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
392
+ -- (hx : IsNormalElement K x) (hy : IsNormalElement K y) :
393
+ -- IsNormalElement K (x * y) := by
394
+ -- rw [iff_exists_monic_splits K hxint] at hx
395
+ -- obtain ⟨Px, hx1, hx2, hx3⟩ := hx
396
+ -- rw [iff_exists_monic_splits K hyint] at hy
397
+ -- obtain ⟨Py, hy1, hy2, hy3⟩ := hy
398
+ -- rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
399
+ -- -- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
400
+ -- -- Do we have this?
401
+ -- -- Is this even the best way to go about this?
402
+ -- -- Note: Chambert-Loir says there's a proof in Bourbaki
403
+ -- sorry
404
+
405
+ -- -- API
406
+
407
+ -- end IsNormalElement
408
+
409
+ -- end normal_elements
410
+
411
+ section part_b
412
+
413
+ variable {A : Type*} [CommRing A]
414
+ {B : Type*} [CommRing B] [Algebra A B]
415
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B]
416
+
417
+ /-
418
+ Set-up for part (b) of the lemma. G acts on B with invariants A (or more precisely the
419
+ image of A). Warning: `P` was a prime ideal of `B` in part (a) but it's a prime ideal
420
+ of `A` here, in fact it's `Q ∩ A`, the preimage of `Q` in `A`.
421
+
422
+ We want to consider the following commutative diagram.
423
+
424
+ B ---> B / Q -----> L = Frac(B/Q)
425
+ /\ /\ /\
426
+ | | |
427
+ | | |
428
+ A ---> A / P ----> K = Frac(A/P)
429
+
430
+ We will get to L, K, and the second square later.
431
+ First let's explain how to do P and Q.
432
+ -/
433
+ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
434
+ -- #synth Algebra A (B ⧸ Q) #exit -- works
435
+ ---synth IsScalarTower A B (B ⧸ Q) #exit-- works
436
+ -- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the
437
+ -- commutativity of the diagram! This is a trick I learnt from Jou who apparently
438
+ -- learnt it from Amelia
439
+ [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]
440
+ -- So now we know the left square commutes.
441
+ -- Amelia's first trick: commutativity of th LH diagram implies `P ⊆ Q ∩ A`
442
+ -- For the map `A -> A/P -> B/Q` must equal the map `A -> B -> B/Q` so `P` must
443
+ -- be a subset of the kernel of `A → B/Q`, which is `A ∩ Q`
444
+
445
+ omit [P.IsPrime] in
446
+ theorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :
447
+ algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
448
+ Ideal.Quotient.eq_zero_iff_mem
449
+
450
+ section B_mod_Q_over_A_mod_P_stuff
451
+
452
+ section Mathlib.RingTheory.Ideal.Quotient
453
+
454
+ namespace Ideal
455
+
456
+ variable {R : Type*} [CommRing R] {I : Ideal R}
457
+
458
+ protected noncomputable
459
+ def Quotient.out (x : R ⧸ I) :=
460
+ Quotient.out' x
461
+
462
+ theorem Quotient.out_eq (x : R ⧸ I) : Ideal.Quotient.mk I (Ideal.Quotient.out x) = x := by
463
+ simp only [Ideal.Quotient.out, Ideal.Quotient.mk, RingHom.coe_mk, MonoidHom.coe_mk, OneHom.coe_mk,
464
+ Submodule.Quotient.mk, Quotient.out_eq']
465
+
466
+ @[elab_as_elim]
467
+ protected theorem Quotient.induction_on
468
+ {p : R ⧸ I → Prop} (x : R ⧸ I) (h : ∀ a, p (Ideal.Quotient.mk I a)) : p x :=
469
+ Quotient.inductionOn x h
470
+
471
+ end Ideal
472
+
473
+ end Mathlib.RingTheory.Ideal.Quotient
474
+
475
+ namespace MulSemiringAction.CharacteristicPolynomial
476
+
477
+
478
+ open Polynomial
479
+ /-
480
+ I didn't check that this definition was independent
481
+ of the lift `b` of `bbar` (and it might not even be true).
482
+ But this doesn't matter, because `G` no longer acts on `B/Q`.
483
+ All we need is that `Mbar` is monic of degree `|G|`, is defined over the bottom ring
484
+ and kills `bbar`.
485
+ -/
486
+ variable {Q} in
487
+ noncomputable def Mbar
488
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
489
+ (bbar : B ⧸ Q) : (A ⧸ P)[X] :=
490
+ Polynomial.map (Ideal.Quotient.mk P) <| M hFull' <| Ideal.Quotient.out bbar
491
+
492
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
493
+
494
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
495
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
496
+ theorem Mbar_monic [Nontrivial B] (bbar : B ⧸ Q) : (Mbar P hFull' bbar).Monic := by
497
+ have := M_monic hFull'
498
+ simp [Mbar, (M_monic hFull' _).map]
499
+
500
+ omit [SMulCommClass G A B] [Q.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
501
+ theorem Mbar_deg [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
502
+ degree (Mbar P hFull' bbar) = Nat.card G := by
503
+ simp only [Mbar]
504
+ rw [degree_map_eq_of_leadingCoeff_ne_zero]
505
+ · exact M_deg hFull' _
506
+ · rw [(M_monic hFull' _).leadingCoeff]
507
+ simp only [map_one, ne_eq, one_ne_zero, not_false_eq_true]
508
+
509
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
510
+ theorem Mbar_eval_eq_zero [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
511
+ eval₂ (algebraMap (A ⧸ P) (B ⧸ Q)) bbar (Mbar P hFull' bbar) = 0 := by
512
+ have h := congr_arg (algebraMap B (B ⧸ Q)) (M_eval_eq_zero hFull' (Ideal.Quotient.out bbar))
513
+ rw [map_zero, hom_eval₂, Ideal.Quotient.algebraMap_eq, Ideal.Quotient.out_eq] at h
514
+ simpa [Mbar, eval₂_map, ← Ideal.Quotient.algebraMap_eq,
515
+ ← IsScalarTower.algebraMap_eq A (A ⧸ P) (B ⧸ Q), IsScalarTower.algebraMap_eq A B (B ⧸ Q)]
516
+
517
+ end CharacteristicPolynomial
518
+
519
+ open CharacteristicPolynomial in
520
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
521
+ theorem reduction_isIntegral
522
+ [Nontrivial A] [Nontrivial B]
523
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
524
+ Algebra.IsIntegral (A ⧸ P) (B ⧸ Q) where
525
+ isIntegral x := ⟨Mbar P hFull' x, Mbar_monic Q P hFull' x, Mbar_eval_eq_zero Q P hFull' x⟩
526
+
527
+ end MulSemiringAction
528
+
529
+ theorem Polynomial.nonzero_const_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
530
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
531
+ ∃ (q : Polynomial R), q.coeff 0 ≠ 0 ∧ q.eval₂ (algebraMap R S) s = 0 := by
532
+ obtain ⟨p, p_monic, p_eval⟩ := (@Algebra.isIntegral_def R S).mp inferInstance s
533
+ have p_nzero := ne_zero_of_ne_zero_of_monic X_ne_zero p_monic
534
+ obtain ⟨q, p_eq, q_ndvd⟩ := Polynomial.exists_eq_pow_rootMultiplicity_mul_and_not_dvd p p_nzero 0
535
+ rw [C_0, sub_zero] at p_eq
536
+ rw [C_0, sub_zero] at q_ndvd
537
+ use q
538
+ constructor
539
+ . intro q_coeff_0
540
+ exact q_ndvd <| X_dvd_iff.mpr q_coeff_0
541
+ . rw [p_eq, eval₂_mul] at p_eval
542
+ rcases NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero p_eval with Xpow_eval | q_eval
543
+ . by_contra
544
+ apply hs
545
+ rw [eval₂_X_pow] at Xpow_eval
546
+ exact pow_eq_zero Xpow_eval
547
+ . exact q_eval
548
+
549
+ theorem Algebra.exists_dvd_nonzero_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
550
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
551
+ ∃ r : R, r ≠ 0 ∧ s ∣ (algebraMap R S) r := by
552
+ obtain ⟨q, q_zero_coeff, q_eval_zero⟩ := Polynomial.nonzero_const_if_isIntegral R S s hs
553
+ use q.coeff 0
554
+ refine ⟨q_zero_coeff, ?_⟩
555
+ rw [← Polynomial.eval₂_X (algebraMap R S) s, ← dvd_neg, ← Polynomial.eval₂_C (algebraMap R S) s]
556
+ rw [← zero_add (-_), Mathlib.Tactic.RingNF.add_neg, ← q_eval_zero, ← Polynomial.eval₂_sub]
557
+ apply Polynomial.eval₂_dvd
558
+ exact Polynomial.X_dvd_sub_C
559
+
560
+ end B_mod_Q_over_A_mod_P_stuff
561
+
562
+ /-
563
+ \section{The extension $L/K$.}
564
+
565
+ \begin{theorem}
566
+ \label{foo1}
567
+ If $\lambda\in L$ then there's a monic polynomial $P_\lambda\in K[X]$ of degree $|G|$
568
+ with $\lambda$ as a root, and which splits completely in $L[X]$.
569
+ \end{theorem}
570
+ \begin{proof}
571
+ A general $\lambda\in L$ can be written as $\beta_1/\beta_2$ where $\beta_1,\beta_2\in B/Q$.
572
+ The previous corollary showed that there's some nonzero $\alpha\in A/P$ such that $\beta_2$
573
+ divides $\alpha$, and hence $\alpha\lambda\in B/Q$ (we just cleared denominators).
574
+ Thus $\alpha\lambda$ is a root of some monic polynomial $f(x)\in (A/P)[X]$,
575
+ by~\ref{MulSemiringAction.CharacteristicPolynomial.Mbar_eval_eq_zero}.
576
+ The polynomial $f(\alpha x)\in (A/P)[X]$ thus
577
+ has $\lambda$ as a root, but it is not monic; its leading term is $\alpha^n$.
578
+ Dividing through in $K[X]$ gives us the polynomial we seek.
579
+ \end{proof}
580
+
581
+ \begin{corollary} The extension $L/K$ is algebraic and normal.
582
+ \end{corollary}
583
+ \begin{proof} \uses{foo1}
584
+ Exercise using the previous theorem.
585
+ \end{proof}
586
+
587
+ Note that $L/K$ might not be separable and might have infinite degree. However
588
+
589
+ \begin{corollary} Any subextension of $L/K$ which is finite and separable over $K$
590
+ has degree at most $|G|$.
591
+ \end{corollary}
592
+ \begin{proof}
593
+ Finite and separable implies simple, and we've already seen that any
594
+ element of $L$ has degree at most $|G|$ over $K$.
595
+ \end{proof}
596
+
597
+ \begin{corollary} The maximal separable subextension $M$ of $L/K$ has degree at most $|G|$.
598
+ \end{corollary}
599
+ \begin{proof} If it has dimension greater than $|G|$ over $K$, then it has a finitely-generated
600
+ subfeld of $K$-dimension greater than $|G|$, and is finite and separable, contradicting
601
+ the previous result.
602
+ \end{proof}
603
+
604
+ \begin{corollary} $\Aut_K(L)$ is finite.
605
+ \end{corollary}
606
+ \begin{proof} Any $K$-automorphism of $L$ is determined by where it sends $M$.
607
+ \end{proof}
608
+
609
+ \begin{corollary} $\Aut_{A/P}(B/Q)$ is finite.
610
+ \end{corollary}
611
+ \begin{proof}
612
+ Two elements of $\Aut_{A/P}(B/Q)$ which agree once extended to automorphisms of $L$
613
+ must have already been equal, as $B/Q\subseteq L$. Hence the canonical map
614
+ from $\Aut_{A/P}(B/Q)$ to $\Aut_K(L)$ is injective.
615
+ \end{proof}
616
+
617
+ \section{Proof of surjectivity.}
618
+
619
+ \begin{definition} We fix once and for all some nonzero $y\in B/Q$ such that $M=K(y)$,
620
+ with $M$ the maximal separable subextension of $L/K$.
621
+ \end{definition}
622
+
623
+ Note that the existence of some $\lambda\in L$ with this property just comes from finite
624
+ and separable implies simple; we can use the ``clear denominator'' technique introduced
625
+ earlier to scale this by some nonzero $\alpha\in A$ into $B/Q$, as
626
+ $K(\lambda)=K(\alpha\lambda)$.
627
+
628
+ Here is a slightly delicate result whose proof I haven't thought too hard about.
629
+ \begin{theorem} There exists some $x\in B$ and $\alpha\in A$ with the following
630
+ properties.
631
+ \begin{enumerate}
632
+ \item $x=\alpha y$ mod $Q$ and $\alpha$ isn't zero mod $Q$.
633
+ \item $x\in Q'$ for all $Q'\not=Q$ in the $G$-orbit of $Q$.
634
+ \end{enumerate}
635
+ \end{theorem}
636
+ \begin{proof}
637
+ Idea. Localise away from P, then all the $Q_i$ are maximal, use CRT and then clear denominators.
638
+ \end{proof}
639
+
640
+ We now choose some $x\in B[1/S]$ which is $y$ modulo $Q$ and $0$ modulo all the other
641
+ primes of $B$ above $P$, and consider the monic degree $|G|$ polynomial $f$ in $K[X]$
642
+ with $x$ and its conjugates as roots. If $\sigma\in\Aut_K(L)$ then $\sigma(\overline{x})$
643
+ is a root of $f$ as $\sigma$ fixes $K$ pointwise. Hence $\sigma(\overline{x})=\overline{g(x)}$
644
+ for some $g\in G$, and because $\sigma(\overline{x})\not=0$ we have $\overline{g(x)}\not=0$
645
+ and hence $g(x)\notin Q[1/S]$. Hence $x\notin g^{-1} Q[1/S]$ and thus $g^{-1}Q=Q$ and $g\in SD_Q$.
646
+ Finally we have $\phi_g=\sigma$ on $K$ and on $y$, so they are equal on $M$ and hence on $L$ as
647
+ $L/M$ is purely inseparable.
648
+
649
+ This part of the argument seems weak.
650
+ -/
651
+
652
+ section L_over_K_stuff
653
+
654
+ -- Let's now make the right square. First `L`
655
+ variable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]
656
+ -- Now top left triangle: A / P → B / Q → L commutes
657
+ [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
658
+ -- now introduce K
659
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
660
+ -- now make bottom triangle commute
661
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L]
662
+ -- So now both squares commute.
663
+
664
+ -- do I need this?
665
+ -- [Algebra A K] [IsScalarTower A (A ⧸ P) K]
666
+
667
+ -- Do I need this:
668
+ -- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
669
+
670
+ variable [Nontrivial B]
671
+
672
+
673
+ -- Do we need a version of Ideal.Quotient.eq_zero_iff_mem with algebraMap?
674
+
675
+
676
+ -- not sure if we need this but let's prove it just to check our setup is OK.
677
+ -- The claim is that the preimage of Q really is P (rather than just containing P)
678
+ -- and the proof is that A/P -> B/Q extends to a map of fields which is injective,
679
+ -- so A/P -> B/Q must also be injective.
680
+ open IsScalarTower in
681
+ example : Ideal.comap (algebraMap A B) Q = P := by
682
+ ext x
683
+ simp only [Ideal.mem_comap]
684
+ rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']
685
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
686
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
687
+ rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]
688
+ rw [← algebraMap_apply A B (B ⧸ Q)]
689
+ rw [← algebraMap_apply (A ⧸ P) K L]
690
+ rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]
691
+ rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
692
+
693
+ open Polynomial BigOperators
694
+
695
+ open scoped algebraMap
696
+
697
+ noncomputable local instance : Algebra A[X] B[X] :=
698
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
699
+
700
+ theorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}
701
+ (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry
702
+
703
+ theorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]
704
+ [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):
705
+ IsAlgebraic K (IsLocalization.mk' S 1 x) := by
706
+ rw [← IsAlgebraic.invOf_iff, IsLocalization.invertible_mk'_one_invOf]
707
+ exact h
708
+
709
+ open MulSemiringAction.CharacteristicPolynomial
710
+
711
+ namespace Bourbaki52222
712
+
713
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in
714
+ variable (G) in
715
+ noncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=
716
+ if x = 0 then monomial (Nat.card G) 1
717
+ else 37 -- this is not actually right. In the nonzero case you
718
+ -- clear denominators with a nonzero element of A, using
719
+ -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar
720
+ -- scaled appropriately.
721
+
722
+ theorem f_exists [DecidableEq L] (l : L) :
723
+ ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧
724
+ eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by
725
+ use Bourbaki52222.residueFieldExtensionPolynomial G L K l
726
+ sorry
727
+
728
+ theorem algebraMap_cast {R S: Type*} [CommRing R] [CommRing S] [Algebra R S] (r : R) :
729
+ (r : S) = (algebraMap R S) r := by
730
+ rfl
731
+
732
+ theorem algebraMap_algebraMap {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] [Algebra R S]
733
+ [Algebra S T] [Algebra R T] [IsScalarTower R S T] (r : R) :
734
+ (algebraMap S T) ((algebraMap R S) r) = (algebraMap R T) r := by
735
+ exact Eq.symm (IsScalarTower.algebraMap_apply R S T r)
736
+
737
+ theorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
738
+ [CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
739
+ (h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
740
+ rw [Algebra.isAlgebraic_def]
741
+ let M := nonZeroDivisors R
742
+ intro x
743
+ have ⟨r, s, h'⟩ := IsLocalization.mk'_surjective M x
744
+ have : x = r * IsLocalization.mk' K 1 s := by
745
+ rw [← h', IsLocalization.mul_mk'_eq_mk'_of_mul]
746
+ simp
747
+ rw [this]
748
+ apply IsAlgebraic.mul (h r)
749
+ exact IsAlgebraic.invLoc (h s)
750
+
751
+ -- this uses `Algebra.isAlgebraic_of_subring_isAlgebraic` but I think we're going to have
752
+ -- to introduce `f` anyway because we need not just that the extension is algebraic but
753
+ -- that every element satisfies a poly of degree <= |G|.
754
+
755
+ theorem algebraic {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]
756
+ [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)
757
+ [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
758
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]
759
+ [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
760
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
761
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]
762
+ [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]
763
+ [IsScalarTower A B L]
764
+ (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by sorry
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/input_messages_compress_3.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.FieldTheory.Cardinality\nimport Mathlib.RingTheory.DedekindDomain.Ideal\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.IntegralClosure.IntegralRestrict\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.Ideal.Over\nimport Mathlib.FieldTheory.Normal\nimport Mathlib.FieldTheory.SeparableClosure\nimport Mathlib.RingTheory.OreLocalization.Ring\n\n/-!\n\n# Frobenius elements.\n\nThis file proves a general result in commutative algebra which can be used to define Frobenius\nelements of Galois groups of local or fields (for example number fields).\n\nKB was alerted to this very general result (which needs no Noetherian or finiteness assumptions\non the rings, just on the Galois group) by Joel Riou\nhere https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112\n\n## Mathematical details\n\n### The general commutative algebra result\n\nThis is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.\nLet `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,\nsuch that the `G`-invariants of `B` are exactly the image of `A`.\n\nThe two claims of the theorem are:\n(i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.\n(ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`\nin `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is\nsurjective.\n\nWe say \"automorphism group\" rather than \"Galois group\" because the extension might not be\nseparable (it is algebraic and normal however, but it can be infinite; however its maximal\nseparable subextension is finite).\n\nThis result means that if the inertia group I_Q is trivial and the residue fields are finite,\nthere's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class\nFrob_P in G.\n\n-/\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nopen scoped algebraMap\n\n--variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)\n--variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n\nsection misc\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B]\n\nopen scoped Pointwise\n\n/-\nIf you're happy to stick to finite G, it's just this:\n\nprivate theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc\n g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _\n... [TRUNCATED] ...\n\nvariable [Nontrivial B]\n\n-- Do we need a version of Ideal.Quotient.eq_zero_iff_mem with algebraMap?\n\n-- not sure if we need this but let's prove it just to check our setup is OK.\n-- The claim is that the preimage of Q really is P (rather than just containing P)\n-- and the proof is that A/P -> B/Q extends to a map of fields which is injective,\n-- so A/P -> B/Q must also be injective.\nopen IsScalarTower in\nexample : Ideal.comap (algebraMap A B) Q = P := by\n ext x\n simp only [Ideal.mem_comap]\n rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']\n rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]\n rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]\n rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]\n rw [← algebraMap_apply A B (B ⧸ Q)]\n rw [← algebraMap_apply (A ⧸ P) K L]\n rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]\n rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]\n\nopen Polynomial BigOperators\n\nopen scoped algebraMap\n\nnoncomputable local instance : Algebra A[X] B[X] :=\n RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))\n\ntheorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}\n (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry\n\ntheorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]\n [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):\n IsAlgebraic K (IsLocalization.mk' S 1 x) := sorry\n\nopen MulSemiringAction.CharacteristicPolynomial\n\nnamespace Bourbaki52222\n\nvariable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in\nvariable (G) in\nnoncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=\n if x = 0 then monomial (Nat.card G) 1\n else 37 -- this is not actually right. In the nonzero case you\n -- clear denominators with a nonzero element of A, using\n -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar\n -- scaled appropriately.\n\ntheorem f_exists [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := sorry\n\ntheorem algebraMap_cast {R S: Type*} [CommRing R] [CommRing S] [Algebra R S] (r : R) :\n (r : S) = (algebraMap R S) r := sorry\n\ntheorem algebraMap_algebraMap {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] [Algebra R S]\n [Algebra S T] [Algebra R T] [IsScalarTower R S T] (r : R) :\n (algebraMap S T) ((algebraMap R S) r) = (algebraMap R T) r := sorry\n\ntheorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]\n [CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]\n (h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := sorry\n\n-- this uses `Algebra.isAlgebraic_of_subring_isAlgebraic` but I think we're going to have\n-- to introduce `f` anyway because we need not just that the extension is algebraic but\n-- that every element satisfies a poly of degree <= |G|.\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nThe extension $L/K$ is algebraic."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem algebraic {R S : Type*} [CommRing R] [CommRing S] [Algebra R S]\n (x : S) : IsAlgebraic R x := by sorry"}
3
+ {"prediction": "theorem algebraic {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (h : ∀ b : B, (∀ g : G, g • b = b) ↔ ∃ a : A, b = a) :\n ∃ f : B[X], f.Monic ∧ f.degree = Nat.card G ∧\n ∀ b : B, (∀ g : G, g • b = b) ↔ f.eval b = 0 := by sorry"}
4
+ {"prediction": "theorem algebraic {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G]\n [MulSemiringAction G B] (h : ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) :\n ∀ P : PrimeIdeal A, ∃ g : G, g • P = P ∧\n (∀ Q : PrimeIdeal B, Q.restrict A = P → ∃ f : B →ₗ[K] B, f.Monic ∧ f.degree = Nat.card G ∧\n f.eval^[Nat.card G] (Q : B) = 0 ∧ f.Splits (algebraMap A B)) := by sorry"}
5
+ {"prediction": "theorem algebraic {L K : Type*} [Field L] [Field K] [Algebra L K]\n (h : ∀ x : L, IsAlgebraic L x) : ∃ f : L[X], f.Monic ∧ f.degree = Nat.card G ∧\n ∀ x : L, f.eval x = 0 ∧ f.Splits (algebraMap L K) := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-ca32060811c64726ae560ab2130b5418",
3
+ "created": 1749028674,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "noncomputable def froshman (A : Type*) [CommRing A] (B : Type*) [CommRing B]\n [Algebra A B] (G : Type*) [Group G] [Finite G] [MulSemiringAction G B]\n : G → B → Prop :=\n",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] : G ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "noncomputable def frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n {G : Type*} [Group G] [MulSemiringAction G B] : G ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "noncomputable def frobeniusElement : G ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "def frosh (A : Type*) [CommRing A] (x : A) : A[X]ˣ ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "noncomputable def extension (A : Type*) (B : Type*) (h :Algebra A B) : Prop ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "noncomputable def extension_isAlgebraic (L : Type*) [Field L] (k : Type*) [Field k]\n [Algebra k L] [IsSeparable k L] : Algebra.IsAlgebraic k L ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "noncomputable def froshmanRingHom {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] :\n IsAlgebraic A B ∧ ∀ (P : PrimeIdeal A), PrimeIdeal.mk P B → PrimeIdeal.mk P B :=\n",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "theorem algebraMap.mk {R S : Type*} [CommRing R] [CommRing S] [Algebra R S]\n (x : S) : IsAlgebraic R x ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "noncomputable def preimageOfIdeal (I : Ideal B) : Ideal A :=\n let G := Ideal.endmakersOf B I\n let R := Ideal.fractionRingOf B I\n let K := Ideal.subringOf B I\n let F := Ideal.mk R G K\n let h := Ideal.mkCoroutine AKarta R G K\n let contr := Ideal.mkContraction AKarta R G K\n let preimage := h ∘ contr\n preimage\n\ndef froshman_class_ofIdeal (I : Ideal B) : Ideal G :=\n let R := Ideal.fractionRingOf B I\n let K := Ideal.subringOf B I\n let f := Ideal.mk R K\n let froshman_class := Ideal.mk AKarta f\n froshman_class\n\ndef froshman_class_ofAlgebra (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (I : Ideal B) : Ideal G :=\n let R := Ideal.fractionRingOf B I\n let K := Ideal.subringOf B I\n let f := Ideal.mk R K\n let froshman_class := Ideal.mk AKarta f\n froshman_class\n\ndef froshman_class_ofAlgebra_AKarta {A : Type*} {B : Type*} [CommRing A] [CommRing B]\n (h : CommRingHom AKarta) (I : Ideal B) : Ideal G :=\n",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "noncomputable def frobenius_element : G → B[X] ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "noncomputable def Frobenius_element (G : Type*) [Group G] [Fintype G] {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] : G → B ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "noncomputable def Frobenius_ELEMENT (R : Type*) [Field R] [Fintype R] (P : Prime R) : R ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "noncomputable def extension_isAlgebraic {K L : Type*} [CommRing K] [CommRing L] [Algebra K L]\n [IsSeparable K L] : Prop ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "noncomputable def frobenius (G : Type*) [Group G] [MulSemiringAction G B] : B → B :=\n",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "noncomputable def frobenius_element : G → B[X] ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A] [Algebra A B] (P : Ideal A) (hP : Prime P) : G ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (P : Ideal B) : G ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "noncomputable def frobenius_element (p : B) : G ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "def frosh (R : Type*) [CommRing R] (P : Prime R) : R → R :=\n",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "noncomputable def GaloisGroup (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A]\n (h : CommRingAction G A) : Type* ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (b : B) : G ",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B] [Algebra G B] : G ",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "def frosh (G : Type*) [Group G] [Finite G] (A : Type*) [CommRing A]\n (B : Type*) [CommRing B] [Algebra A B] (l : L) : G →* B[X]ˣ :=\n",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "noncomputable def GaloisGroup : Type* ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "def Frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] : G → B ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "noncomputable def localizedAlgebra {R K : Type*} [CommRing R] [CommRing K] [Algebra R K]\n (h : ∀ x : R, IsAlgebraic K (x : K)) : IsAlgebraic R K ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (h : ∀ b : B, (∀ g : G, g • b = b) ↔ ∃ a : A, b = a) :\n ∃ f : B[X], f.Monic ∧ f.degree = Nat.card G ∧\n ∀ b : B, (∀ g : G, g • b = b) ↔ f.eval b = 0 ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G]\n [MulSemiringAction G B] (h : ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) :\n ∀ P : PrimeIdeal A, ∃ g : G, g • P = P ∧\n (∀ Q : PrimeIdeal B, Q.restrict A = P → ∃ f : B →ₗ[K] B, f.Monic ∧ f.degree = Nat.card G ∧\n f.eval^[Nat.card G] (Q : B) = 0 ∧ f.Splits (algebraMap A B)) :=\n",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B]\n [Algebra G B] : G ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def galoisGroup (G : Type*) [Group G] [Finite G] [MulSemiringAction G B]\n (A : Type*) [CommRing A] [Algebra A B] : Type* := MulSemiringAction RCSymmGroup G B A\n\nnoncomputable def frobeniusMap (G : Type*) [Group G] [Finite G] [MulSemiringAction G B]\n (A : Type*) [CommRing A] [Algebra A B] : Type* := MulSemiringAction RCSymmGroup G B A\n\ndef galoisGroup føb : (G : Type*) [Group G] [Finite G] [MulSemiringAction G B]\n (A : Type*) [CommRing A] [Algebra A B] × (A : Type*) [CommRing A] [Algebra A B] → Type* ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "noncomputable def preimage (g : G) (x : B) : B ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B] [Algebra G B] : G ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (B : Type*) [CommRing B]\n (h : G →+* B) : G →+* B ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "noncomputable def frobenius_element : G →+* B[X] ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "noncomputable def frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] : G ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "theorem my_favorite_theorem {L K : Type*} [Field L] [Field K] [Algebra L K]\n (h : ∀ x : L, IsAlgebraic L x) : ∃ f : L[X], f.Monic ∧ f.degree = Nat.card G ∧\n ∀ x : L, f.eval x = 0 ∧ f.Splits (algebraMap L K) ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "def Frobenius (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B] (G : Type*) [Group G] [MulSemiringAction G B] : G → B ≃* B ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "length",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "noncomputable def preimage_of_residueFieldExtensionPolynomial (p : Polynomial K) : Ideal K :=\n if p.Monic then Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom p)\n else Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom (p * (monomial p.natDegree 1)))\n\nnoncomputable def conjugateOfResidueFieldExtensionPolynomial (p : Polynomial K) : Ideal K :=\n if p.Monic then Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom p)\n else Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom (p * (monomial p.natDegree 1)))\n\nnoncomputable def frobeniusOfResidueFieldExtensionPolynomial (p : Polynomial K) : Ideal K :=\n Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom p)\n\nnoncomputable def quotientOfResidueFieldExtensionPolynomial (p : Polynomial K) : Ideal K :=\n Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom p)\n\nnoncomputable def _mkIdealFrom [CommRing R] [CommRing L] (p : Polynomial L) : Ideal R :=\n Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom p)\n\nnoncomputable def _mkIdealFrom [CommRing R] [CommRing L] [Algebra R L] (p : Polynomial L) : Ideal R :=\n Ideal.mk (p.natDegree : ℕ) (Ideal.mapRingHom p)\n\nnoncomputable def mkIdealFrom [CommRing R] [CommRing L] [Algebra R L] (p : Polynomial L) : Ideal R :=\n if p.Monic then _mkIdealFrom R L p\n else _mkIdealFrom R L (p * (monomial p.natDegree 1))\n\nnoncomputable def frobeniusOfIdeal (H : Ideal B) : Ideal B :=\n if H.Monic then mkIdealFrom B (B ⧸ H) ((Ideal.mk B) : Ideal B → Ideal (B ⧸ H))\n else mkIdealFrom B (B ⧸ H) ((Ideal.mk B) * (monomial (Ideal.natDegree H) 1))\n\nnoncomputable def conjugateOfIdeal (H : Ideal B) : Ideal B :=\n if H.Monic then mkIdealFrom",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable def frobenius (G : Type*) [Group G] [Finite G] (x : B) : B :=\n let card := Nat.card G\n let v ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (l : L) : G ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "def Frobenius_element (R : Type*) [CommRing R] [Fintype G] : R →ₗ[Monoid G] R ",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "noncomputable def Frobenius_element (G : Type*) [Group G] (B : Type*) [CommRing B]\n (g : G) : B ",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "noncomputable def GaloisGroup : Type* ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "noncomputable def frobenius_element (P : PrimeIdeal A) (F : G) : G :=\n",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B] [Algebra G B]\n (P : Ideal B) [inst : P.Prime] : G ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A]\n (hAlgebra : Algebra A B) (hSemiringAction : MulSemiringAction G B) : A ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "def Frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B]\n [Algebra G B] : G ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "def frobenius_element (G : Type*) [Group G] (B : Type*) [CommRing B] [Algebra G B]\n [Fintype G] : G ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "noncomputable def Frobenius (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A]\n (B : Type*) [CommRing B] [Algebra A B] : B[X] ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 3175,
511
+ "prompt_tokens": 1975,
512
+ "total_tokens": 5150,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.algebraic/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": "theorem algebraic {R S : Type*} [CommRing R] [CommRing S] [Algebra R S]\n (x : S) : IsAlgebraic R x := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": "theorem algebraic {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (h : ∀ b : B, (∀ g : G, g • b = b) ↔ ∃ a : A, b = a) :\n ∃ f : B[X], f.Monic ∧ f.degree = Nat.card G ∧\n ∀ b : B, (∀ g : G, g • b = b) ↔ f.eval b = 0 := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
29
+ {"lean_code": "theorem algebraic {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G]\n [MulSemiringAction G B] (h : ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) :\n ∀ P : PrimeIdeal A, ∃ g : G, g • P = P ∧\n (∀ Q : PrimeIdeal B, Q.restrict A = P → ∃ f : B →ₗ[K] B, f.Monic ∧ f.degree = Nat.card G ∧\n f.eval^[Nat.card G] (Q : B) = 0 ∧ f.Splits (algebraMap A B)) := by sorry", "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": "theorem algebraic {L K : Type*} [Field L] [Field K] [Algebra L K]\n (h : ∀ x : L, IsAlgebraic L x) : ∃ f : L[X], f.Monic ∧ f.degree = Nat.card G ∧\n ∀ x : L, f.eval x = 0 ∧ f.Splits (algebraMap L K) := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/ground_truth.lean ADDED
@@ -0,0 +1,725 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Jou Glasheen. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Jou Glasheen, Amelia Livingston, Jujian Zhang, Kevin Buzzard
5
+ -/
6
+ import Mathlib.FieldTheory.Cardinality
7
+ import Mathlib.RingTheory.DedekindDomain.Ideal
8
+ import Mathlib.RingTheory.Ideal.Pointwise
9
+ import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
10
+ import Mathlib.RingTheory.Ideal.Pointwise
11
+ import Mathlib.RingTheory.Ideal.Over
12
+ import Mathlib.FieldTheory.Normal
13
+ import Mathlib.FieldTheory.SeparableClosure
14
+ import Mathlib.RingTheory.OreLocalization.Ring
15
+
16
+ /-!
17
+
18
+ # Frobenius elements.
19
+
20
+ This file proves a general result in commutative algebra which can be used to define Frobenius
21
+ elements of Galois groups of local or fields (for example number fields).
22
+
23
+ KB was alerted to this very general result (which needs no Noetherian or finiteness assumptions
24
+ on the rings, just on the Galois group) by Joel Riou
25
+ here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112
26
+
27
+ ## Mathematical details
28
+
29
+ ### The general commutative algebra result
30
+
31
+ This is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.
32
+ Let `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,
33
+ such that the `G`-invariants of `B` are exactly the image of `A`.
34
+
35
+ The two claims of the theorem are:
36
+ (i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.
37
+ (ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`
38
+ in `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is
39
+ surjective.
40
+
41
+ We say "automorphism group" rather than "Galois group" because the extension might not be
42
+ separable (it is algebraic and normal however, but it can be infinite; however its maximal
43
+ separable subextension is finite).
44
+
45
+ This result means that if the inertia group I_Q is trivial and the residue fields are finite,
46
+ there's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class
47
+ Frob_P in G.
48
+
49
+ -/
50
+
51
+
52
+ variable {A : Type*} [CommRing A]
53
+ {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]
54
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
55
+
56
+
57
+
58
+ open scoped algebraMap
59
+
60
+ --variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
61
+ --variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
62
+
63
+ section misc
64
+
65
+ variable {A : Type*} [CommRing A]
66
+ {B : Type*} [CommRing B] [Algebra A B]
67
+ {G : Type*} [Group G] [MulSemiringAction G B]
68
+ [SMulCommClass G A B]
69
+
70
+ open scoped Pointwise
71
+
72
+ /-
73
+ If you're happy to stick to finite G, it's just this:
74
+
75
+ private theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
76
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
77
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
78
+ fun x ↦ smul_smul g x b
79
+
80
+ But the below proof works in general.
81
+ -/
82
+
83
+ private theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := by
84
+ obtain (hfin | hinf) := em <| Finite G
85
+ · calc
86
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
87
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
88
+ fun x ↦ smul_smul g x b
89
+ · obtain (rfl | hb) := eq_or_ne b 1
90
+ · simp
91
+ · suffices (Function.mulSupport ((· • b) : G → B)).Infinite by
92
+ classical
93
+ simp [finprod_def, dif_neg this]
94
+ have htop : (⊤ : Set G).Infinite := by simpa using Set.infinite_univ_iff.mpr ({ not_finite := hinf })
95
+ convert htop
96
+ rw [eq_top_iff]
97
+ intro g _
98
+ simp only [Function.mem_mulSupport]
99
+ contrapose! hb
100
+ apply_fun (fun x ↦ g⁻¹ • x) at hb
101
+ simpa using hb
102
+
103
+ theorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]
104
+ (I : Ideal S) [hI : I.IsPrime] (f : R → S) :
105
+ ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := by
106
+ have := Fintype.ofFinite R
107
+ rw [finprod_eq_prod_of_fintype, Finset.prod_eq_multiset_prod, hI.multiset_prod_mem_iff_exists_mem]
108
+ simp
109
+
110
+ end misc
111
+
112
+ section charpoly
113
+
114
+ open Polynomial BigOperators
115
+
116
+ variable {A : Type*} [CommRing A]
117
+ {B : Type*} [CommRing B] [Algebra A B]
118
+ {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]
119
+
120
+
121
+ variable (G) in
122
+ /-- The characteristic polynomial of an element `b` of a `G`-semiring `B`
123
+ is the polynomial `∏_{g ∈ G} (X - g • b)` (here `G` is finite; junk
124
+ returned in the infinite case) .-/
125
+ noncomputable def MulSemiringAction.CharacteristicPolynomial.F (b : B) : B[X] :=
126
+ ∏ᶠ τ : G, (X - C (τ ��� b))
127
+
128
+ namespace MulSemiringAction.CharacteristicPolynomial
129
+
130
+ theorem F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
131
+
132
+ section F_API
133
+
134
+ variable [Finite G]
135
+
136
+ theorem F_monic [Nontrivial B] (b : B) : (F G b).Monic := by
137
+ have := Fintype.ofFinite G
138
+ rw [Monic, F_spec, finprod_eq_prod_of_fintype, leadingCoeff_prod'] <;> simp
139
+
140
+ theorem F_natdegree [Nontrivial B] (b : B) : (F G b).natDegree = Nat.card G := by
141
+ have := Fintype.ofFinite G
142
+ rw [F_spec, finprod_eq_prod_of_fintype, natDegree_prod_of_monic _ _ (fun _ _ => monic_X_sub_C _)]
143
+ simp only [natDegree_X_sub_C, Finset.sum_const, Finset.card_univ, Fintype.card_eq_nat_card,
144
+ nsmul_eq_mul, mul_one, Nat.cast_id]
145
+
146
+ variable (G) in
147
+ theorem F_degree [Nontrivial B] (b : B) : (F G b).degree = Nat.card G := by
148
+ have := Fintype.ofFinite G
149
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos, F_natdegree]
150
+
151
+ theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
152
+ σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rw [F_spec]
153
+ _ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := smul_finprod' _
154
+ _ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]
155
+ _ = ∏ᶠ τ' : G, (X - C (τ' • b)) := finprod_eq_of_bijective (fun τ ↦ σ * τ)
156
+ (Group.mulLeft_bijective σ) (fun _ ↦ rfl)
157
+ _ = F G b := by rw [F_spec]
158
+
159
+ theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
160
+ let foo := Fintype.ofFinite G
161
+ simp [F_spec,finprod_eq_prod_of_fintype,eval_prod]
162
+ apply @Finset.prod_eq_zero _ _ _ _ _ (1 : G) (Finset.mem_univ 1)
163
+ simp
164
+
165
+ private theorem F_coeff_fixed (b : B) (n : ℕ) (g : G) :
166
+ g • (F G b).coeff n = (F G b).coeff n := by
167
+ change (g • (F G b)).coeff n = _
168
+ rw [F_smul_eq_self]
169
+
170
+ end F_API
171
+
172
+ open scoped algebraMap
173
+
174
+ noncomputable local instance : Algebra A[X] B[X] :=
175
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
176
+
177
+ @[simp, norm_cast]
178
+ theorem _root_.coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
179
+ map_monomial _
180
+
181
+ section full_descent
182
+
183
+ variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
184
+
185
+ -- Remark: the `splitting_of_full` approach is lousy and should be
186
+ -- replaced by the commented-out code below (lines 275-296 currently)
187
+
188
+ /-- This "splitting" function from B to A will only ever be evaluated on
189
+ G-invariant elements of B, and the two key facts about it are
190
+ that it lifts such an element to `A`, and for reasons of
191
+ convenience it lifts `1` to `1`. -/
192
+ noncomputable def splitting_of_full
193
+ (b : B) : A := by classical
194
+ exact
195
+ if b = 1 then 1 else
196
+ if h : ∀ σ : G, σ • b = b then (hFull b h).choose
197
+ else 37
198
+
199
+ theorem splitting_of_full_spec {b : B} (hb : ∀ σ : G, σ • b = b) :
200
+ splitting_of_full hFull b = b := by
201
+ unfold splitting_of_full
202
+ split_ifs with h1
203
+ · rw_mod_cast [h1]
204
+ · exact (hFull b hb).choose_spec.symm
205
+
206
+ theorem splitting_of_full_one : splitting_of_full hFull 1 = 1 := by
207
+ unfold splitting_of_full
208
+ rw [if_pos rfl]
209
+
210
+ noncomputable def M (b : B) : A[X] :=
211
+ (∑ x ∈ (F G b).support, monomial x (splitting_of_full hFull ((F G b).coeff x)))
212
+
213
+ theorem M_deg_le (b : B) : (M hFull b).degree ≤ (F G b).degree := by
214
+ unfold M
215
+ have := Polynomial.degree_sum_le (F G b).support (fun x => monomial x (splitting_of_full hFull ((F G b).coeff x)))
216
+ refine le_trans this ?_
217
+ rw [Finset.sup_le_iff]
218
+ intro n hn
219
+ apply le_trans (degree_monomial_le n _) ?_
220
+ exact le_degree_of_mem_supp n hn
221
+
222
+ variable [Nontrivial B] [Finite G]
223
+
224
+ theorem M_coeff_card (b : B) :
225
+ (M hFull b).coeff (Nat.card G) = 1 := by
226
+ unfold M
227
+ simp only [finset_sum_coeff]
228
+ have hdeg := F_degree G b
229
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos] at hdeg
230
+ rw [ ← hdeg]
231
+ rw [Finset.sum_eq_single_of_mem ((F G b).natDegree)]
232
+ · have : (F G b).Monic := F_monic b
233
+ simp
234
+ simp_all [splitting_of_full_one]
235
+ · refine natDegree_mem_support_of_nonzero ?h.H
236
+ intro h
237
+ rw [h] at hdeg
238
+ have : 0 < Nat.card G := Nat.card_pos
239
+ simp_all
240
+ · intro d _ hd
241
+ exact coeff_monomial_of_ne (splitting_of_full hFull ((F G b).coeff d)) hd
242
+
243
+ theorem M_deg_eq_F_deg [Nontrivial A] (b : B) : (M hFull b).degree = (F G b).degree := by
244
+ apply le_antisymm (M_deg_le hFull b)
245
+ rw [F_degree]
246
+ have := M_coeff_card hFull b
247
+ refine le_degree_of_ne_zero ?h
248
+ rw [this]
249
+ exact one_ne_zero
250
+
251
+ theorem M_deg [Nontrivial A] (b : B) : (M hFull b).degree = Nat.card G := by
252
+ rw [M_deg_eq_F_deg hFull b]
253
+ exact F_degree G b
254
+
255
+ theorem M_monic (b : B) : (M hFull b).Monic := by
256
+ have this1 := M_deg_le hFull b
257
+ have this2 := M_coeff_card hFull b
258
+ have this3 : 0 < Nat.card G := Nat.card_pos
259
+ rw [← F_natdegree b] at this2 this3
260
+ -- then the hypos say deg(M)<=n, coefficient of X^n is 1 in M
261
+ have this4 : (M hFull b).natDegree ≤ (F G b).natDegree := natDegree_le_natDegree this1
262
+ exact Polynomial.monic_of_natDegree_le_of_coeff_eq_one _ this4 this2
263
+
264
+ omit [Nontrivial B] in
265
+ theorem M_spec (b : B) : ((M hFull b : A[X]) : B[X]) = F G b := by
266
+ unfold M
267
+ ext N
268
+ push_cast
269
+ simp_rw [splitting_of_full_spec hFull <| F_coeff_fixed b _]
270
+ simp_rw [finset_sum_coeff, ← lcoeff_apply, lcoeff_apply, coeff_monomial]
271
+ aesop
272
+
273
+ omit [Nontrivial B] in
274
+ theorem M_spec_map (b : B) : (map (algebraMap A B) (M hFull b)) = F G b := by
275
+ rw [← M_spec hFull b]; rfl
276
+
277
+ omit [Nontrivial B] in
278
+ theorem M_eval_eq_zero (b : B) : (M hFull b).eval₂ (algebraMap A B) b = 0 := by
279
+ rw [eval₂_eq_eval_map, M_spec_map, F_eval_eq_zero]
280
+
281
+ include hFull in
282
+ theorem isIntegral : Algebra.IsIntegral A B where
283
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
284
+
285
+ end full_descent
286
+
287
+ end MulSemiringAction.CharacteristicPolynomial
288
+
289
+ end charpoly
290
+
291
+ section part_a
292
+
293
+ open MulSemiringAction.CharacteristicPolynomial
294
+
295
+ variable {A : Type*} [CommRing A]
296
+ {B : Type*} [CommRing B] [Algebra A B] [Nontrivial B]
297
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
298
+
299
+ theorem isIntegral_of_Full (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
300
+ Algebra.IsIntegral A B where
301
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
302
+
303
+ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
304
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
305
+
306
+ open scoped Pointwise
307
+
308
+ theorem Nontrivial_of_exists_prime {R : Type*} [CommRing R]
309
+ (h : ∃ P : Ideal R, P.IsPrime) : Nontrivial R := by
310
+ contrapose! h
311
+ intro P hP
312
+ rw [@not_nontrivial_iff_subsingleton] at h
313
+ obtain ⟨h, _⟩ := hP
314
+ apply h
315
+ apply Subsingleton.elim
316
+
317
+ -- (Part a of Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
318
+ omit [Nontrivial B] in
319
+ theorem part_a [SMulCommClass G A B]
320
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
321
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
322
+ ∃ g : G, Q = g • P := by
323
+ haveI : Nontrivial B := Nontrivial_of_exists_prime ⟨Q, inferInstance⟩
324
+ haveI : Algebra.IsIntegral A B := isIntegral_of_Full hFull'
325
+ cases nonempty_fintype G
326
+ suffices ∃ g : G, Q ≤ g • P by
327
+ obtain ⟨g, hg⟩ := this
328
+ use g
329
+ by_contra! hQ
330
+ have : Q < g • P := lt_of_le_of_ne hg hQ
331
+ obtain ⟨x, hxP, hxQ⟩ := Set.exists_of_ssubset <| this
332
+ apply (Ideal.comap_lt_comap_of_integral_mem_sdiff (R := A) hg ⟨hxP, hxQ⟩ <|
333
+ Algebra.isIntegral_def.1 inferInstance x).ne
334
+ rw [← hPQ]
335
+ ext x
336
+ specialize hFull' (algebraMap A B x)
337
+ have : ∀ (g : G), g • (algebraMap A B x) = (algebraMap A B x) := fun g ↦ by
338
+ rw [Algebra.algebraMap_eq_smul_one, smul_comm, smul_one]
339
+ simp only [Ideal.mem_comap]
340
+ nth_rw 2 [← this]
341
+ exact Ideal.smul_mem_pointwise_smul_iff.symm
342
+ suffices ∃ g ∈ (⊤ : Finset G), Q ≤ g • P by
343
+ convert this; simp
344
+ rw [← Ideal.subset_union_prime 1 1 <| fun g _ _ _ ↦ ?_]; swap
345
+ · exact Ideal.map_isPrime_of_equiv (MulSemiringAction.toRingEquiv _ _ g)
346
+ intro x hx
347
+ specialize hFull' (∏ᶠ σ : G, σ • x)
348
+ obtain ⟨a, ha⟩ := hFull' (norm_fixed _)
349
+ have : (a : B) ∈ Q := by
350
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem]
351
+ use 1
352
+ simpa using hx
353
+ have : (a : B) ∈ P := by
354
+ unfold Algebra.cast
355
+ rwa [← Ideal.mem_comap, hPQ, Ideal.mem_comap]
356
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem] at this
357
+ obtain ⟨σ, hσ⟩ : ∃ σ : G, σ • x ∈ P := this
358
+ simp only [Finset.top_eq_univ, Finset.coe_univ, Set.mem_univ, Set.iUnion_true, Set.mem_iUnion,
359
+ SetLike.mem_coe]
360
+ use σ⁻¹
361
+ rwa [Ideal.mem_inv_pointwise_smul_iff]
362
+
363
+ end part_a
364
+
365
+ -- section normal_elements
366
+ -- I'm going to avoid this because I'm just going to use scaling.
367
+ -- I'll show that every nonzero element of B/Q divides an element of A/P.
368
+
369
+ -- variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
370
+
371
+ -- open Polynomial
372
+
373
+ -- I've commented out the next section because ACL suggested
374
+ -- reading up-to-date Bourbaki here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
375
+ -- and apparently this will avoid the def below.
376
+
377
+ -- def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
378
+
379
+ -- namespace IsNormalElement
380
+
381
+ -- theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
382
+ -- IsNormalElement K x ↔
383
+ -- ∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
384
+ -- constructor
385
+ -- · intro h
386
+ -- exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
387
+ -- · rintro ⟨P, hPmonic, hPeval, hPsplits⟩
388
+ -- -- need min poly divides P and then it should all be over
389
+ -- sorry -- presumably some form of this is in the library
390
+
391
+ -- theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
392
+ -- (hx : IsNormalElement K x) (hy : IsNormalElement K y) :
393
+ -- IsNormalElement K (x * y) := by
394
+ -- rw [iff_exists_monic_splits K hxint] at hx
395
+ -- obtain ⟨Px, hx1, hx2, hx3⟩ := hx
396
+ -- rw [iff_exists_monic_splits K hyint] at hy
397
+ -- obtain ⟨Py, hy1, hy2, hy3⟩ := hy
398
+ -- rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
399
+ -- -- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
400
+ -- -- Do we have this?
401
+ -- -- Is this even the best way to go about this?
402
+ -- -- Note: Chambert-Loir says there's a proof in Bourbaki
403
+ -- sorry
404
+
405
+ -- -- API
406
+
407
+ -- end IsNormalElement
408
+
409
+ -- end normal_elements
410
+
411
+ section part_b
412
+
413
+ variable {A : Type*} [CommRing A]
414
+ {B : Type*} [CommRing B] [Algebra A B]
415
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B]
416
+
417
+ /-
418
+ Set-up for part (b) of the lemma. G acts on B with invariants A (or more precisely the
419
+ image of A). Warning: `P` was a prime ideal of `B` in part (a) but it's a prime ideal
420
+ of `A` here, in fact it's `Q ∩ A`, the preimage of `Q` in `A`.
421
+
422
+ We want to consider the following commutative diagram.
423
+
424
+ B ---> B / Q -----> L = Frac(B/Q)
425
+ /\ /\ /\
426
+ | | |
427
+ | | |
428
+ A ---> A / P ----> K = Frac(A/P)
429
+
430
+ We will get to L, K, and the second square later.
431
+ First let's explain how to do P and Q.
432
+ -/
433
+ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
434
+ -- #synth Algebra A (B ⧸ Q) #exit -- works
435
+ ---synth IsScalarTower A B (B ⧸ Q) #exit-- works
436
+ -- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the
437
+ -- commutativity of the diagram! This is a trick I learnt from Jou who apparently
438
+ -- learnt it from Amelia
439
+ [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]
440
+ -- So now we know the left square commutes.
441
+ -- Amelia's first trick: commutativity of th LH diagram implies `P ⊆ Q ∩ A`
442
+ -- For the map `A -> A/P -> B/Q` must equal the map `A -> B -> B/Q` so `P` must
443
+ -- be a subset of the kernel of `A → B/Q`, which is `A ∩ Q`
444
+
445
+ omit [P.IsPrime] in
446
+ theorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :
447
+ algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
448
+ Ideal.Quotient.eq_zero_iff_mem
449
+
450
+ section B_mod_Q_over_A_mod_P_stuff
451
+
452
+ section Mathlib.RingTheory.Ideal.Quotient
453
+
454
+ namespace Ideal
455
+
456
+ variable {R : Type*} [CommRing R] {I : Ideal R}
457
+
458
+ protected noncomputable
459
+ def Quotient.out (x : R ⧸ I) :=
460
+ Quotient.out' x
461
+
462
+ theorem Quotient.out_eq (x : R ⧸ I) : Ideal.Quotient.mk I (Ideal.Quotient.out x) = x := by
463
+ simp only [Ideal.Quotient.out, Ideal.Quotient.mk, RingHom.coe_mk, MonoidHom.coe_mk, OneHom.coe_mk,
464
+ Submodule.Quotient.mk, Quotient.out_eq']
465
+
466
+ @[elab_as_elim]
467
+ protected theorem Quotient.induction_on
468
+ {p : R ⧸ I → Prop} (x : R ⧸ I) (h : ∀ a, p (Ideal.Quotient.mk I a)) : p x :=
469
+ Quotient.inductionOn x h
470
+
471
+ end Ideal
472
+
473
+ end Mathlib.RingTheory.Ideal.Quotient
474
+
475
+ namespace MulSemiringAction.CharacteristicPolynomial
476
+
477
+
478
+ open Polynomial
479
+ /-
480
+ I didn't check that this definition was independent
481
+ of the lift `b` of `bbar` (and it might not even be true).
482
+ But this doesn't matter, because `G` no longer acts on `B/Q`.
483
+ All we need is that `Mbar` is monic of degree `|G|`, is defined over the bottom ring
484
+ and kills `bbar`.
485
+ -/
486
+ variable {Q} in
487
+ noncomputable def Mbar
488
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
489
+ (bbar : B ⧸ Q) : (A ⧸ P)[X] :=
490
+ Polynomial.map (Ideal.Quotient.mk P) <| M hFull' <| Ideal.Quotient.out bbar
491
+
492
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
493
+
494
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
495
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
496
+ theorem Mbar_monic [Nontrivial B] (bbar : B ⧸ Q) : (Mbar P hFull' bbar).Monic := by
497
+ have := M_monic hFull'
498
+ simp [Mbar, (M_monic hFull' _).map]
499
+
500
+ omit [SMulCommClass G A B] [Q.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
501
+ theorem Mbar_deg [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
502
+ degree (Mbar P hFull' bbar) = Nat.card G := by
503
+ simp only [Mbar]
504
+ rw [degree_map_eq_of_leadingCoeff_ne_zero]
505
+ · exact M_deg hFull' _
506
+ · rw [(M_monic hFull' _).leadingCoeff]
507
+ simp only [map_one, ne_eq, one_ne_zero, not_false_eq_true]
508
+
509
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
510
+ theorem Mbar_eval_eq_zero [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
511
+ eval₂ (algebraMap (A ⧸ P) (B ⧸ Q)) bbar (Mbar P hFull' bbar) = 0 := by
512
+ have h := congr_arg (algebraMap B (B ⧸ Q)) (M_eval_eq_zero hFull' (Ideal.Quotient.out bbar))
513
+ rw [map_zero, hom_eval₂, Ideal.Quotient.algebraMap_eq, Ideal.Quotient.out_eq] at h
514
+ simpa [Mbar, eval₂_map, ← Ideal.Quotient.algebraMap_eq,
515
+ ← IsScalarTower.algebraMap_eq A (A ⧸ P) (B ⧸ Q), IsScalarTower.algebraMap_eq A B (B ⧸ Q)]
516
+
517
+ end CharacteristicPolynomial
518
+
519
+ open CharacteristicPolynomial in
520
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
521
+ theorem reduction_isIntegral
522
+ [Nontrivial A] [Nontrivial B]
523
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
524
+ Algebra.IsIntegral (A ⧸ P) (B ⧸ Q) where
525
+ isIntegral x := ⟨Mbar P hFull' x, Mbar_monic Q P hFull' x, Mbar_eval_eq_zero Q P hFull' x⟩
526
+
527
+ end MulSemiringAction
528
+
529
+ theorem Polynomial.nonzero_const_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
530
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
531
+ ∃ (q : Polynomial R), q.coeff 0 ≠ 0 ∧ q.eval₂ (algebraMap R S) s = 0 := by
532
+ obtain ⟨p, p_monic, p_eval⟩ := (@Algebra.isIntegral_def R S).mp inferInstance s
533
+ have p_nzero := ne_zero_of_ne_zero_of_monic X_ne_zero p_monic
534
+ obtain ⟨q, p_eq, q_ndvd⟩ := Polynomial.exists_eq_pow_rootMultiplicity_mul_and_not_dvd p p_nzero 0
535
+ rw [C_0, sub_zero] at p_eq
536
+ rw [C_0, sub_zero] at q_ndvd
537
+ use q
538
+ constructor
539
+ . intro q_coeff_0
540
+ exact q_ndvd <| X_dvd_iff.mpr q_coeff_0
541
+ . rw [p_eq, eval₂_mul] at p_eval
542
+ rcases NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero p_eval with Xpow_eval | q_eval
543
+ . by_contra
544
+ apply hs
545
+ rw [eval₂_X_pow] at Xpow_eval
546
+ exact pow_eq_zero Xpow_eval
547
+ . exact q_eval
548
+
549
+ theorem Algebra.exists_dvd_nonzero_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
550
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
551
+ ∃ r : R, r ≠ 0 ∧ s ∣ (algebraMap R S) r := by
552
+ obtain ⟨q, q_zero_coeff, q_eval_zero⟩ := Polynomial.nonzero_const_if_isIntegral R S s hs
553
+ use q.coeff 0
554
+ refine ⟨q_zero_coeff, ?_⟩
555
+ rw [← Polynomial.eval₂_X (algebraMap R S) s, ← dvd_neg, ← Polynomial.eval₂_C (algebraMap R S) s]
556
+ rw [← zero_add (-_), Mathlib.Tactic.RingNF.add_neg, ← q_eval_zero, ← Polynomial.eval₂_sub]
557
+ apply Polynomial.eval₂_dvd
558
+ exact Polynomial.X_dvd_sub_C
559
+
560
+ end B_mod_Q_over_A_mod_P_stuff
561
+
562
+ /-
563
+ \section{The extension $L/K$.}
564
+
565
+ \begin{theorem}
566
+ \label{foo1}
567
+ If $\lambda\in L$ then there's a monic polynomial $P_\lambda\in K[X]$ of degree $|G|$
568
+ with $\lambda$ as a root, and which splits completely in $L[X]$.
569
+ \end{theorem}
570
+ \begin{proof}
571
+ A general $\lambda\in L$ can be written as $\beta_1/\beta_2$ where $\beta_1,\beta_2\in B/Q$.
572
+ The previous corollary showed that there's some nonzero $\alpha\in A/P$ such that $\beta_2$
573
+ divides $\alpha$, and hence $\alpha\lambda\in B/Q$ (we just cleared denominators).
574
+ Thus $\alpha\lambda$ is a root of some monic polynomial $f(x)\in (A/P)[X]$,
575
+ by~\ref{MulSemiringAction.CharacteristicPolynomial.Mbar_eval_eq_zero}.
576
+ The polynomial $f(\alpha x)\in (A/P)[X]$ thus
577
+ has $\lambda$ as a root, but it is not monic; its leading term is $\alpha^n$.
578
+ Dividing through in $K[X]$ gives us the polynomial we seek.
579
+ \end{proof}
580
+
581
+ \begin{corollary} The extension $L/K$ is algebraic and normal.
582
+ \end{corollary}
583
+ \begin{proof} \uses{foo1}
584
+ Exercise using the previous theorem.
585
+ \end{proof}
586
+
587
+ Note that $L/K$ might not be separable and might have infinite degree. However
588
+
589
+ \begin{corollary} Any subextension of $L/K$ which is finite and separable over $K$
590
+ has degree at most $|G|$.
591
+ \end{corollary}
592
+ \begin{proof}
593
+ Finite and separable implies simple, and we've already seen that any
594
+ element of $L$ has degree at most $|G|$ over $K$.
595
+ \end{proof}
596
+
597
+ \begin{corollary} The maximal separable subextension $M$ of $L/K$ has degree at most $|G|$.
598
+ \end{corollary}
599
+ \begin{proof} If it has dimension greater than $|G|$ over $K$, then it has a finitely-generated
600
+ subfeld of $K$-dimension greater than $|G|$, and is finite and separable, contradicting
601
+ the previous result.
602
+ \end{proof}
603
+
604
+ \begin{corollary} $\Aut_K(L)$ is finite.
605
+ \end{corollary}
606
+ \begin{proof} Any $K$-automorphism of $L$ is determined by where it sends $M$.
607
+ \end{proof}
608
+
609
+ \begin{corollary} $\Aut_{A/P}(B/Q)$ is finite.
610
+ \end{corollary}
611
+ \begin{proof}
612
+ Two elements of $\Aut_{A/P}(B/Q)$ which agree once extended to automorphisms of $L$
613
+ must have already been equal, as $B/Q\subseteq L$. Hence the canonical map
614
+ from $\Aut_{A/P}(B/Q)$ to $\Aut_K(L)$ is injective.
615
+ \end{proof}
616
+
617
+ \section{Proof of surjectivity.}
618
+
619
+ \begin{definition} We fix once and for all some nonzero $y\in B/Q$ such that $M=K(y)$,
620
+ with $M$ the maximal separable subextension of $L/K$.
621
+ \end{definition}
622
+
623
+ Note that the existence of some $\lambda\in L$ with this property just comes from finite
624
+ and separable implies simple; we can use the ``clear denominator'' technique introduced
625
+ earlier to scale this by some nonzero $\alpha\in A$ into $B/Q$, as
626
+ $K(\lambda)=K(\alpha\lambda)$.
627
+
628
+ Here is a slightly delicate result whose proof I haven't thought too hard about.
629
+ \begin{theorem} There exists some $x\in B$ and $\alpha\in A$ with the following
630
+ properties.
631
+ \begin{enumerate}
632
+ \item $x=\alpha y$ mod $Q$ and $\alpha$ isn't zero mod $Q$.
633
+ \item $x\in Q'$ for all $Q'\not=Q$ in the $G$-orbit of $Q$.
634
+ \end{enumerate}
635
+ \end{theorem}
636
+ \begin{proof}
637
+ Idea. Localise away from P, then all the $Q_i$ are maximal, use CRT and then clear denominators.
638
+ \end{proof}
639
+
640
+ We now choose some $x\in B[1/S]$ which is $y$ modulo $Q$ and $0$ modulo all the other
641
+ primes of $B$ above $P$, and consider the monic degree $|G|$ polynomial $f$ in $K[X]$
642
+ with $x$ and its conjugates as roots. If $\sigma\in\Aut_K(L)$ then $\sigma(\overline{x})$
643
+ is a root of $f$ as $\sigma$ fixes $K$ pointwise. Hence $\sigma(\overline{x})=\overline{g(x)}$
644
+ for some $g\in G$, and because $\sigma(\overline{x})\not=0$ we have $\overline{g(x)}\not=0$
645
+ and hence $g(x)\notin Q[1/S]$. Hence $x\notin g^{-1} Q[1/S]$ and thus $g^{-1}Q=Q$ and $g\in SD_Q$.
646
+ Finally we have $\phi_g=\sigma$ on $K$ and on $y$, so they are equal on $M$ and hence on $L$ as
647
+ $L/M$ is purely inseparable.
648
+
649
+ This part of the argument seems weak.
650
+ -/
651
+
652
+ section L_over_K_stuff
653
+
654
+ -- Let's now make the right square. First `L`
655
+ variable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]
656
+ -- Now top left triangle: A / P → B / Q → L commutes
657
+ [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
658
+ -- now introduce K
659
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
660
+ -- now make bottom triangle commute
661
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L]
662
+ -- So now both squares commute.
663
+
664
+ -- do I need this?
665
+ -- [Algebra A K] [IsScalarTower A (A ⧸ P) K]
666
+
667
+ -- Do I need this:
668
+ -- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
669
+
670
+ variable [Nontrivial B]
671
+
672
+
673
+ -- Do we need a version of Ideal.Quotient.eq_zero_iff_mem with algebraMap?
674
+
675
+
676
+ -- not sure if we need this but let's prove it just to check our setup is OK.
677
+ -- The claim is that the preimage of Q really is P (rather than just containing P)
678
+ -- and the proof is that A/P -> B/Q extends to a map of fields which is injective,
679
+ -- so A/P -> B/Q must also be injective.
680
+ open IsScalarTower in
681
+ example : Ideal.comap (algebraMap A B) Q = P := by
682
+ ext x
683
+ simp only [Ideal.mem_comap]
684
+ rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']
685
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
686
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
687
+ rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]
688
+ rw [← algebraMap_apply A B (B ⧸ Q)]
689
+ rw [← algebraMap_apply (A ⧸ P) K L]
690
+ rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]
691
+ rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
692
+
693
+ open Polynomial BigOperators
694
+
695
+ open scoped algebraMap
696
+
697
+ noncomputable local instance : Algebra A[X] B[X] :=
698
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
699
+
700
+ theorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}
701
+ (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry
702
+
703
+ theorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]
704
+ [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):
705
+ IsAlgebraic K (IsLocalization.mk' S 1 x) := by
706
+ rw [← IsAlgebraic.invOf_iff, IsLocalization.invertible_mk'_one_invOf]
707
+ exact h
708
+
709
+ open MulSemiringAction.CharacteristicPolynomial
710
+
711
+ namespace Bourbaki52222
712
+
713
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in
714
+ variable (G) in
715
+ noncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=
716
+ if x = 0 then monomial (Nat.card G) 1
717
+ else 37 -- this is not actually right. In the nonzero case you
718
+ -- clear denominators with a nonzero element of A, using
719
+ -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar
720
+ -- scaled appropriately.
721
+
722
+
723
+ theorem f_exists [DecidableEq L] (l : L) :
724
+ ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧
725
+ eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by sorry
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/input_messages_compress_3.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.FieldTheory.Cardinality\nimport Mathlib.RingTheory.DedekindDomain.Ideal\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.IntegralClosure.IntegralRestrict\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.Ideal.Over\nimport Mathlib.FieldTheory.Normal\nimport Mathlib.FieldTheory.SeparableClosure\nimport Mathlib.RingTheory.OreLocalization.Ring\n\n/-!\n\n# Frobenius elements.\n\nThis file proves a general result in commutative algebra which can be used to define Frobenius\nelements of Galois groups of local or fields (for example number fields).\n\nKB was alerted to this very general result (which needs no Noetherian or finiteness assumptions\non the rings, just on the Galois group) by Joel Riou\nhere https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112\n\n## Mathematical details\n\n### The general commutative algebra result\n\nThis is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.\nLet `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,\nsuch that the `G`-invariants of `B` are exactly the image of `A`.\n\nThe two claims of the theorem are:\n(i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.\n(ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`\nin `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is\nsurjective.\n\nWe say \"automorphism group\" rather than \"Galois group\" because the extension might not be\nseparable (it is algebraic and normal however, but it can be infinite; however its maximal\nseparable subextension is finite).\n\nThis result means that if the inertia group I_Q is trivial and the residue fields are finite,\nthere's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class\nFrob_P in G.\n\n-/\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nopen scoped algebraMap\n\n--variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)\n--variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n\nsection misc\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B]\n\nopen scoped Pointwise\n\n/-\nIf you're happy to stick to finite G, it's just this:\n... [TRUNCATED] ...\n\n-- Let's now make the right square. First `L`\nvariable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]\n -- Now top left triangle: A / P → B / Q → L commutes\n [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]\n -- now introduce K\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n -- now make bottom triangle commute\n [Algebra K L] [IsScalarTower (A ⧸ P) K L]\n -- So now both squares commute.\n\n-- do I need this?\n-- [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n\n-- Do I need this:\n-- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]\n\nvariable [Nontrivial B]\n\n-- Do we need a version of Ideal.Quotient.eq_zero_iff_mem with algebraMap?\n\n-- not sure if we need this but let's prove it just to check our setup is OK.\n-- The claim is that the preimage of Q really is P (rather than just containing P)\n-- and the proof is that A/P -> B/Q extends to a map of fields which is injective,\n-- so A/P -> B/Q must also be injective.\nopen IsScalarTower in\nexample : Ideal.comap (algebraMap A B) Q = P := by\n ext x\n simp only [Ideal.mem_comap]\n rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']\n rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]\n rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]\n rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]\n rw [← algebraMap_apply A B (B ⧸ Q)]\n rw [← algebraMap_apply (A ⧸ P) K L]\n rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]\n rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]\n\nopen Polynomial BigOperators\n\nopen scoped algebraMap\n\nnoncomputable local instance : Algebra A[X] B[X] :=\n RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))\n\ntheorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}\n (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry\n\ntheorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]\n [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):\n IsAlgebraic K (IsLocalization.mk' S 1 x) := sorry\n\nopen MulSemiringAction.CharacteristicPolynomial\n\nnamespace Bourbaki52222\n\nvariable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in\nvariable (G) in\nnoncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=\n if x = 0 then monomial (Nat.card G) 1\n else 37 -- this is not actually right. In the nonzero case you\n -- clear denominators with a nonzero element of A, using\n -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar\n -- scaled appropriately.\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nIf $\\lambda \\in L$ then there’s a monic polynomial $P_\\lambda \\in K[X]$ of degree $|G|$ with $\\lambda $ as a root, and which splits completely in $L[X]$."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem f_exists {A B : Type*} [CommRing A] [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n [SMulCommClass G A B] {P : Ideal A} :\n (∀ (g : G), g • frobeniusElement P = frobeniusElement P) ↔\n ∃ (F : frobeniusConjugacyClass P), F.Normal := by sorry"}
3
+ {"prediction": "theorem f_exists {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B] {x : B} (hx : IsAlgebraic A x) :\n ∃ (P : Polynomial B) (hx : P.Monic) (hP : P.degree = Nat.card G)\n (hP1 : P.eval x = 0) (hP2 : ∀ g : G, P.eval (g • x) = 0)\n (hP3 : ∀ i : Fin (Nat.card G), P.derivative.eval (x + i * 1) = 0) := by sorry"}
4
+ {"prediction": "theorem f_exists {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (lambda : B) : ∃ P : Polynomial B, P.Monic ∧ P.degree = Nat.card G ∧\n lambda ∈ P.roots ∧ P.Splits := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-7b901a00995e46b699f702d3c64efb9a",
3
+ "created": 1749028678,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "def froshenberg {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] :\n ∃ froshenberg : G → B, ∀ g : G, froshenberg g = g ",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (g : G) : G :=\n",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "def frosh (L : Type*) [Field L] [DecidableEq L] (G : Type*) [Group G] [Finite G] [MulSemiringAction G L] : Prop ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "noncomputable def Frobenius_element (G : Type*) [Group G] [Finite G] (A : Type*) [CommRing A]\n (hA : IsField A) (B : Type*) [CommRing B] [Algebra A B] (hAB : IsIntegral A B)\n (P : Polynomial B) (hP : P.Monic) (hP1 : P.degree = Nat.card G) (hP2 : P.eval 1 = 0)\n (hP3 : ∀ g : G, P.eval (g : B) = 0) :\n ∃ g : G, g • P = P ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (P : Ideal G) : G :=\n",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] : G :=\n",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B] : G ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] [MulSemiringAction G B]\n : G ",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "noncomputable def frobenius (G : Type*) [Group G] [MulSemiringAction G B] : G →* B[X] :=\n",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A]\n [Algebra A B] [MulSemiringAction G B] : G ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "length",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "noncomputable def FrobeniusConjugacyClass (G : Type*) [Group G] (P : Ideal G) : Ideal G := Ideal.mk\n (IdealExpressible.mk P) (IdealQuotient.mk P)\n\ndef Separable frosh : Ideal G → Prop := IdealExpressible.froshIdeal Separable.mkIdealExpressibleIdealQuotientIdeal.mkIdeal Separable.froshIdeal.mkIdealExpressibleIdealQuotientIdeal.mkIdealSeparable\n\nnoncomputable def froshIdeal.mkIdealExpressibleIdealQuotientIdeal.mkIdealSeparableIdealExpressibleIdealQuotientIdeal.mkIdeal frosh := Ideal.mkIdealExpressibleIdealQuotientIdeal.mkIdealSeparableIdealExpressibleIdealQuotientIdeal.mkIdealIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.froshIdeal.fro",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "noncomputable def frobenius_element (P : Ideal B) : Ideal B ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "noncomputable def frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [MulSemiringAction G B] [Finite G] :\n ∃ (x : B), (∀ (g : G), g • x = x) ∧\n (∀ (P : Polynomial B), P.Monic ∧ P.degree = Nat.card G ∧\n (∀ (g : G), g • P.eval x = P.eval x)) ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "noncomputable def frobeniusElement {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] : G :=\n",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "def frobenius_element (G : Type*) [Group G] (hG : Finite G) (A : Type*) [CommRing A]\n (B : Type*) [CommRing B] [Algebra A B] (hAB : CommRingAlgebra.mk A B)\n (P : Ideal A) [Prime P] : Ideal B :=\n",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "noncomputable def frobeniusElement (P : Ideal A) : Ideal B :=\n Ideal.map algebraMap A B (P)\n\nnoncomputable def frobeniusConjugacyClass (P : Ideal A) : Ideal G :=\n Ideal.map algebraMap A G (P)\n\ntheorem my_favorite_theorem {A B : Type*} [CommRing A] [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n [SMulCommClass G A B] {P : Ideal A} :\n (∀ (g : G), g • frobeniusElement P = frobeniusElement P) ↔\n ∃ (F : frobeniusConjugacyClass P), F.Normal ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "def frobeniusElement (P : Ideal A) : Ideal G ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] [MulSemiringAction G B] : G ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (a : A) : G :=\n",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "def frobenius (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A] [Algebra A B] (P : Ideal A) (hP : Ideal.IsPrime P) : Ideal B ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (p : G) : G ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "def frobenius_element (G : Type*) [Group G] [Finite G] (P : Ideal G) : G :=\n",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "noncomputable def frobenius (A : Type*) [CommRing A] [Algebra A B] (G : Type*) [Group G] [MulSemiringAction G B] : G →* G ≃* G ≃* G →* G ≃* G ",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (A : Type*) [CommRing A]\n (B : Type*) [CommRing B] [Algebra A B] (h : G →* B) : G →* B :=\n",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B]\n (P : Ideal B) (hP : P.Prime) : G :=\n",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "def frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] [Fintype G] :\n ∃ F : G, ∀ b : B, (∀ g : G, g • b = b) ↔ ∃ a : A, b = a ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "def frobenius_element (G : Type*) [Group G] [Finite G] {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] (h : ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a)\n : G →* (B ⧸ Q)ˣ :=\n",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B] {x : B} (hx : IsAlgebraic A x) :\n ∃ (P : Polynomial B) (hx : P.Monic) (hP : P.degree = Nat.card G)\n (hP1 : P.eval x = 0) (hP2 : ∀ g : G, P.eval (g • x) = 0)\n (hP3 : ∀ i : Fin (Nat.card G), P.derivative.eval (x + i * 1) = 0) ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "noncomputable def frobenius (x : G) : G[X] ",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "def frobeniusElement {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G]\n [MulSemiringAction G B] : G → B ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "def frobenius_element (P : Ideal A) : Ideal G ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [MulSemiringAction G B]\n : G ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "noncomputable def frobenius (P : Ideal B) : Ideal B :=\n let frobenius := Ideal.Quotient.mk' B P\n let extend := Ideal.Algebra.mk' B frobenius\n let frobenius' := Ideal.map extend (Ideal Frobenius.mk')\n frobenius'\n\ndef frobeniusGroup : G → Ideal B → Ideal B ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def frobenius conjugacy_class (p : Subgroup G) : G ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "noncomputable def frobenius_element (A : Type*) [CommRing A] [Fintype G] : G :=\n",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (P : Ideal B) : G :=\n",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "noncomputable def frobenius (G : Type*) [Group G] [MulSemiringAction G B] : G →* B ≃+*\n G →* B ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] {A B : Type*} [CommRing A] [CommRing B]\n [Algebra A B] (h : ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) :\n ∃ F : G, ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "def frobenius_element {A B : Type*} [CommRing A] [CommRing B] [Algebra A B]\n [GaloisGroup G : MulSemiringAction G B] : G :=\n",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (a : A) : G :=\n",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "noncomputable def Frobenius conjugacyClass {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) : G ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "def frobenius_element {A B : Type*} [CommRing A] [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] [Fintype G] :\n ∃ x : B, ∀ g : G, x * g = g * x :=\n",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "noncomputable def FrobeniusElement (G : Type*) [Group G] (A : Type*) [CommRing A]\n (B : Type*) [CommRing B] [Algebra A B] (h : G →*+* B) : G :=\n",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "def frobenius (P : Polynomial A) : Polynomial A :=\n let frobenius := Polynomial.mapRingHom (Algebra.toRingHom)\n let X := frobenius X\n let replaceX := Polynomial.monomial (Polynomial.natDegree P) X\n let clearCoeffs := Polynomial.map (fun n : ℕ => if n = 0 then 1 else 0) P\n clearCoeffs.comp replaceX",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "noncomputable def FrobeniusElement (G : Type*) [Group G] (hG : Finite G) (B : Type*) [CommRing B] [Algebra G B] : G → B[X] :=\n",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "noncomputable def frobeniusElement (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B]\n (AB : CommRingHom A B) : G ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "def frosh (G : Type*) [Group G] [Finite G] (A : Type*) [CommRing A]\n (B : Type*) [CommRing B] [Algebra A B] (P : Ideal A) [IsPrime P]\n (hP : P = monomial (Nat.card G) 1) : Ideal B :=\n",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "noncomputable def FrobeniusElement (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A] [Algebra A B] : G → B[X] ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "def FrobeniusElement {A : Type*} {B : Type*} {G : Type*} [CommRing A] [CommRing B]\n [Group G] [MulSemiringAction G B] (hG : Finite G) :\n ∃ x : B, (∀ g : G, g • x = x) ∧\n ∃ F : G → B, (∀ g : G, F g • x = x) ∧\n (∀ g : G, F g = g) ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (lambda : B) : ∃ P : Polynomial B, P.Monic ∧ P.degree = Nat.card G ∧\n lambda ∈ P.roots ∧ P.Splits ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 3456,
511
+ "prompt_tokens": 1810,
512
+ "total_tokens": 5266,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.f_exists/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": "theorem f_exists {A B : Type*} [CommRing A] [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n [SMulCommClass G A B] {P : Ideal A} :\n (∀ (g : G), g • frobeniusElement P = frobeniusElement P) ↔\n ∃ (F : frobeniusConjugacyClass P), F.Normal := by sorry", "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": "theorem f_exists {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B] {x : B} (hx : IsAlgebraic A x) :\n ∃ (P : Polynomial B) (hx : P.Monic) (hP : P.degree = Nat.card G)\n (hP1 : P.eval x = 0) (hP2 : ∀ g : G, P.eval (g • x) = 0)\n (hP3 : ∀ i : Fin (Nat.card G), P.derivative.eval (x + i * 1) = 0) := by sorry", "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": "theorem f_exists {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (lambda : B) : ∃ P : Polynomial B, P.Monic ∧ P.degree = Nat.card G ∧\n lambda ∈ P.roots ∧ P.Splits := by sorry", "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/ground_truth.lean ADDED
@@ -0,0 +1,781 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Jou Glasheen. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Jou Glasheen, Amelia Livingston, Jujian Zhang, Kevin Buzzard
5
+ -/
6
+ import Mathlib.FieldTheory.Cardinality
7
+ import Mathlib.RingTheory.DedekindDomain.Ideal
8
+ import Mathlib.RingTheory.Ideal.Pointwise
9
+ import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
10
+ import Mathlib.RingTheory.Ideal.Pointwise
11
+ import Mathlib.RingTheory.Ideal.Over
12
+ import Mathlib.FieldTheory.Normal
13
+ import Mathlib.FieldTheory.SeparableClosure
14
+ import Mathlib.RingTheory.OreLocalization.Ring
15
+
16
+ /-!
17
+
18
+ # Frobenius elements.
19
+
20
+ This file proves a general result in commutative algebra which can be used to define Frobenius
21
+ elements of Galois groups of local or fields (for example number fields).
22
+
23
+ KB was alerted to this very general result (which needs no Noetherian or finiteness assumptions
24
+ on the rings, just on the Galois group) by Joel Riou
25
+ here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112
26
+
27
+ ## Mathematical details
28
+
29
+ ### The general commutative algebra result
30
+
31
+ This is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.
32
+ Let `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,
33
+ such that the `G`-invariants of `B` are exactly the image of `A`.
34
+
35
+ The two claims of the theorem are:
36
+ (i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.
37
+ (ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`
38
+ in `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is
39
+ surjective.
40
+
41
+ We say "automorphism group" rather than "Galois group" because the extension might not be
42
+ separable (it is algebraic and normal however, but it can be infinite; however its maximal
43
+ separable subextension is finite).
44
+
45
+ This result means that if the inertia group I_Q is trivial and the residue fields are finite,
46
+ there's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class
47
+ Frob_P in G.
48
+
49
+ -/
50
+
51
+
52
+ variable {A : Type*} [CommRing A]
53
+ {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]
54
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
55
+
56
+
57
+
58
+ open scoped algebraMap
59
+
60
+ --variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
61
+ --variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
62
+
63
+ section misc
64
+
65
+ variable {A : Type*} [CommRing A]
66
+ {B : Type*} [CommRing B] [Algebra A B]
67
+ {G : Type*} [Group G] [MulSemiringAction G B]
68
+ [SMulCommClass G A B]
69
+
70
+ open scoped Pointwise
71
+
72
+ /-
73
+ If you're happy to stick to finite G, it's just this:
74
+
75
+ private theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
76
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
77
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
78
+ fun x ↦ smul_smul g x b
79
+
80
+ But the below proof works in general.
81
+ -/
82
+
83
+ private theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := by
84
+ obtain (hfin | hinf) := em <| Finite G
85
+ · calc
86
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
87
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
88
+ fun x ↦ smul_smul g x b
89
+ · obtain (rfl | hb) := eq_or_ne b 1
90
+ · simp
91
+ · suffices (Function.mulSupport ((· • b) : G → B)).Infinite by
92
+ classical
93
+ simp [finprod_def, dif_neg this]
94
+ have htop : (⊤ : Set G).Infinite := by simpa using Set.infinite_univ_iff.mpr ({ not_finite := hinf })
95
+ convert htop
96
+ rw [eq_top_iff]
97
+ intro g _
98
+ simp only [Function.mem_mulSupport]
99
+ contrapose! hb
100
+ apply_fun (fun x ↦ g⁻¹ • x) at hb
101
+ simpa using hb
102
+
103
+ theorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]
104
+ (I : Ideal S) [hI : I.IsPrime] (f : R → S) :
105
+ ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := by
106
+ have := Fintype.ofFinite R
107
+ rw [finprod_eq_prod_of_fintype, Finset.prod_eq_multiset_prod, hI.multiset_prod_mem_iff_exists_mem]
108
+ simp
109
+
110
+ end misc
111
+
112
+ section charpoly
113
+
114
+ open Polynomial BigOperators
115
+
116
+ variable {A : Type*} [CommRing A]
117
+ {B : Type*} [CommRing B] [Algebra A B]
118
+ {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]
119
+
120
+
121
+ variable (G) in
122
+ /-- The characteristic polynomial of an element `b` of a `G`-semiring `B`
123
+ is the polynomial `∏_{g ∈ G} (X - g • b)` (here `G` is finite; junk
124
+ returned in the infinite case) .-/
125
+ noncomputable def MulSemiringAction.CharacteristicPolynomial.F (b : B) : B[X] :=
126
+ ∏ᶠ τ : G, (X - C (τ ��� b))
127
+
128
+ namespace MulSemiringAction.CharacteristicPolynomial
129
+
130
+ theorem F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
131
+
132
+ section F_API
133
+
134
+ variable [Finite G]
135
+
136
+ theorem F_monic [Nontrivial B] (b : B) : (F G b).Monic := by
137
+ have := Fintype.ofFinite G
138
+ rw [Monic, F_spec, finprod_eq_prod_of_fintype, leadingCoeff_prod'] <;> simp
139
+
140
+ theorem F_natdegree [Nontrivial B] (b : B) : (F G b).natDegree = Nat.card G := by
141
+ have := Fintype.ofFinite G
142
+ rw [F_spec, finprod_eq_prod_of_fintype, natDegree_prod_of_monic _ _ (fun _ _ => monic_X_sub_C _)]
143
+ simp only [natDegree_X_sub_C, Finset.sum_const, Finset.card_univ, Fintype.card_eq_nat_card,
144
+ nsmul_eq_mul, mul_one, Nat.cast_id]
145
+
146
+ variable (G) in
147
+ theorem F_degree [Nontrivial B] (b : B) : (F G b).degree = Nat.card G := by
148
+ have := Fintype.ofFinite G
149
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos, F_natdegree]
150
+
151
+ theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
152
+ σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rw [F_spec]
153
+ _ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := smul_finprod' _
154
+ _ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]
155
+ _ = ∏ᶠ τ' : G, (X - C (τ' • b)) := finprod_eq_of_bijective (fun τ ↦ σ * τ)
156
+ (Group.mulLeft_bijective σ) (fun _ ↦ rfl)
157
+ _ = F G b := by rw [F_spec]
158
+
159
+ theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
160
+ let foo := Fintype.ofFinite G
161
+ simp [F_spec,finprod_eq_prod_of_fintype,eval_prod]
162
+ apply @Finset.prod_eq_zero _ _ _ _ _ (1 : G) (Finset.mem_univ 1)
163
+ simp
164
+
165
+ private theorem F_coeff_fixed (b : B) (n : ℕ) (g : G) :
166
+ g • (F G b).coeff n = (F G b).coeff n := by
167
+ change (g • (F G b)).coeff n = _
168
+ rw [F_smul_eq_self]
169
+
170
+ end F_API
171
+
172
+ open scoped algebraMap
173
+
174
+ noncomputable local instance : Algebra A[X] B[X] :=
175
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
176
+
177
+ @[simp, norm_cast]
178
+ theorem _root_.coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
179
+ map_monomial _
180
+
181
+ section full_descent
182
+
183
+ variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
184
+
185
+ -- Remark: the `splitting_of_full` approach is lousy and should be
186
+ -- replaced by the commented-out code below (lines 275-296 currently)
187
+
188
+ /-- This "splitting" function from B to A will only ever be evaluated on
189
+ G-invariant elements of B, and the two key facts about it are
190
+ that it lifts such an element to `A`, and for reasons of
191
+ convenience it lifts `1` to `1`. -/
192
+ noncomputable def splitting_of_full
193
+ (b : B) : A := by classical
194
+ exact
195
+ if b = 1 then 1 else
196
+ if h : ∀ σ : G, σ • b = b then (hFull b h).choose
197
+ else 37
198
+
199
+ theorem splitting_of_full_spec {b : B} (hb : ∀ σ : G, σ • b = b) :
200
+ splitting_of_full hFull b = b := by
201
+ unfold splitting_of_full
202
+ split_ifs with h1
203
+ · rw_mod_cast [h1]
204
+ · exact (hFull b hb).choose_spec.symm
205
+
206
+ theorem splitting_of_full_one : splitting_of_full hFull 1 = 1 := by
207
+ unfold splitting_of_full
208
+ rw [if_pos rfl]
209
+
210
+ noncomputable def M (b : B) : A[X] :=
211
+ (∑ x ∈ (F G b).support, monomial x (splitting_of_full hFull ((F G b).coeff x)))
212
+
213
+ theorem M_deg_le (b : B) : (M hFull b).degree ≤ (F G b).degree := by
214
+ unfold M
215
+ have := Polynomial.degree_sum_le (F G b).support (fun x => monomial x (splitting_of_full hFull ((F G b).coeff x)))
216
+ refine le_trans this ?_
217
+ rw [Finset.sup_le_iff]
218
+ intro n hn
219
+ apply le_trans (degree_monomial_le n _) ?_
220
+ exact le_degree_of_mem_supp n hn
221
+
222
+ variable [Nontrivial B] [Finite G]
223
+
224
+ theorem M_coeff_card (b : B) :
225
+ (M hFull b).coeff (Nat.card G) = 1 := by
226
+ unfold M
227
+ simp only [finset_sum_coeff]
228
+ have hdeg := F_degree G b
229
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos] at hdeg
230
+ rw [ ← hdeg]
231
+ rw [Finset.sum_eq_single_of_mem ((F G b).natDegree)]
232
+ · have : (F G b).Monic := F_monic b
233
+ simp
234
+ simp_all [splitting_of_full_one]
235
+ · refine natDegree_mem_support_of_nonzero ?h.H
236
+ intro h
237
+ rw [h] at hdeg
238
+ have : 0 < Nat.card G := Nat.card_pos
239
+ simp_all
240
+ · intro d _ hd
241
+ exact coeff_monomial_of_ne (splitting_of_full hFull ((F G b).coeff d)) hd
242
+
243
+ theorem M_deg_eq_F_deg [Nontrivial A] (b : B) : (M hFull b).degree = (F G b).degree := by
244
+ apply le_antisymm (M_deg_le hFull b)
245
+ rw [F_degree]
246
+ have := M_coeff_card hFull b
247
+ refine le_degree_of_ne_zero ?h
248
+ rw [this]
249
+ exact one_ne_zero
250
+
251
+ theorem M_deg [Nontrivial A] (b : B) : (M hFull b).degree = Nat.card G := by
252
+ rw [M_deg_eq_F_deg hFull b]
253
+ exact F_degree G b
254
+
255
+ theorem M_monic (b : B) : (M hFull b).Monic := by
256
+ have this1 := M_deg_le hFull b
257
+ have this2 := M_coeff_card hFull b
258
+ have this3 : 0 < Nat.card G := Nat.card_pos
259
+ rw [← F_natdegree b] at this2 this3
260
+ -- then the hypos say deg(M)<=n, coefficient of X^n is 1 in M
261
+ have this4 : (M hFull b).natDegree ≤ (F G b).natDegree := natDegree_le_natDegree this1
262
+ exact Polynomial.monic_of_natDegree_le_of_coeff_eq_one _ this4 this2
263
+
264
+ omit [Nontrivial B] in
265
+ theorem M_spec (b : B) : ((M hFull b : A[X]) : B[X]) = F G b := by
266
+ unfold M
267
+ ext N
268
+ push_cast
269
+ simp_rw [splitting_of_full_spec hFull <| F_coeff_fixed b _]
270
+ simp_rw [finset_sum_coeff, ← lcoeff_apply, lcoeff_apply, coeff_monomial]
271
+ aesop
272
+
273
+ omit [Nontrivial B] in
274
+ theorem M_spec_map (b : B) : (map (algebraMap A B) (M hFull b)) = F G b := by
275
+ rw [← M_spec hFull b]; rfl
276
+
277
+ omit [Nontrivial B] in
278
+ theorem M_eval_eq_zero (b : B) : (M hFull b).eval₂ (algebraMap A B) b = 0 := by
279
+ rw [eval₂_eq_eval_map, M_spec_map, F_eval_eq_zero]
280
+
281
+ include hFull in
282
+ theorem isIntegral : Algebra.IsIntegral A B where
283
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
284
+
285
+ end full_descent
286
+
287
+ end MulSemiringAction.CharacteristicPolynomial
288
+
289
+ end charpoly
290
+
291
+ section part_a
292
+
293
+ open MulSemiringAction.CharacteristicPolynomial
294
+
295
+ variable {A : Type*} [CommRing A]
296
+ {B : Type*} [CommRing B] [Algebra A B] [Nontrivial B]
297
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
298
+
299
+ theorem isIntegral_of_Full (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
300
+ Algebra.IsIntegral A B where
301
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
302
+
303
+ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
304
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
305
+
306
+ open scoped Pointwise
307
+
308
+ theorem Nontrivial_of_exists_prime {R : Type*} [CommRing R]
309
+ (h : ∃ P : Ideal R, P.IsPrime) : Nontrivial R := by
310
+ contrapose! h
311
+ intro P hP
312
+ rw [@not_nontrivial_iff_subsingleton] at h
313
+ obtain ⟨h, _⟩ := hP
314
+ apply h
315
+ apply Subsingleton.elim
316
+
317
+ -- (Part a of Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
318
+ omit [Nontrivial B] in
319
+ theorem part_a [SMulCommClass G A B]
320
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
321
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
322
+ ∃ g : G, Q = g • P := by
323
+ haveI : Nontrivial B := Nontrivial_of_exists_prime ⟨Q, inferInstance⟩
324
+ haveI : Algebra.IsIntegral A B := isIntegral_of_Full hFull'
325
+ cases nonempty_fintype G
326
+ suffices ∃ g : G, Q ≤ g • P by
327
+ obtain ⟨g, hg⟩ := this
328
+ use g
329
+ by_contra! hQ
330
+ have : Q < g • P := lt_of_le_of_ne hg hQ
331
+ obtain ⟨x, hxP, hxQ⟩ := Set.exists_of_ssubset <| this
332
+ apply (Ideal.comap_lt_comap_of_integral_mem_sdiff (R := A) hg ⟨hxP, hxQ⟩ <|
333
+ Algebra.isIntegral_def.1 inferInstance x).ne
334
+ rw [← hPQ]
335
+ ext x
336
+ specialize hFull' (algebraMap A B x)
337
+ have : ∀ (g : G), g • (algebraMap A B x) = (algebraMap A B x) := fun g ↦ by
338
+ rw [Algebra.algebraMap_eq_smul_one, smul_comm, smul_one]
339
+ simp only [Ideal.mem_comap]
340
+ nth_rw 2 [← this]
341
+ exact Ideal.smul_mem_pointwise_smul_iff.symm
342
+ suffices ∃ g ∈ (⊤ : Finset G), Q ≤ g • P by
343
+ convert this; simp
344
+ rw [← Ideal.subset_union_prime 1 1 <| fun g _ _ _ ↦ ?_]; swap
345
+ · exact Ideal.map_isPrime_of_equiv (MulSemiringAction.toRingEquiv _ _ g)
346
+ intro x hx
347
+ specialize hFull' (∏ᶠ σ : G, σ • x)
348
+ obtain ⟨a, ha⟩ := hFull' (norm_fixed _)
349
+ have : (a : B) ∈ Q := by
350
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem]
351
+ use 1
352
+ simpa using hx
353
+ have : (a : B) ∈ P := by
354
+ unfold Algebra.cast
355
+ rwa [← Ideal.mem_comap, hPQ, Ideal.mem_comap]
356
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem] at this
357
+ obtain ⟨σ, hσ⟩ : ∃ σ : G, σ • x ∈ P := this
358
+ simp only [Finset.top_eq_univ, Finset.coe_univ, Set.mem_univ, Set.iUnion_true, Set.mem_iUnion,
359
+ SetLike.mem_coe]
360
+ use σ⁻¹
361
+ rwa [Ideal.mem_inv_pointwise_smul_iff]
362
+
363
+ end part_a
364
+
365
+ -- section normal_elements
366
+ -- I'm going to avoid this because I'm just going to use scaling.
367
+ -- I'll show that every nonzero element of B/Q divides an element of A/P.
368
+
369
+ -- variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
370
+
371
+ -- open Polynomial
372
+
373
+ -- I've commented out the next section because ACL suggested
374
+ -- reading up-to-date Bourbaki here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
375
+ -- and apparently this will avoid the def below.
376
+
377
+ -- def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
378
+
379
+ -- namespace IsNormalElement
380
+
381
+ -- theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
382
+ -- IsNormalElement K x ↔
383
+ -- ∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
384
+ -- constructor
385
+ -- · intro h
386
+ -- exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
387
+ -- · rintro ⟨P, hPmonic, hPeval, hPsplits⟩
388
+ -- -- need min poly divides P and then it should all be over
389
+ -- sorry -- presumably some form of this is in the library
390
+
391
+ -- theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
392
+ -- (hx : IsNormalElement K x) (hy : IsNormalElement K y) :
393
+ -- IsNormalElement K (x * y) := by
394
+ -- rw [iff_exists_monic_splits K hxint] at hx
395
+ -- obtain ⟨Px, hx1, hx2, hx3⟩ := hx
396
+ -- rw [iff_exists_monic_splits K hyint] at hy
397
+ -- obtain ⟨Py, hy1, hy2, hy3⟩ := hy
398
+ -- rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
399
+ -- -- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
400
+ -- -- Do we have this?
401
+ -- -- Is this even the best way to go about this?
402
+ -- -- Note: Chambert-Loir says there's a proof in Bourbaki
403
+ -- sorry
404
+
405
+ -- -- API
406
+
407
+ -- end IsNormalElement
408
+
409
+ -- end normal_elements
410
+
411
+ section part_b
412
+
413
+ variable {A : Type*} [CommRing A]
414
+ {B : Type*} [CommRing B] [Algebra A B]
415
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B]
416
+
417
+ /-
418
+ Set-up for part (b) of the lemma. G acts on B with invariants A (or more precisely the
419
+ image of A). Warning: `P` was a prime ideal of `B` in part (a) but it's a prime ideal
420
+ of `A` here, in fact it's `Q ∩ A`, the preimage of `Q` in `A`.
421
+
422
+ We want to consider the following commutative diagram.
423
+
424
+ B ---> B / Q -----> L = Frac(B/Q)
425
+ /\ /\ /\
426
+ | | |
427
+ | | |
428
+ A ---> A / P ----> K = Frac(A/P)
429
+
430
+ We will get to L, K, and the second square later.
431
+ First let's explain how to do P and Q.
432
+ -/
433
+ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
434
+ -- #synth Algebra A (B ⧸ Q) #exit -- works
435
+ ---synth IsScalarTower A B (B ⧸ Q) #exit-- works
436
+ -- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the
437
+ -- commutativity of the diagram! This is a trick I learnt from Jou who apparently
438
+ -- learnt it from Amelia
439
+ [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]
440
+ -- So now we know the left square commutes.
441
+ -- Amelia's first trick: commutativity of th LH diagram implies `P ⊆ Q ∩ A`
442
+ -- For the map `A -> A/P -> B/Q` must equal the map `A -> B -> B/Q` so `P` must
443
+ -- be a subset of the kernel of `A → B/Q`, which is `A ∩ Q`
444
+
445
+ omit [P.IsPrime] in
446
+ theorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :
447
+ algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
448
+ Ideal.Quotient.eq_zero_iff_mem
449
+
450
+ section B_mod_Q_over_A_mod_P_stuff
451
+
452
+ section Mathlib.RingTheory.Ideal.Quotient
453
+
454
+ namespace Ideal
455
+
456
+ variable {R : Type*} [CommRing R] {I : Ideal R}
457
+
458
+ protected noncomputable
459
+ def Quotient.out (x : R ⧸ I) :=
460
+ Quotient.out' x
461
+
462
+ theorem Quotient.out_eq (x : R ⧸ I) : Ideal.Quotient.mk I (Ideal.Quotient.out x) = x := by
463
+ simp only [Ideal.Quotient.out, Ideal.Quotient.mk, RingHom.coe_mk, MonoidHom.coe_mk, OneHom.coe_mk,
464
+ Submodule.Quotient.mk, Quotient.out_eq']
465
+
466
+ @[elab_as_elim]
467
+ protected theorem Quotient.induction_on
468
+ {p : R ⧸ I → Prop} (x : R ⧸ I) (h : ∀ a, p (Ideal.Quotient.mk I a)) : p x :=
469
+ Quotient.inductionOn x h
470
+
471
+ end Ideal
472
+
473
+ end Mathlib.RingTheory.Ideal.Quotient
474
+
475
+ namespace MulSemiringAction.CharacteristicPolynomial
476
+
477
+
478
+ open Polynomial
479
+ /-
480
+ I didn't check that this definition was independent
481
+ of the lift `b` of `bbar` (and it might not even be true).
482
+ But this doesn't matter, because `G` no longer acts on `B/Q`.
483
+ All we need is that `Mbar` is monic of degree `|G|`, is defined over the bottom ring
484
+ and kills `bbar`.
485
+ -/
486
+ variable {Q} in
487
+ noncomputable def Mbar
488
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
489
+ (bbar : B ⧸ Q) : (A ⧸ P)[X] :=
490
+ Polynomial.map (Ideal.Quotient.mk P) <| M hFull' <| Ideal.Quotient.out bbar
491
+
492
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
493
+
494
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
495
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
496
+ theorem Mbar_monic [Nontrivial B] (bbar : B ⧸ Q) : (Mbar P hFull' bbar).Monic := by
497
+ have := M_monic hFull'
498
+ simp [Mbar, (M_monic hFull' _).map]
499
+
500
+ omit [SMulCommClass G A B] [Q.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
501
+ theorem Mbar_deg [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
502
+ degree (Mbar P hFull' bbar) = Nat.card G := by
503
+ simp only [Mbar]
504
+ rw [degree_map_eq_of_leadingCoeff_ne_zero]
505
+ · exact M_deg hFull' _
506
+ · rw [(M_monic hFull' _).leadingCoeff]
507
+ simp only [map_one, ne_eq, one_ne_zero, not_false_eq_true]
508
+
509
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
510
+ theorem Mbar_eval_eq_zero [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
511
+ eval₂ (algebraMap (A ⧸ P) (B ⧸ Q)) bbar (Mbar P hFull' bbar) = 0 := by
512
+ have h := congr_arg (algebraMap B (B ⧸ Q)) (M_eval_eq_zero hFull' (Ideal.Quotient.out bbar))
513
+ rw [map_zero, hom_eval₂, Ideal.Quotient.algebraMap_eq, Ideal.Quotient.out_eq] at h
514
+ simpa [Mbar, eval₂_map, ← Ideal.Quotient.algebraMap_eq,
515
+ ← IsScalarTower.algebraMap_eq A (A ⧸ P) (B ⧸ Q), IsScalarTower.algebraMap_eq A B (B ⧸ Q)]
516
+
517
+ end CharacteristicPolynomial
518
+
519
+ open CharacteristicPolynomial in
520
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
521
+ theorem reduction_isIntegral
522
+ [Nontrivial A] [Nontrivial B]
523
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
524
+ Algebra.IsIntegral (A ⧸ P) (B ⧸ Q) where
525
+ isIntegral x := ⟨Mbar P hFull' x, Mbar_monic Q P hFull' x, Mbar_eval_eq_zero Q P hFull' x⟩
526
+
527
+ end MulSemiringAction
528
+
529
+ theorem Polynomial.nonzero_const_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
530
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
531
+ ∃ (q : Polynomial R), q.coeff 0 ≠ 0 ∧ q.eval₂ (algebraMap R S) s = 0 := by
532
+ obtain ⟨p, p_monic, p_eval⟩ := (@Algebra.isIntegral_def R S).mp inferInstance s
533
+ have p_nzero := ne_zero_of_ne_zero_of_monic X_ne_zero p_monic
534
+ obtain ⟨q, p_eq, q_ndvd⟩ := Polynomial.exists_eq_pow_rootMultiplicity_mul_and_not_dvd p p_nzero 0
535
+ rw [C_0, sub_zero] at p_eq
536
+ rw [C_0, sub_zero] at q_ndvd
537
+ use q
538
+ constructor
539
+ . intro q_coeff_0
540
+ exact q_ndvd <| X_dvd_iff.mpr q_coeff_0
541
+ . rw [p_eq, eval₂_mul] at p_eval
542
+ rcases NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero p_eval with Xpow_eval | q_eval
543
+ . by_contra
544
+ apply hs
545
+ rw [eval₂_X_pow] at Xpow_eval
546
+ exact pow_eq_zero Xpow_eval
547
+ . exact q_eval
548
+
549
+ theorem Algebra.exists_dvd_nonzero_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
550
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
551
+ ∃ r : R, r ≠ 0 ∧ s ∣ (algebraMap R S) r := by
552
+ obtain ⟨q, q_zero_coeff, q_eval_zero⟩ := Polynomial.nonzero_const_if_isIntegral R S s hs
553
+ use q.coeff 0
554
+ refine ⟨q_zero_coeff, ?_⟩
555
+ rw [← Polynomial.eval₂_X (algebraMap R S) s, ← dvd_neg, ← Polynomial.eval₂_C (algebraMap R S) s]
556
+ rw [← zero_add (-_), Mathlib.Tactic.RingNF.add_neg, ← q_eval_zero, ← Polynomial.eval₂_sub]
557
+ apply Polynomial.eval₂_dvd
558
+ exact Polynomial.X_dvd_sub_C
559
+
560
+ end B_mod_Q_over_A_mod_P_stuff
561
+
562
+ /-
563
+ \section{The extension $L/K$.}
564
+
565
+ \begin{theorem}
566
+ \label{foo1}
567
+ If $\lambda\in L$ then there's a monic polynomial $P_\lambda\in K[X]$ of degree $|G|$
568
+ with $\lambda$ as a root, and which splits completely in $L[X]$.
569
+ \end{theorem}
570
+ \begin{proof}
571
+ A general $\lambda\in L$ can be written as $\beta_1/\beta_2$ where $\beta_1,\beta_2\in B/Q$.
572
+ The previous corollary showed that there's some nonzero $\alpha\in A/P$ such that $\beta_2$
573
+ divides $\alpha$, and hence $\alpha\lambda\in B/Q$ (we just cleared denominators).
574
+ Thus $\alpha\lambda$ is a root of some monic polynomial $f(x)\in (A/P)[X]$,
575
+ by~\ref{MulSemiringAction.CharacteristicPolynomial.Mbar_eval_eq_zero}.
576
+ The polynomial $f(\alpha x)\in (A/P)[X]$ thus
577
+ has $\lambda$ as a root, but it is not monic; its leading term is $\alpha^n$.
578
+ Dividing through in $K[X]$ gives us the polynomial we seek.
579
+ \end{proof}
580
+
581
+ \begin{corollary} The extension $L/K$ is algebraic and normal.
582
+ \end{corollary}
583
+ \begin{proof} \uses{foo1}
584
+ Exercise using the previous theorem.
585
+ \end{proof}
586
+
587
+ Note that $L/K$ might not be separable and might have infinite degree. However
588
+
589
+ \begin{corollary} Any subextension of $L/K$ which is finite and separable over $K$
590
+ has degree at most $|G|$.
591
+ \end{corollary}
592
+ \begin{proof}
593
+ Finite and separable implies simple, and we've already seen that any
594
+ element of $L$ has degree at most $|G|$ over $K$.
595
+ \end{proof}
596
+
597
+ \begin{corollary} The maximal separable subextension $M$ of $L/K$ has degree at most $|G|$.
598
+ \end{corollary}
599
+ \begin{proof} If it has dimension greater than $|G|$ over $K$, then it has a finitely-generated
600
+ subfeld of $K$-dimension greater than $|G|$, and is finite and separable, contradicting
601
+ the previous result.
602
+ \end{proof}
603
+
604
+ \begin{corollary} $\Aut_K(L)$ is finite.
605
+ \end{corollary}
606
+ \begin{proof} Any $K$-automorphism of $L$ is determined by where it sends $M$.
607
+ \end{proof}
608
+
609
+ \begin{corollary} $\Aut_{A/P}(B/Q)$ is finite.
610
+ \end{corollary}
611
+ \begin{proof}
612
+ Two elements of $\Aut_{A/P}(B/Q)$ which agree once extended to automorphisms of $L$
613
+ must have already been equal, as $B/Q\subseteq L$. Hence the canonical map
614
+ from $\Aut_{A/P}(B/Q)$ to $\Aut_K(L)$ is injective.
615
+ \end{proof}
616
+
617
+ \section{Proof of surjectivity.}
618
+
619
+ \begin{definition} We fix once and for all some nonzero $y\in B/Q$ such that $M=K(y)$,
620
+ with $M$ the maximal separable subextension of $L/K$.
621
+ \end{definition}
622
+
623
+ Note that the existence of some $\lambda\in L$ with this property just comes from finite
624
+ and separable implies simple; we can use the ``clear denominator'' technique introduced
625
+ earlier to scale this by some nonzero $\alpha\in A$ into $B/Q$, as
626
+ $K(\lambda)=K(\alpha\lambda)$.
627
+
628
+ Here is a slightly delicate result whose proof I haven't thought too hard about.
629
+ \begin{theorem} There exists some $x\in B$ and $\alpha\in A$ with the following
630
+ properties.
631
+ \begin{enumerate}
632
+ \item $x=\alpha y$ mod $Q$ and $\alpha$ isn't zero mod $Q$.
633
+ \item $x\in Q'$ for all $Q'\not=Q$ in the $G$-orbit of $Q$.
634
+ \end{enumerate}
635
+ \end{theorem}
636
+ \begin{proof}
637
+ Idea. Localise away from P, then all the $Q_i$ are maximal, use CRT and then clear denominators.
638
+ \end{proof}
639
+
640
+ We now choose some $x\in B[1/S]$ which is $y$ modulo $Q$ and $0$ modulo all the other
641
+ primes of $B$ above $P$, and consider the monic degree $|G|$ polynomial $f$ in $K[X]$
642
+ with $x$ and its conjugates as roots. If $\sigma\in\Aut_K(L)$ then $\sigma(\overline{x})$
643
+ is a root of $f$ as $\sigma$ fixes $K$ pointwise. Hence $\sigma(\overline{x})=\overline{g(x)}$
644
+ for some $g\in G$, and because $\sigma(\overline{x})\not=0$ we have $\overline{g(x)}\not=0$
645
+ and hence $g(x)\notin Q[1/S]$. Hence $x\notin g^{-1} Q[1/S]$ and thus $g^{-1}Q=Q$ and $g\in SD_Q$.
646
+ Finally we have $\phi_g=\sigma$ on $K$ and on $y$, so they are equal on $M$ and hence on $L$ as
647
+ $L/M$ is purely inseparable.
648
+
649
+ This part of the argument seems weak.
650
+ -/
651
+
652
+ section L_over_K_stuff
653
+
654
+ -- Let's now make the right square. First `L`
655
+ variable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]
656
+ -- Now top left triangle: A / P → B / Q → L commutes
657
+ [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
658
+ -- now introduce K
659
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
660
+ -- now make bottom triangle commute
661
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L]
662
+ -- So now both squares commute.
663
+
664
+ -- do I need this?
665
+ -- [Algebra A K] [IsScalarTower A (A ⧸ P) K]
666
+
667
+ -- Do I need this:
668
+ -- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
669
+
670
+ variable [Nontrivial B]
671
+
672
+
673
+ -- Do we need a version of Ideal.Quotient.eq_zero_iff_mem with algebraMap?
674
+
675
+
676
+ -- not sure if we need this but let's prove it just to check our setup is OK.
677
+ -- The claim is that the preimage of Q really is P (rather than just containing P)
678
+ -- and the proof is that A/P -> B/Q extends to a map of fields which is injective,
679
+ -- so A/P -> B/Q must also be injective.
680
+ open IsScalarTower in
681
+ example : Ideal.comap (algebraMap A B) Q = P := by
682
+ ext x
683
+ simp only [Ideal.mem_comap]
684
+ rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']
685
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
686
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
687
+ rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]
688
+ rw [← algebraMap_apply A B (B ⧸ Q)]
689
+ rw [← algebraMap_apply (A ⧸ P) K L]
690
+ rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]
691
+ rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
692
+
693
+ open Polynomial BigOperators
694
+
695
+ open scoped algebraMap
696
+
697
+ noncomputable local instance : Algebra A[X] B[X] :=
698
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
699
+
700
+ theorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}
701
+ (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry
702
+
703
+ theorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]
704
+ [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):
705
+ IsAlgebraic K (IsLocalization.mk' S 1 x) := by
706
+ rw [← IsAlgebraic.invOf_iff, IsLocalization.invertible_mk'_one_invOf]
707
+ exact h
708
+
709
+ open MulSemiringAction.CharacteristicPolynomial
710
+
711
+ namespace Bourbaki52222
712
+
713
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in
714
+ variable (G) in
715
+ noncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=
716
+ if x = 0 then monomial (Nat.card G) 1
717
+ else 37 -- this is not actually right. In the nonzero case you
718
+ -- clear denominators with a nonzero element of A, using
719
+ -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar
720
+ -- scaled appropriately.
721
+
722
+ theorem f_exists [DecidableEq L] (l : L) :
723
+ ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧
724
+ eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by
725
+ use Bourbaki52222.residueFieldExtensionPolynomial G L K l
726
+ sorry
727
+
728
+ theorem algebraMap_cast {R S: Type*} [CommRing R] [CommRing S] [Algebra R S] (r : R) :
729
+ (r : S) = (algebraMap R S) r := by
730
+ rfl
731
+
732
+ theorem algebraMap_algebraMap {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] [Algebra R S]
733
+ [Algebra S T] [Algebra R T] [IsScalarTower R S T] (r : R) :
734
+ (algebraMap S T) ((algebraMap R S) r) = (algebraMap R T) r := by
735
+ exact Eq.symm (IsScalarTower.algebraMap_apply R S T r)
736
+
737
+ theorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
738
+ [CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
739
+ (h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
740
+ rw [Algebra.isAlgebraic_def]
741
+ let M := nonZeroDivisors R
742
+ intro x
743
+ have ⟨r, s, h'⟩ := IsLocalization.mk'_surjective M x
744
+ have : x = r * IsLocalization.mk' K 1 s := by
745
+ rw [← h', IsLocalization.mul_mk'_eq_mk'_of_mul]
746
+ simp
747
+ rw [this]
748
+ apply IsAlgebraic.mul (h r)
749
+ exact IsAlgebraic.invLoc (h s)
750
+
751
+ -- this uses `Algebra.isAlgebraic_of_subring_isAlgebraic` but I think we're going to have
752
+ -- to introduce `f` anyway because we need not just that the extension is algebraic but
753
+ -- that every element satisfies a poly of degree <= |G|.
754
+ theorem algebraic {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]
755
+ [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)
756
+ [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
757
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]
758
+ [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
759
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
760
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]
761
+ [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]
762
+ [IsScalarTower A B L]
763
+ (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by
764
+ apply @Algebra.isAlgebraic_of_subring_isAlgebraic (B ⧸ Q)
765
+ intro b_bar
766
+ have ⟨b, hb⟩ := Ideal.Quotient.mk_surjective b_bar
767
+ have hb : (algebraMap B (B ⧸ Q)) b = b_bar := hb
768
+ use ((M hFull b).map (algebraMap A (A ⧸ P))).map (algebraMap (A ⧸ P) K)
769
+ constructor
770
+ . apply ne_zero_of_ne_zero_of_monic X_ne_zero
771
+ apply Monic.map
772
+ apply Monic.map
773
+ exact M_monic hFull b
774
+ . rw [← hb, algebraMap_cast, map_map, ← IsScalarTower.algebraMap_eq]
775
+ rw [algebraMap_algebraMap, aeval_def, eval₂_eq_eval_map, map_map, ← IsScalarTower.algebraMap_eq]
776
+ rw [IsScalarTower.algebraMap_eq A B L, ← map_map, M_spec_map]
777
+ rw [eval_map, eval₂_hom, F_eval_eq_zero]
778
+ exact algebraMap.coe_zero
779
+
780
+ include G
781
+ theorem normal [DecidableEq L] : Normal K L := by sorry
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/input_messages_compress_3.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.FieldTheory.Cardinality\nimport Mathlib.RingTheory.DedekindDomain.Ideal\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.IntegralClosure.IntegralRestrict\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.Ideal.Over\nimport Mathlib.FieldTheory.Normal\nimport Mathlib.FieldTheory.SeparableClosure\nimport Mathlib.RingTheory.OreLocalization.Ring\n\n/-!\n\n# Frobenius elements.\n\nThis file proves a general result in commutative algebra which can be used to define Frobenius\nelements of Galois groups of local or fields (for example number fields).\n\nKB was alerted to this very general result (which needs no Noetherian or finiteness assumptions\non the rings, just on the Galois group) by Joel Riou\nhere https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112\n\n## Mathematical details\n\n### The general commutative algebra result\n\nThis is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.\nLet `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,\nsuch that the `G`-invariants of `B` are exactly the image of `A`.\n\nThe two claims of the theorem are:\n(i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.\n(ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`\nin `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is\nsurjective.\n\nWe say \"automorphism group\" rather than \"Galois group\" because the extension might not be\nseparable (it is algebraic and normal however, but it can be infinite; however its maximal\nseparable subextension is finite).\n\nThis result means that if the inertia group I_Q is trivial and the residue fields are finite,\nthere's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class\nFrob_P in G.\n\n-/\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nopen scoped algebraMap\n\n--variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)\n--variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n\nsection misc\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B]\n\nopen scoped Pointwise\n\n/-\nIf you're happy to stick to finite G, it's just this:\n\nprivate theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc\n g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _\n _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)\n... [TRUNCATED] ...\n ext x\n simp only [Ideal.mem_comap]\n rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']\n rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]\n rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]\n rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]\n rw [← algebraMap_apply A B (B ⧸ Q)]\n rw [← algebraMap_apply (A ⧸ P) K L]\n rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]\n rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]\n\nopen Polynomial BigOperators\n\nopen scoped algebraMap\n\nnoncomputable local instance : Algebra A[X] B[X] :=\n RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))\n\ntheorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}\n (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry\n\ntheorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]\n [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):\n IsAlgebraic K (IsLocalization.mk' S 1 x) := sorry\n\nopen MulSemiringAction.CharacteristicPolynomial\n\nnamespace Bourbaki52222\n\nvariable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in\nvariable (G) in\nnoncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=\n if x = 0 then monomial (Nat.card G) 1\n else 37 -- this is not actually right. In the nonzero case you\n -- clear denominators with a nonzero element of A, using\n -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar\n -- scaled appropriately.\n\ntheorem f_exists [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := sorry\n\ntheorem algebraMap_cast {R S: Type*} [CommRing R] [CommRing S] [Algebra R S] (r : R) :\n (r : S) = (algebraMap R S) r := sorry\n\ntheorem algebraMap_algebraMap {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] [Algebra R S]\n [Algebra S T] [Algebra R T] [IsScalarTower R S T] (r : R) :\n (algebraMap S T) ((algebraMap R S) r) = (algebraMap R T) r := sorry\n\ntheorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]\n [CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]\n (h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := sorry\n\n-- this uses `Algebra.isAlgebraic_of_subring_isAlgebraic` but I think we're going to have\n-- to introduce `f` anyway because we need not just that the extension is algebraic but\n-- that every element satisfies a poly of degree <= |G|.\ntheorem algebraic {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := sorry\n\ninclude G in\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nThe extension $L/K$ is normal."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by sorry"}
3
+ {"prediction": "theorem normal {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P Q : Ideal A) (hP : P.IsPrime) (hQ : Q.IsPrime) (hPQ : P = Q): ∃ F : (A ⧸ P) ⧸ Q, F ^ (Nat.card G) = 1 ∧ ∀ x : (A ⧸ P) ⧸ Q, x ^ (Nat.card G) = 1 → ∃ g : G, F = g := by sorry"}
4
+ {"prediction": "theorem normal [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by sorry"}
5
+ {"prediction": "theorem normal (H : Subgroup G) [Finite G] (hH : H ≠ ⊤) :\n IsNormalcyGroup G H := by sorry"}
6
+ {"prediction": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower R S T] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by sorry"}
7
+ {"prediction": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A)\n [P.IsPrime] [Algebra (A ⧸ P) B] [IsScalarTower A (A ⧸ P) B]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): IsNormal (Algebra.toFractionRing A B) := by sorry"}
8
+ {"prediction": "theorem normal {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by sorry"}
9
+ {"prediction": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B) [Q.IsPrime]\n (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower M S T]\n (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]\n [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L] (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a):\n Normal L := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-a14aa0cb6d264063b9ec6f0724a2d430",
3
+ "created": 1749028670,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "noncomputable def extension_is_normal (L : Type*) [Field L] [Algebra A L] : Prop :=\n",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "noncomputable def NormalExtension (L : Type*) [Field L] (k : Type*) [Field k] : Prop :=\n let L_ALLOC ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "def galoisGroup (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] : G →* G ≃* G ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "theorem my_favorite_theorem {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P Q : Ideal A) (hP : P.IsPrime) (hQ : Q.IsPrime) (hPQ : P = Q): ∃ F : (A ⧸ P) ⧸ Q, F ^ (Nat.card G) = 1 ∧ ∀ x : (A ⧸ P) ⧸ Q, x ^ (Nat.card G) = 1 → ∃ g : G, F = g ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "def frobenius_element (G : Type*) [Group G] [Finite G] {B : Type*} [CommRing B] [Algebra A B]\n {P : Ideal A} [P.IsPrime] {Q : Ideal B} [Q.IsPrime] (hP : P = Q.restrict A) :\n ∃ f : G, f ^ (Nat.card G) = 1 ∧ ∀ x : B, f • x = x ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "def frobenius_element (p : G) : G ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "noncomputable def isFrobenius (A : Type*) [CommRing A] [IsFractionRing A L] [Algebra A L]\n (G : Type*) [Group G] [Finite G] [MulSemiringAction G L] : Prop :=\n",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "noncomputable def Frobenius conjugacyClass {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime]\n (hP : P ≠ ⊥) (hP1 : P ≠ ⊤) : G →* G ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "def frobenius_element (R : Type*) [CommRing R] [Fintype G] : G → R ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (b : B) : G :=\n",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "def isFrobenius (A : Type*) (B : Type*) (G : Type*) (P : Ideal A) (Q : Ideal B) : Prop ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "noncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=\n if x = 0 then monomial (Nat.card G) 1\n else 37 -- this is not actually right. In the nonzero case you\n -- clear denominators with a nonzero element of A, using\n -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar\n -- scaled appropriately.\n\ntheorem f_exists [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B]\n [Algebra G B] : G →* B ≃* G ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] {B : Type*} [CommRing B] [Algebra G B] : G ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "def frobenius_element (G : Type*) [Group G] [Finite G] (A : Type*) [CommRing A]\n (B : Type*) [CommRing B] [Algebra A B] : G →* B ≃* G :=\n",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "noncomputable def GaloisGroup (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] : Type* := G\n\nnoncomputable def frobenius (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] (x : GaloisGroup A B G) : G ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "noncomputable def extension_is_normal [DecidableEq L] [Field L] (l : L) : Prop :=\n",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "noncomputable def frobenius conjugacy_classes : G → Set (B ⧸ Q)ˣ ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "theorem normalcy_group (H : Subgroup G) [Finite G] (hH : H ≠ ⊤) :\n IsNormalcyGroup G H ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "noncomputable def monomial {K : Type*} [Field K] (n : ℕ) (a : K) : Polynomial K ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (g : G) : G ",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (P : Ideal G) : G :=\n",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "noncomputable def Frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B] [Algebra G B] : G :=\n",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower R S T] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "def frobenius conjugacy_class : G → Ideal B → Prop ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "length",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "noncomputable def Extensionsb : Type* := Extensionsb.mk (@CommRing sb) (@CommRing L) (@Algebra sb L)\n\nnoncomputable def Separable sb : Type* := Separable.mk (@CommRing sb) (@CommRing L) (@Algebra sb L)\n\nnoncomputable def ResidueField $ L $ K : Type* := ResidueField.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def InertiaGroup $ G $ Q : Type* := InertiaGroup.mk (@Group G) (@Ideal Q)\n\nnoncomputable def FrobeniusConjugacyClass $ G $ P : Type* := frobeniusConjugacyClass.mk (@Group G) (@Ideal P)\n\nnoncomputable def frobenius_element $ G $ Q : Type* := frobenius_element.mk (@Group G) (@Ideal Q)\n\nnoncomputable def frobenius_element mk : Type* := frobenius_element.mk (@Group G) (@Ideal Q)\n\nnoncomputable def separateVariables $ L $ K : Type* := separateVariables.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def algebraicVariables $ L $ K : Type* := algebraicVariables.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def algebraicVariables.mk : Type* := algebraicVariables.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def quotient.mk : Type* := quotient.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def finprod.mk : Type* := finprod.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def galoisGroup $ L $ K : Type* := GaloisGroup.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def frobeniusElement $ G $ P : Type* := frobeniusElement.mk (@Group G) (@Ideal P)\n\nnoncomputable def frobeniusElement.mk : Type* := frobeniusElement.mk (@Group G) (@Ideal P)\n\nnoncomputable def count.mk : Type* := count.mk (@CommRing L) (@CommRing K) (@Algebra L K)\n\nnoncomputable def univ.mk : Type* := univ.mk (@CommRing L) (@CommRing K)",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "noncomputable def Frobenius G [Group G] [Fintype G] {B : Type*} [CommRing B] [Algebra G B]\n : G → B ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A)\n [P.IsPrime] [Algebra (A ⧸ P) B] [IsScalarTower A (A ⧸ P) B]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): IsNormal (Algebra.toFractionRing A B) ",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] {L : Type*} [Field L] [Algebra G L] {P : Ideal G} [P.IsPrime] : G ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def isFrobenius (g : G) (b : B) : Prop :=\n ∀ (x : B), g • x = x ↔ ∃ a : A, x = a\n\nnoncomputable def frobeniusGroup : Set G := {g : G | ∀ (b : B), isFrobenius g b}\n\nnoncomputable def frobeniusConjugacy : G → Prop :=\n",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] (h : ∀ b : B, (∀ g : G, g • b = b) → ∃ a : A, b = a) :\n ∃ g : G, IsFrobenius g ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] (P : Ideal A) [P.IsPrime] (h : ∀ (g : G), g • P = P) : G ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def frobenius_element {A : Type*} {B : Type*} {G : Type*} [CommRing A] [CommRing B] [MulSemiringAction G B] [Group G] [Finite G] : G ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B]\n [Algebra G B] : G →* B ≃* G ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "noncomputable def frobenius (p : Polynomial K) : Polynomial K :=\n p.compRingHom K (Polynomial.X ^ (Nat.card G))\n\ntheorem algebraic {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "def frobenius_element (R : Type*) [CommRing R] (G : Type*) [Group G] [Finite G]\n [MulSemiringAction G R] (P : Ideal R) [P.IsPrime] : G ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "noncomputable def baseFieldOf (R : Type*) [Field R] (x : R) : Type* := R\n\nnoncomputable def extensionFieldOf (R : Type*) [Field R] [Algebra R L] (x : R) : Type* := L\n\nnoncomputable def FrobeniusElement (R : Type*) [Field R] [Algebra R L] (x : R) : R[X] ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "noncomputable def conjugate (g : G) : Polynomial K = by ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable def frobenius_element {A : Type*} {B : Type*} {G : Type*} [CommRing A] [CommRing B]\n [Group G] [MulSemiringAction G B] [Algebra A B] [Fintype G] : G ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "def frobenius_element (G : Type*) [Group G] [Finite G] (B : Type*) [CommRing B] [Algebra G B]\n : G ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "def isFrobenius (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime] (x : G) : Prop :=\n",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] (B : Type*) [CommRing B] [Algebra G B] : G ",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "noncomputable def frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [MulSemiringAction G B] : G → B ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "length",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "def frobeniusElement (g : G) : Ideal B :=Ideal.mk (Algebra.toRingHom K L) (Ideal.Quotient.mk' (B ⧸ (Ideal.mapRingHom (Algebra.toRingHom K L))) (Ideal.Quotient.mk' (A ⧸ (Ideal.mapRingHom (Algebra.toRingHom K L))) (Ideal.Quotient.mk' (B ⧸ Q) L))) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.mapRingHom (Algebra.toRingHom K L)))) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.mapRingHom (Algebra.toRingHom K L)))))\n\nnoncomputable def conjugacyClass (g : G) : Ideal G :=Ideal.mk (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.mapRingHom (Algebra.toRingHom K L)))) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.mapRingHom (Algebra.toRingHom K L)))) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.mapRingHom (Algebra.toRingHom K L)))))\n\ndef frobeniusConjugacyClass : Ideal G :=Ideal.mk (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.mapRingHom (Algebra.toRingHom K L)))) (Ideal.comap (Ideal.mapRingHom (Algebra.toRingHom K L)) (Ideal.comap (Ideal.mapRingHom (Algebra.to",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "noncomputable def GaloisGroup (A B : Type*) (hAB : Nontrivial B ∧ CommRing A ∧ Algebra A B) : Type* :=\n if |G| = 1 then G else (G ⧸ Subgroup.closure {x : G | ∃ b : B, x • b = b}) --see Bourbaki 52222 for the uses of `if` in defining Galois groups\n\ndef frobenius_element (A B : Type*) [CommRing A] [Algebra A B] (P : Ideal A) [P.IsPrime]\n (hP : P ≠ ⊤) : GaloisGroup A B →* (B ⧸ P)ˣ :=\n",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "noncomputable def counternormal_extension (L : Type*) [Field L] (h : Counternormal L) : Prop := ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B) [Q.IsPrime]\n (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower M S T]\n (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]\n [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L] (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a):\n Normal L ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "def Frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B] [Algebra G B]\n (P : Ideal B) [P.IsPrime] : G ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "noncomputable def baseChange {A B : Type*} {G : Type*} [CommRing A] [CommRing B]\n [MulSemiringAction G B] [Group G] : B →ₗ[A] B :=\n",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 4759,
511
+ "prompt_tokens": 2245,
512
+ "total_tokens": 7004,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.normal/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by sorry", "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": "theorem normal {A B : Type*} [CommRing A] [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P Q : Ideal A) (hP : P.IsPrime) (hQ : Q.IsPrime) (hPQ : P = Q): ∃ F : (A ⧸ P) ⧸ Q, F ^ (Nat.card G) = 1 ∧ ∀ x : (A ⧸ P) ⧸ Q, x ^ (Nat.card G) = 1 → ∃ g : G, F = g := by sorry", "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": "theorem normal [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": "theorem normal (H : Subgroup G) [Finite G] (hH : H ≠ ⊤) :\n IsNormalcyGroup G H := by sorry", "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower R S T] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by sorry", "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A)\n [P.IsPrime] [Algebra (A ⧸ P) B] [IsScalarTower A (A ⧸ P) B]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): IsNormal (Algebra.toFractionRing A B) := by sorry", "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": "theorem normal {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by sorry", "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": "theorem normal {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B) [Q.IsPrime]\n (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower M S T]\n (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]\n [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L] (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a):\n Normal L := by sorry", "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/ground_truth.lean ADDED
@@ -0,0 +1,798 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Jou Glasheen. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Jou Glasheen, Amelia Livingston, Jujian Zhang, Kevin Buzzard
5
+ -/
6
+ import Mathlib.FieldTheory.Cardinality
7
+ import Mathlib.RingTheory.DedekindDomain.Ideal
8
+ import Mathlib.RingTheory.Ideal.Pointwise
9
+ import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
10
+ import Mathlib.RingTheory.Ideal.Pointwise
11
+ import Mathlib.RingTheory.Ideal.Over
12
+ import Mathlib.FieldTheory.Normal
13
+ import Mathlib.FieldTheory.SeparableClosure
14
+ import Mathlib.RingTheory.OreLocalization.Ring
15
+
16
+ /-!
17
+
18
+ # Frobenius elements.
19
+
20
+ This file proves a general result in commutative algebra which can be used to define Frobenius
21
+ elements of Galois groups of local or fields (for example number fields).
22
+
23
+ KB was alerted to this very general result (which needs no Noetherian or finiteness assumptions
24
+ on the rings, just on the Galois group) by Joel Riou
25
+ here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112
26
+
27
+ ## Mathematical details
28
+
29
+ ### The general commutative algebra result
30
+
31
+ This is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.
32
+ Let `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,
33
+ such that the `G`-invariants of `B` are exactly the image of `A`.
34
+
35
+ The two claims of the theorem are:
36
+ (i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.
37
+ (ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`
38
+ in `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is
39
+ surjective.
40
+
41
+ We say "automorphism group" rather than "Galois group" because the extension might not be
42
+ separable (it is algebraic and normal however, but it can be infinite; however its maximal
43
+ separable subextension is finite).
44
+
45
+ This result means that if the inertia group I_Q is trivial and the residue fields are finite,
46
+ there's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class
47
+ Frob_P in G.
48
+
49
+ -/
50
+
51
+
52
+ variable {A : Type*} [CommRing A]
53
+ {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]
54
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
55
+
56
+
57
+
58
+ open scoped algebraMap
59
+
60
+ --variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)
61
+ --variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
62
+
63
+ section misc
64
+
65
+ variable {A : Type*} [CommRing A]
66
+ {B : Type*} [CommRing B] [Algebra A B]
67
+ {G : Type*} [Group G] [MulSemiringAction G B]
68
+ [SMulCommClass G A B]
69
+
70
+ open scoped Pointwise
71
+
72
+ /-
73
+ If you're happy to stick to finite G, it's just this:
74
+
75
+ private theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc
76
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
77
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
78
+ fun x ↦ smul_smul g x b
79
+
80
+ But the below proof works in general.
81
+ -/
82
+
83
+ private theorem norm_fixed (b : B) (g : G) : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := by
84
+ obtain (hfin | hinf) := em <| Finite G
85
+ · calc
86
+ g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _
87
+ _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)
88
+ fun x ↦ smul_smul g x b
89
+ · obtain (rfl | hb) := eq_or_ne b 1
90
+ · simp
91
+ · suffices (Function.mulSupport ((· • b) : G → B)).Infinite by
92
+ classical
93
+ simp [finprod_def, dif_neg this]
94
+ have htop : (⊤ : Set G).Infinite := by simpa using Set.infinite_univ_iff.mpr ({ not_finite := hinf })
95
+ convert htop
96
+ rw [eq_top_iff]
97
+ intro g _
98
+ simp only [Function.mem_mulSupport]
99
+ contrapose! hb
100
+ apply_fun (fun x ↦ g⁻¹ • x) at hb
101
+ simpa using hb
102
+
103
+ theorem _root_.Ideal.IsPrime.finprod_mem_iff_exists_mem {R S : Type*} [Finite R] [CommSemiring S]
104
+ (I : Ideal S) [hI : I.IsPrime] (f : R → S) :
105
+ ∏ᶠ x, f x ∈ I ↔ ∃ p, f p ∈ I := by
106
+ have := Fintype.ofFinite R
107
+ rw [finprod_eq_prod_of_fintype, Finset.prod_eq_multiset_prod, hI.multiset_prod_mem_iff_exists_mem]
108
+ simp
109
+
110
+ end misc
111
+
112
+ section charpoly
113
+
114
+ open Polynomial BigOperators
115
+
116
+ variable {A : Type*} [CommRing A]
117
+ {B : Type*} [CommRing B] [Algebra A B]
118
+ {G : Type*} [Group G] [MulSemiringAction G B] --[SMulCommClass G A B]
119
+
120
+
121
+ variable (G) in
122
+ /-- The characteristic polynomial of an element `b` of a `G`-semiring `B`
123
+ is the polynomial `∏_{g ∈ G} (X - g • b)` (here `G` is finite; junk
124
+ returned in the infinite case) .-/
125
+ noncomputable def MulSemiringAction.CharacteristicPolynomial.F (b : B) : B[X] :=
126
+ ∏ᶠ τ : G, (X - C (τ ��� b))
127
+
128
+ namespace MulSemiringAction.CharacteristicPolynomial
129
+
130
+ theorem F_spec (b : B) : F G b = ∏ᶠ τ : G, (X - C (τ • b)) := rfl
131
+
132
+ section F_API
133
+
134
+ variable [Finite G]
135
+
136
+ theorem F_monic [Nontrivial B] (b : B) : (F G b).Monic := by
137
+ have := Fintype.ofFinite G
138
+ rw [Monic, F_spec, finprod_eq_prod_of_fintype, leadingCoeff_prod'] <;> simp
139
+
140
+ theorem F_natdegree [Nontrivial B] (b : B) : (F G b).natDegree = Nat.card G := by
141
+ have := Fintype.ofFinite G
142
+ rw [F_spec, finprod_eq_prod_of_fintype, natDegree_prod_of_monic _ _ (fun _ _ => monic_X_sub_C _)]
143
+ simp only [natDegree_X_sub_C, Finset.sum_const, Finset.card_univ, Fintype.card_eq_nat_card,
144
+ nsmul_eq_mul, mul_one, Nat.cast_id]
145
+
146
+ variable (G) in
147
+ theorem F_degree [Nontrivial B] (b : B) : (F G b).degree = Nat.card G := by
148
+ have := Fintype.ofFinite G
149
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos, F_natdegree]
150
+
151
+ theorem F_smul_eq_self (σ : G) (b : B) : σ • (F G b) = F G b := calc
152
+ σ • F G b = σ • ∏ᶠ τ : G, (X - C (τ • b)) := by rw [F_spec]
153
+ _ = ∏ᶠ τ : G, σ • (X - C (τ • b)) := smul_finprod' _
154
+ _ = ∏ᶠ τ : G, (X - C ((σ * τ) • b)) := by simp [smul_sub, smul_smul]
155
+ _ = ∏ᶠ τ' : G, (X - C (τ' • b)) := finprod_eq_of_bijective (fun τ ↦ σ * τ)
156
+ (Group.mulLeft_bijective σ) (fun _ ↦ rfl)
157
+ _ = F G b := by rw [F_spec]
158
+
159
+ theorem F_eval_eq_zero (b : B) : (F G b).eval b = 0 := by
160
+ let foo := Fintype.ofFinite G
161
+ simp [F_spec,finprod_eq_prod_of_fintype,eval_prod]
162
+ apply @Finset.prod_eq_zero _ _ _ _ _ (1 : G) (Finset.mem_univ 1)
163
+ simp
164
+
165
+ private theorem F_coeff_fixed (b : B) (n : ℕ) (g : G) :
166
+ g • (F G b).coeff n = (F G b).coeff n := by
167
+ change (g • (F G b)).coeff n = _
168
+ rw [F_smul_eq_self]
169
+
170
+ end F_API
171
+
172
+ open scoped algebraMap
173
+
174
+ noncomputable local instance : Algebra A[X] B[X] :=
175
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
176
+
177
+ @[simp, norm_cast]
178
+ theorem _root_.coe_monomial (n : ℕ) (a : A) : ((monomial n a : A[X]) : B[X]) = monomial n (a : B) :=
179
+ map_monomial _
180
+
181
+ section full_descent
182
+
183
+ variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
184
+
185
+ -- Remark: the `splitting_of_full` approach is lousy and should be
186
+ -- replaced by the commented-out code below (lines 275-296 currently)
187
+
188
+ /-- This "splitting" function from B to A will only ever be evaluated on
189
+ G-invariant elements of B, and the two key facts about it are
190
+ that it lifts such an element to `A`, and for reasons of
191
+ convenience it lifts `1` to `1`. -/
192
+ noncomputable def splitting_of_full
193
+ (b : B) : A := by classical
194
+ exact
195
+ if b = 1 then 1 else
196
+ if h : ∀ σ : G, σ • b = b then (hFull b h).choose
197
+ else 37
198
+
199
+ theorem splitting_of_full_spec {b : B} (hb : ∀ σ : G, σ • b = b) :
200
+ splitting_of_full hFull b = b := by
201
+ unfold splitting_of_full
202
+ split_ifs with h1
203
+ · rw_mod_cast [h1]
204
+ · exact (hFull b hb).choose_spec.symm
205
+
206
+ theorem splitting_of_full_one : splitting_of_full hFull 1 = 1 := by
207
+ unfold splitting_of_full
208
+ rw [if_pos rfl]
209
+
210
+ noncomputable def M (b : B) : A[X] :=
211
+ (∑ x ∈ (F G b).support, monomial x (splitting_of_full hFull ((F G b).coeff x)))
212
+
213
+ theorem M_deg_le (b : B) : (M hFull b).degree ≤ (F G b).degree := by
214
+ unfold M
215
+ have := Polynomial.degree_sum_le (F G b).support (fun x => monomial x (splitting_of_full hFull ((F G b).coeff x)))
216
+ refine le_trans this ?_
217
+ rw [Finset.sup_le_iff]
218
+ intro n hn
219
+ apply le_trans (degree_monomial_le n _) ?_
220
+ exact le_degree_of_mem_supp n hn
221
+
222
+ variable [Nontrivial B] [Finite G]
223
+
224
+ theorem M_coeff_card (b : B) :
225
+ (M hFull b).coeff (Nat.card G) = 1 := by
226
+ unfold M
227
+ simp only [finset_sum_coeff]
228
+ have hdeg := F_degree G b
229
+ rw [degree_eq_iff_natDegree_eq_of_pos Nat.card_pos] at hdeg
230
+ rw [ ← hdeg]
231
+ rw [Finset.sum_eq_single_of_mem ((F G b).natDegree)]
232
+ · have : (F G b).Monic := F_monic b
233
+ simp
234
+ simp_all [splitting_of_full_one]
235
+ · refine natDegree_mem_support_of_nonzero ?h.H
236
+ intro h
237
+ rw [h] at hdeg
238
+ have : 0 < Nat.card G := Nat.card_pos
239
+ simp_all
240
+ · intro d _ hd
241
+ exact coeff_monomial_of_ne (splitting_of_full hFull ((F G b).coeff d)) hd
242
+
243
+ theorem M_deg_eq_F_deg [Nontrivial A] (b : B) : (M hFull b).degree = (F G b).degree := by
244
+ apply le_antisymm (M_deg_le hFull b)
245
+ rw [F_degree]
246
+ have := M_coeff_card hFull b
247
+ refine le_degree_of_ne_zero ?h
248
+ rw [this]
249
+ exact one_ne_zero
250
+
251
+ theorem M_deg [Nontrivial A] (b : B) : (M hFull b).degree = Nat.card G := by
252
+ rw [M_deg_eq_F_deg hFull b]
253
+ exact F_degree G b
254
+
255
+ theorem M_monic (b : B) : (M hFull b).Monic := by
256
+ have this1 := M_deg_le hFull b
257
+ have this2 := M_coeff_card hFull b
258
+ have this3 : 0 < Nat.card G := Nat.card_pos
259
+ rw [← F_natdegree b] at this2 this3
260
+ -- then the hypos say deg(M)<=n, coefficient of X^n is 1 in M
261
+ have this4 : (M hFull b).natDegree ≤ (F G b).natDegree := natDegree_le_natDegree this1
262
+ exact Polynomial.monic_of_natDegree_le_of_coeff_eq_one _ this4 this2
263
+
264
+ omit [Nontrivial B] in
265
+ theorem M_spec (b : B) : ((M hFull b : A[X]) : B[X]) = F G b := by
266
+ unfold M
267
+ ext N
268
+ push_cast
269
+ simp_rw [splitting_of_full_spec hFull <| F_coeff_fixed b _]
270
+ simp_rw [finset_sum_coeff, ← lcoeff_apply, lcoeff_apply, coeff_monomial]
271
+ aesop
272
+
273
+ omit [Nontrivial B] in
274
+ theorem M_spec_map (b : B) : (map (algebraMap A B) (M hFull b)) = F G b := by
275
+ rw [← M_spec hFull b]; rfl
276
+
277
+ omit [Nontrivial B] in
278
+ theorem M_eval_eq_zero (b : B) : (M hFull b).eval₂ (algebraMap A B) b = 0 := by
279
+ rw [eval₂_eq_eval_map, M_spec_map, F_eval_eq_zero]
280
+
281
+ include hFull in
282
+ theorem isIntegral : Algebra.IsIntegral A B where
283
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
284
+
285
+ end full_descent
286
+
287
+ end MulSemiringAction.CharacteristicPolynomial
288
+
289
+ end charpoly
290
+
291
+ section part_a
292
+
293
+ open MulSemiringAction.CharacteristicPolynomial
294
+
295
+ variable {A : Type*} [CommRing A]
296
+ {B : Type*} [CommRing B] [Algebra A B] [Nontrivial B]
297
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]
298
+
299
+ theorem isIntegral_of_Full (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
300
+ Algebra.IsIntegral A B where
301
+ isIntegral b := ⟨M hFull b, M_monic hFull b, M_eval_eq_zero hFull b⟩
302
+
303
+ variable (P Q : Ideal B) [P.IsPrime] [Q.IsPrime]
304
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
305
+
306
+ open scoped Pointwise
307
+
308
+ theorem Nontrivial_of_exists_prime {R : Type*} [CommRing R]
309
+ (h : ∃ P : Ideal R, P.IsPrime) : Nontrivial R := by
310
+ contrapose! h
311
+ intro P hP
312
+ rw [@not_nontrivial_iff_subsingleton] at h
313
+ obtain ⟨h, _⟩ := hP
314
+ apply h
315
+ apply Subsingleton.elim
316
+
317
+ -- (Part a of Théorème 2 in section 2 of chapter 5 of Bourbaki Alg Comm)
318
+ omit [Nontrivial B] in
319
+ theorem part_a [SMulCommClass G A B]
320
+ (hPQ : Ideal.comap (algebraMap A B) P = Ideal.comap (algebraMap A B) Q)
321
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
322
+ ∃ g : G, Q = g • P := by
323
+ haveI : Nontrivial B := Nontrivial_of_exists_prime ⟨Q, inferInstance⟩
324
+ haveI : Algebra.IsIntegral A B := isIntegral_of_Full hFull'
325
+ cases nonempty_fintype G
326
+ suffices ∃ g : G, Q ≤ g • P by
327
+ obtain ⟨g, hg⟩ := this
328
+ use g
329
+ by_contra! hQ
330
+ have : Q < g • P := lt_of_le_of_ne hg hQ
331
+ obtain ⟨x, hxP, hxQ⟩ := Set.exists_of_ssubset <| this
332
+ apply (Ideal.comap_lt_comap_of_integral_mem_sdiff (R := A) hg ⟨hxP, hxQ⟩ <|
333
+ Algebra.isIntegral_def.1 inferInstance x).ne
334
+ rw [← hPQ]
335
+ ext x
336
+ specialize hFull' (algebraMap A B x)
337
+ have : ∀ (g : G), g • (algebraMap A B x) = (algebraMap A B x) := fun g ↦ by
338
+ rw [Algebra.algebraMap_eq_smul_one, smul_comm, smul_one]
339
+ simp only [Ideal.mem_comap]
340
+ nth_rw 2 [← this]
341
+ exact Ideal.smul_mem_pointwise_smul_iff.symm
342
+ suffices ∃ g ∈ (⊤ : Finset G), Q ≤ g • P by
343
+ convert this; simp
344
+ rw [← Ideal.subset_union_prime 1 1 <| fun g _ _ _ ↦ ?_]; swap
345
+ · exact Ideal.map_isPrime_of_equiv (MulSemiringAction.toRingEquiv _ _ g)
346
+ intro x hx
347
+ specialize hFull' (∏ᶠ σ : G, σ • x)
348
+ obtain ⟨a, ha⟩ := hFull' (norm_fixed _)
349
+ have : (a : B) ∈ Q := by
350
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem]
351
+ use 1
352
+ simpa using hx
353
+ have : (a : B) ∈ P := by
354
+ unfold Algebra.cast
355
+ rwa [← Ideal.mem_comap, hPQ, Ideal.mem_comap]
356
+ rw [← ha, Ideal.IsPrime.finprod_mem_iff_exists_mem] at this
357
+ obtain ⟨σ, hσ⟩ : ∃ σ : G, σ • x ∈ P := this
358
+ simp only [Finset.top_eq_univ, Finset.coe_univ, Set.mem_univ, Set.iUnion_true, Set.mem_iUnion,
359
+ SetLike.mem_coe]
360
+ use σ⁻¹
361
+ rwa [Ideal.mem_inv_pointwise_smul_iff]
362
+
363
+ end part_a
364
+
365
+ -- section normal_elements
366
+ -- I'm going to avoid this because I'm just going to use scaling.
367
+ -- I'll show that every nonzero element of B/Q divides an element of A/P.
368
+
369
+ -- variable (K : Type*) [Field K] {L : Type*} [Field L] [Algebra K L]
370
+
371
+ -- open Polynomial
372
+
373
+ -- I've commented out the next section because ACL suggested
374
+ -- reading up-to-date Bourbaki here https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/poly.20whose.20roots.20are.20the.20products.20of.20the.20roots.20of.20polys/near/468585267
375
+ -- and apparently this will avoid the def below.
376
+
377
+ -- def IsNormalElement (x : L) : Prop := Splits (algebraMap K L) (minpoly K x)
378
+
379
+ -- namespace IsNormalElement
380
+
381
+ -- theorem iff_exists_monic_splits {x : L} (hx : IsIntegral K x) :
382
+ -- IsNormalElement K x ↔
383
+ -- ∃ P : K[X], P.Monic ∧ P.eval₂ (algebraMap K L) x = 0 ∧ Splits (algebraMap K L) P := by
384
+ -- constructor
385
+ -- · intro h
386
+ -- exact ⟨minpoly K x, minpoly.monic hx, minpoly.aeval K x, h⟩
387
+ -- · rintro ⟨P, hPmonic, hPeval, hPsplits⟩
388
+ -- -- need min poly divides P and then it should all be over
389
+ -- sorry -- presumably some form of this is in the library
390
+
391
+ -- theorem prod {x y : L} (hxint : IsIntegral K x) (hyint : IsIntegral K y)
392
+ -- (hx : IsNormalElement K x) (hy : IsNormalElement K y) :
393
+ -- IsNormalElement K (x * y) := by
394
+ -- rw [iff_exists_monic_splits K hxint] at hx
395
+ -- obtain ⟨Px, hx1, hx2, hx3⟩ := hx
396
+ -- rw [iff_exists_monic_splits K hyint] at hy
397
+ -- obtain ⟨Py, hy1, hy2, hy3⟩ := hy
398
+ -- rw [iff_exists_monic_splits K <| IsIntegral.mul hxint hyint]
399
+ -- -- If roots of Px are xᵢ and roots of Py are yⱼ, then use the poly whose roots are xᵢyⱼ.
400
+ -- -- Do we have this?
401
+ -- -- Is this even the best way to go about this?
402
+ -- -- Note: Chambert-Loir says there's a proof in Bourbaki
403
+ -- sorry
404
+
405
+ -- -- API
406
+
407
+ -- end IsNormalElement
408
+
409
+ -- end normal_elements
410
+
411
+ section part_b
412
+
413
+ variable {A : Type*} [CommRing A]
414
+ {B : Type*} [CommRing B] [Algebra A B]
415
+ {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] [SMulCommClass G A B]
416
+
417
+ /-
418
+ Set-up for part (b) of the lemma. G acts on B with invariants A (or more precisely the
419
+ image of A). Warning: `P` was a prime ideal of `B` in part (a) but it's a prime ideal
420
+ of `A` here, in fact it's `Q ∩ A`, the preimage of `Q` in `A`.
421
+
422
+ We want to consider the following commutative diagram.
423
+
424
+ B ---> B / Q -----> L = Frac(B/Q)
425
+ /\ /\ /\
426
+ | | |
427
+ | | |
428
+ A ---> A / P ----> K = Frac(A/P)
429
+
430
+ We will get to L, K, and the second square later.
431
+ First let's explain how to do P and Q.
432
+ -/
433
+ variable (Q : Ideal B) [Q.IsPrime] (P : Ideal A) [P.IsPrime]
434
+ -- #synth Algebra A (B ⧸ Q) #exit -- works
435
+ ---synth IsScalarTower A B (B ⧸ Q) #exit-- works
436
+ -- (hPQ : Ideal.comap (algebraMap A B) P = p) -- we will *prove* this from the
437
+ -- commutativity of the diagram! This is a trick I learnt from Jou who apparently
438
+ -- learnt it from Amelia
439
+ [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)]
440
+ -- So now we know the left square commutes.
441
+ -- Amelia's first trick: commutativity of th LH diagram implies `P ⊆ Q ∩ A`
442
+ -- For the map `A -> A/P -> B/Q` must equal the map `A -> B -> B/Q` so `P` must
443
+ -- be a subset of the kernel of `A → B/Q`, which is `A ∩ Q`
444
+
445
+ omit [P.IsPrime] in
446
+ theorem Ideal.Quotient.eq_zero_iff_mem' (x : A) :
447
+ algebraMap A (A ⧸ P) x = 0 ↔ x ∈ P :=
448
+ Ideal.Quotient.eq_zero_iff_mem
449
+
450
+ section B_mod_Q_over_A_mod_P_stuff
451
+
452
+ section Mathlib.RingTheory.Ideal.Quotient
453
+
454
+ namespace Ideal
455
+
456
+ variable {R : Type*} [CommRing R] {I : Ideal R}
457
+
458
+ protected noncomputable
459
+ def Quotient.out (x : R ⧸ I) :=
460
+ Quotient.out' x
461
+
462
+ theorem Quotient.out_eq (x : R ⧸ I) : Ideal.Quotient.mk I (Ideal.Quotient.out x) = x := by
463
+ simp only [Ideal.Quotient.out, Ideal.Quotient.mk, RingHom.coe_mk, MonoidHom.coe_mk, OneHom.coe_mk,
464
+ Submodule.Quotient.mk, Quotient.out_eq']
465
+
466
+ @[elab_as_elim]
467
+ protected theorem Quotient.induction_on
468
+ {p : R ⧸ I → Prop} (x : R ⧸ I) (h : ∀ a, p (Ideal.Quotient.mk I a)) : p x :=
469
+ Quotient.inductionOn x h
470
+
471
+ end Ideal
472
+
473
+ end Mathlib.RingTheory.Ideal.Quotient
474
+
475
+ namespace MulSemiringAction.CharacteristicPolynomial
476
+
477
+
478
+ open Polynomial
479
+ /-
480
+ I didn't check that this definition was independent
481
+ of the lift `b` of `bbar` (and it might not even be true).
482
+ But this doesn't matter, because `G` no longer acts on `B/Q`.
483
+ All we need is that `Mbar` is monic of degree `|G|`, is defined over the bottom ring
484
+ and kills `bbar`.
485
+ -/
486
+ variable {Q} in
487
+ noncomputable def Mbar
488
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
489
+ (bbar : B ⧸ Q) : (A ⧸ P)[X] :=
490
+ Polynomial.map (Ideal.Quotient.mk P) <| M hFull' <| Ideal.Quotient.out bbar
491
+
492
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)
493
+
494
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
495
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
496
+ theorem Mbar_monic [Nontrivial B] (bbar : B ⧸ Q) : (Mbar P hFull' bbar).Monic := by
497
+ have := M_monic hFull'
498
+ simp [Mbar, (M_monic hFull' _).map]
499
+
500
+ omit [SMulCommClass G A B] [Q.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)] [IsScalarTower A (A ⧸ P) (B ⧸ Q)] in
501
+ theorem Mbar_deg [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
502
+ degree (Mbar P hFull' bbar) = Nat.card G := by
503
+ simp only [Mbar]
504
+ rw [degree_map_eq_of_leadingCoeff_ne_zero]
505
+ · exact M_deg hFull' _
506
+ · rw [(M_monic hFull' _).leadingCoeff]
507
+ simp only [map_one, ne_eq, one_ne_zero, not_false_eq_true]
508
+
509
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
510
+ theorem Mbar_eval_eq_zero [Nontrivial A] [Nontrivial B] (bbar : B ⧸ Q) :
511
+ eval₂ (algebraMap (A ⧸ P) (B ⧸ Q)) bbar (Mbar P hFull' bbar) = 0 := by
512
+ have h := congr_arg (algebraMap B (B ⧸ Q)) (M_eval_eq_zero hFull' (Ideal.Quotient.out bbar))
513
+ rw [map_zero, hom_eval₂, Ideal.Quotient.algebraMap_eq, Ideal.Quotient.out_eq] at h
514
+ simpa [Mbar, eval₂_map, ← Ideal.Quotient.algebraMap_eq,
515
+ ← IsScalarTower.algebraMap_eq A (A ⧸ P) (B ⧸ Q), IsScalarTower.algebraMap_eq A B (B ⧸ Q)]
516
+
517
+ end CharacteristicPolynomial
518
+
519
+ open CharacteristicPolynomial in
520
+ omit [SMulCommClass G A B] [Q.IsPrime] [P.IsPrime] in
521
+ theorem reduction_isIntegral
522
+ [Nontrivial A] [Nontrivial B]
523
+ (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) :
524
+ Algebra.IsIntegral (A ⧸ P) (B ⧸ Q) where
525
+ isIntegral x := ⟨Mbar P hFull' x, Mbar_monic Q P hFull' x, Mbar_eval_eq_zero Q P hFull' x⟩
526
+
527
+ end MulSemiringAction
528
+
529
+ theorem Polynomial.nonzero_const_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
530
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
531
+ ∃ (q : Polynomial R), q.coeff 0 ≠ 0 ∧ q.eval₂ (algebraMap R S) s = 0 := by
532
+ obtain ⟨p, p_monic, p_eval⟩ := (@Algebra.isIntegral_def R S).mp inferInstance s
533
+ have p_nzero := ne_zero_of_ne_zero_of_monic X_ne_zero p_monic
534
+ obtain ⟨q, p_eq, q_ndvd⟩ := Polynomial.exists_eq_pow_rootMultiplicity_mul_and_not_dvd p p_nzero 0
535
+ rw [C_0, sub_zero] at p_eq
536
+ rw [C_0, sub_zero] at q_ndvd
537
+ use q
538
+ constructor
539
+ . intro q_coeff_0
540
+ exact q_ndvd <| X_dvd_iff.mpr q_coeff_0
541
+ . rw [p_eq, eval₂_mul] at p_eval
542
+ rcases NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero p_eval with Xpow_eval | q_eval
543
+ . by_contra
544
+ apply hs
545
+ rw [eval₂_X_pow] at Xpow_eval
546
+ exact pow_eq_zero Xpow_eval
547
+ . exact q_eval
548
+
549
+ theorem Algebra.exists_dvd_nonzero_if_isIntegral (R S : Type) [CommRing R] [Nontrivial R]
550
+ [CommRing S] [Algebra R S] [Algebra.IsIntegral R S] [IsDomain S] (s : S) (hs : s ≠ 0) :
551
+ ∃ r : R, r ≠ 0 ∧ s ∣ (algebraMap R S) r := by
552
+ obtain ⟨q, q_zero_coeff, q_eval_zero⟩ := Polynomial.nonzero_const_if_isIntegral R S s hs
553
+ use q.coeff 0
554
+ refine ⟨q_zero_coeff, ?_⟩
555
+ rw [← Polynomial.eval₂_X (algebraMap R S) s, ← dvd_neg, ← Polynomial.eval₂_C (algebraMap R S) s]
556
+ rw [← zero_add (-_), Mathlib.Tactic.RingNF.add_neg, ← q_eval_zero, ← Polynomial.eval₂_sub]
557
+ apply Polynomial.eval₂_dvd
558
+ exact Polynomial.X_dvd_sub_C
559
+
560
+ end B_mod_Q_over_A_mod_P_stuff
561
+
562
+ /-
563
+ \section{The extension $L/K$.}
564
+
565
+ \begin{theorem}
566
+ \label{foo1}
567
+ If $\lambda\in L$ then there's a monic polynomial $P_\lambda\in K[X]$ of degree $|G|$
568
+ with $\lambda$ as a root, and which splits completely in $L[X]$.
569
+ \end{theorem}
570
+ \begin{proof}
571
+ A general $\lambda\in L$ can be written as $\beta_1/\beta_2$ where $\beta_1,\beta_2\in B/Q$.
572
+ The previous corollary showed that there's some nonzero $\alpha\in A/P$ such that $\beta_2$
573
+ divides $\alpha$, and hence $\alpha\lambda\in B/Q$ (we just cleared denominators).
574
+ Thus $\alpha\lambda$ is a root of some monic polynomial $f(x)\in (A/P)[X]$,
575
+ by~\ref{MulSemiringAction.CharacteristicPolynomial.Mbar_eval_eq_zero}.
576
+ The polynomial $f(\alpha x)\in (A/P)[X]$ thus
577
+ has $\lambda$ as a root, but it is not monic; its leading term is $\alpha^n$.
578
+ Dividing through in $K[X]$ gives us the polynomial we seek.
579
+ \end{proof}
580
+
581
+ \begin{corollary} The extension $L/K$ is algebraic and normal.
582
+ \end{corollary}
583
+ \begin{proof} \uses{foo1}
584
+ Exercise using the previous theorem.
585
+ \end{proof}
586
+
587
+ Note that $L/K$ might not be separable and might have infinite degree. However
588
+
589
+ \begin{corollary} Any subextension of $L/K$ which is finite and separable over $K$
590
+ has degree at most $|G|$.
591
+ \end{corollary}
592
+ \begin{proof}
593
+ Finite and separable implies simple, and we've already seen that any
594
+ element of $L$ has degree at most $|G|$ over $K$.
595
+ \end{proof}
596
+
597
+ \begin{corollary} The maximal separable subextension $M$ of $L/K$ has degree at most $|G|$.
598
+ \end{corollary}
599
+ \begin{proof} If it has dimension greater than $|G|$ over $K$, then it has a finitely-generated
600
+ subfeld of $K$-dimension greater than $|G|$, and is finite and separable, contradicting
601
+ the previous result.
602
+ \end{proof}
603
+
604
+ \begin{corollary} $\Aut_K(L)$ is finite.
605
+ \end{corollary}
606
+ \begin{proof} Any $K$-automorphism of $L$ is determined by where it sends $M$.
607
+ \end{proof}
608
+
609
+ \begin{corollary} $\Aut_{A/P}(B/Q)$ is finite.
610
+ \end{corollary}
611
+ \begin{proof}
612
+ Two elements of $\Aut_{A/P}(B/Q)$ which agree once extended to automorphisms of $L$
613
+ must have already been equal, as $B/Q\subseteq L$. Hence the canonical map
614
+ from $\Aut_{A/P}(B/Q)$ to $\Aut_K(L)$ is injective.
615
+ \end{proof}
616
+
617
+ \section{Proof of surjectivity.}
618
+
619
+ \begin{definition} We fix once and for all some nonzero $y\in B/Q$ such that $M=K(y)$,
620
+ with $M$ the maximal separable subextension of $L/K$.
621
+ \end{definition}
622
+
623
+ Note that the existence of some $\lambda\in L$ with this property just comes from finite
624
+ and separable implies simple; we can use the ``clear denominator'' technique introduced
625
+ earlier to scale this by some nonzero $\alpha\in A$ into $B/Q$, as
626
+ $K(\lambda)=K(\alpha\lambda)$.
627
+
628
+ Here is a slightly delicate result whose proof I haven't thought too hard about.
629
+ \begin{theorem} There exists some $x\in B$ and $\alpha\in A$ with the following
630
+ properties.
631
+ \begin{enumerate}
632
+ \item $x=\alpha y$ mod $Q$ and $\alpha$ isn't zero mod $Q$.
633
+ \item $x\in Q'$ for all $Q'\not=Q$ in the $G$-orbit of $Q$.
634
+ \end{enumerate}
635
+ \end{theorem}
636
+ \begin{proof}
637
+ Idea. Localise away from P, then all the $Q_i$ are maximal, use CRT and then clear denominators.
638
+ \end{proof}
639
+
640
+ We now choose some $x\in B[1/S]$ which is $y$ modulo $Q$ and $0$ modulo all the other
641
+ primes of $B$ above $P$, and consider the monic degree $|G|$ polynomial $f$ in $K[X]$
642
+ with $x$ and its conjugates as roots. If $\sigma\in\Aut_K(L)$ then $\sigma(\overline{x})$
643
+ is a root of $f$ as $\sigma$ fixes $K$ pointwise. Hence $\sigma(\overline{x})=\overline{g(x)}$
644
+ for some $g\in G$, and because $\sigma(\overline{x})\not=0$ we have $\overline{g(x)}\not=0$
645
+ and hence $g(x)\notin Q[1/S]$. Hence $x\notin g^{-1} Q[1/S]$ and thus $g^{-1}Q=Q$ and $g\in SD_Q$.
646
+ Finally we have $\phi_g=\sigma$ on $K$ and on $y$, so they are equal on $M$ and hence on $L$ as
647
+ $L/M$ is purely inseparable.
648
+
649
+ This part of the argument seems weak.
650
+ -/
651
+
652
+ section L_over_K_stuff
653
+
654
+ -- Let's now make the right square. First `L`
655
+ variable (L : Type*) [Field L] [Algebra (B ⧸ Q) L] [IsFractionRing (B ⧸ Q) L]
656
+ -- Now top left triangle: A / P → B / Q → L commutes
657
+ [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
658
+ -- now introduce K
659
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
660
+ -- now make bottom triangle commute
661
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L]
662
+ -- So now both squares commute.
663
+
664
+ -- do I need this?
665
+ -- [Algebra A K] [IsScalarTower A (A ⧸ P) K]
666
+
667
+ -- Do I need this:
668
+ -- [Algebra B L] [IsScalarTower B (B ⧸ Q) L]
669
+
670
+ variable [Nontrivial B]
671
+
672
+
673
+ -- Do we need a version of Ideal.Quotient.eq_zero_iff_mem with algebraMap?
674
+
675
+
676
+ -- not sure if we need this but let's prove it just to check our setup is OK.
677
+ -- The claim is that the preimage of Q really is P (rather than just containing P)
678
+ -- and the proof is that A/P -> B/Q extends to a map of fields which is injective,
679
+ -- so A/P -> B/Q must also be injective.
680
+ open IsScalarTower in
681
+ example : Ideal.comap (algebraMap A B) Q = P := by
682
+ ext x
683
+ simp only [Ideal.mem_comap]
684
+ rw [← Ideal.Quotient.eq_zero_iff_mem', ← Ideal.Quotient.eq_zero_iff_mem']
685
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (A ⧸ P) K]
686
+ rw [← map_eq_zero_iff _ <| IsFractionRing.injective (B ⧸ Q) L]
687
+ rw [← map_eq_zero_iff _ <| RingHom.injective ((algebraMap K L) : K →+* L)]
688
+ rw [← algebraMap_apply A B (B ⧸ Q)]
689
+ rw [← algebraMap_apply (A ⧸ P) K L]
690
+ rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]
691
+ rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]
692
+
693
+ open Polynomial BigOperators
694
+
695
+ open scoped algebraMap
696
+
697
+ noncomputable local instance : Algebra A[X] B[X] :=
698
+ RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))
699
+
700
+ theorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}
701
+ (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry
702
+
703
+ theorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]
704
+ [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):
705
+ IsAlgebraic K (IsLocalization.mk' S 1 x) := by
706
+ rw [← IsAlgebraic.invOf_iff, IsLocalization.invertible_mk'_one_invOf]
707
+ exact h
708
+
709
+ open MulSemiringAction.CharacteristicPolynomial
710
+
711
+ namespace Bourbaki52222
712
+
713
+ variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in
714
+ variable (G) in
715
+ noncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=
716
+ if x = 0 then monomial (Nat.card G) 1
717
+ else 37 -- this is not actually right. In the nonzero case you
718
+ -- clear denominators with a nonzero element of A, using
719
+ -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar
720
+ -- scaled appropriately.
721
+
722
+ theorem f_exists [DecidableEq L] (l : L) :
723
+ ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧
724
+ eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by
725
+ use Bourbaki52222.residueFieldExtensionPolynomial G L K l
726
+ sorry
727
+
728
+ theorem algebraMap_cast {R S: Type*} [CommRing R] [CommRing S] [Algebra R S] (r : R) :
729
+ (r : S) = (algebraMap R S) r := by
730
+ rfl
731
+
732
+ theorem algebraMap_algebraMap {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] [Algebra R S]
733
+ [Algebra S T] [Algebra R T] [IsScalarTower R S T] (r : R) :
734
+ (algebraMap S T) ((algebraMap R S) r) = (algebraMap R T) r := by
735
+ exact Eq.symm (IsScalarTower.algebraMap_apply R S T r)
736
+
737
+ theorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]
738
+ [CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]
739
+ (h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := by
740
+ rw [Algebra.isAlgebraic_def]
741
+ let M := nonZeroDivisors R
742
+ intro x
743
+ have ⟨r, s, h'⟩ := IsLocalization.mk'_surjective M x
744
+ have : x = r * IsLocalization.mk' K 1 s := by
745
+ rw [← h', IsLocalization.mul_mk'_eq_mk'_of_mul]
746
+ simp
747
+ rw [this]
748
+ apply IsAlgebraic.mul (h r)
749
+ exact IsAlgebraic.invLoc (h s)
750
+
751
+ -- this uses `Algebra.isAlgebraic_of_subring_isAlgebraic` but I think we're going to have
752
+ -- to introduce `f` anyway because we need not just that the extension is algebraic but
753
+ -- that every element satisfies a poly of degree <= |G|.
754
+ theorem algebraic {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]
755
+ [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)
756
+ [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]
757
+ [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]
758
+ [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]
759
+ (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]
760
+ [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]
761
+ [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]
762
+ [IsScalarTower A B L]
763
+ (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := by
764
+ apply @Algebra.isAlgebraic_of_subring_isAlgebraic (B ⧸ Q)
765
+ intro b_bar
766
+ have ⟨b, hb⟩ := Ideal.Quotient.mk_surjective b_bar
767
+ have hb : (algebraMap B (B ⧸ Q)) b = b_bar := hb
768
+ use ((M hFull b).map (algebraMap A (A ⧸ P))).map (algebraMap (A ⧸ P) K)
769
+ constructor
770
+ . apply ne_zero_of_ne_zero_of_monic X_ne_zero
771
+ apply Monic.map
772
+ apply Monic.map
773
+ exact M_monic hFull b
774
+ . rw [← hb, algebraMap_cast, map_map, ← IsScalarTower.algebraMap_eq]
775
+ rw [algebraMap_algebraMap, aeval_def, eval₂_eq_eval_map, map_map, ← IsScalarTower.algebraMap_eq]
776
+ rw [IsScalarTower.algebraMap_eq A B L, ← map_map, M_spec_map]
777
+ rw [eval_map, eval₂_hom, F_eval_eq_zero]
778
+ exact algebraMap.coe_zero
779
+
780
+ include G in
781
+ theorem normal [DecidableEq L] : Normal K L := by
782
+ rw [normal_iff]
783
+ intro l
784
+ obtain ⟨f, hfmonic, _, hf, hfsplits⟩ := @f_exists G _ _ L _ K _ _ _ l
785
+ have hnz : f ≠ 0 := hfmonic.ne_zero
786
+ constructor
787
+ · rw [← isAlgebraic_iff_isIntegral]
788
+ exact ⟨f, hfmonic.ne_zero, hf⟩
789
+ refine Polynomial.splits_of_splits_of_dvd (algebraMap K L) hnz hfsplits ?_
790
+ exact minpoly.dvd _ _ hf
791
+
792
+ open Module
793
+
794
+ theorem separableClosure_finiteDimensional : FiniteDimensional K (separableClosure K L) := sorry
795
+
796
+ -- degree of max sep subextension is ≤ |G|
797
+
798
+ theorem separableClosure_finrank_le : finrank K (separableClosure K L) ≤ Nat.card G := by sorry
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/input_messages_compress_3.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.FieldTheory.Cardinality\nimport Mathlib.RingTheory.DedekindDomain.Ideal\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.IntegralClosure.IntegralRestrict\nimport Mathlib.RingTheory.Ideal.Pointwise\nimport Mathlib.RingTheory.Ideal.Over\nimport Mathlib.FieldTheory.Normal\nimport Mathlib.FieldTheory.SeparableClosure\nimport Mathlib.RingTheory.OreLocalization.Ring\n\n/-!\n\n# Frobenius elements.\n\nThis file proves a general result in commutative algebra which can be used to define Frobenius\nelements of Galois groups of local or fields (for example number fields).\n\nKB was alerted to this very general result (which needs no Noetherian or finiteness assumptions\non the rings, just on the Galois group) by Joel Riou\nhere https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/Uses.20of.20Frobenius.20elements.20in.20mathematics/near/448934112\n\n## Mathematical details\n\n### The general commutative algebra result\n\nThis is Theorem 2 in Chapter V, Section 2, number 2 of Bourbaki Alg Comm. It says the following.\nLet `A → B` be commutative rings and let `G` be a finite group acting on `B` by ring automorphisms,\nsuch that the `G`-invariants of `B` are exactly the image of `A`.\n\nThe two claims of the theorem are:\n(i) If `P` is a prime ideal of `A` then `G` acts transitively on the primes of `B` above `P`.\n(ii) If `Q` is a prime ideal of `B` lying over `P` then the canonica map from the stabilizer of `Q`\nin `G` to the automorphism group of the residue field extension `Frac(B/Q) / Frac(A/P)` is\nsurjective.\n\nWe say \"automorphism group\" rather than \"Galois group\" because the extension might not be\nseparable (it is algebraic and normal however, but it can be infinite; however its maximal\nseparable subextension is finite).\n\nThis result means that if the inertia group I_Q is trivial and the residue fields are finite,\nthere's a Frobenius element Frob_Q in the stabiliser of Q, and a Frobenius conjugacy class\nFrob_P in G.\n\n-/\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] --[Algebra.IsIntegral A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nopen scoped algebraMap\n\n--variable (hFull : ∀ (b : B), (∀ (g : G), g • b = b) ↔ ∃ a : A, b = a)\n--variable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a)\n\nsection misc\n\nvariable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B]\n [SMulCommClass G A B]\n\nopen scoped Pointwise\n\n/-\nIf you're happy to stick to finite G, it's just this:\n\nprivate theorem norm_fixed' (b : B) (g : G) [Finite G] : g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, σ • b := calc\n g • (∏ᶠ σ : G, σ • b) = ∏ᶠ σ : G, g • (σ • b) := smul_finprod' _\n _ = ∏ᶠ σ : G, σ • b := finprod_eq_of_bijective (g • ·) (MulAction.bijective g)\n fun x ↦ smul_smul g x b\n... [TRUNCATED] ...\n rw [← algebraMap_apply A B (B ⧸ Q)]\n rw [← algebraMap_apply (A ⧸ P) K L]\n rw [algebraMap_apply A (A ⧸ P) (B ⧸ Q)]\n rw [algebraMap_apply (A ⧸ P) (B ⧸ Q) L]\n\nopen Polynomial BigOperators\n\nopen scoped algebraMap\n\nnoncomputable local instance : Algebra A[X] B[X] :=\n RingHom.toAlgebra (Polynomial.mapRingHom (Algebra.toRingHom))\n\ntheorem IsAlgebraic.mul {R K : Type*} [CommRing R] [CommRing K] [Algebra R K] {x y : K}\n (hx : IsAlgebraic R x) (hy : IsAlgebraic R y) : IsAlgebraic R (x * y) := sorry\n\ntheorem IsAlgebraic.invLoc {R S K : Type*} [CommRing R] {M : Submonoid R} [CommRing S] [Algebra R S]\n [IsLocalization M S] {x : M} [CommRing K] [Algebra K S] (h : IsAlgebraic K ((x : R) : S)):\n IsAlgebraic K (IsLocalization.mk' S 1 x) := sorry\n\nopen MulSemiringAction.CharacteristicPolynomial\n\nnamespace Bourbaki52222\n\nvariable (hFull' : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a) in\nvariable (G) in\nnoncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=\n if x = 0 then monomial (Nat.card G) 1\n else 37 -- this is not actually right. In the nonzero case you\n -- clear denominators with a nonzero element of A, using\n -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar\n -- scaled appropriately.\n\ntheorem f_exists [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := sorry\n\ntheorem algebraMap_cast {R S: Type*} [CommRing R] [CommRing S] [Algebra R S] (r : R) :\n (r : S) = (algebraMap R S) r := sorry\n\ntheorem algebraMap_algebraMap {R S T : Type*} [CommRing R] [CommRing S] [CommRing T] [Algebra R S]\n [Algebra S T] [Algebra R T] [IsScalarTower R S T] (r : R) :\n (algebraMap S T) ((algebraMap R S) r) = (algebraMap R T) r := sorry\n\ntheorem Algebra.isAlgebraic_of_subring_isAlgebraic {R k K : Type*} [CommRing R] [CommRing k]\n [CommRing K] [Algebra R K] [IsFractionRing R K] [Algebra k K]\n (h : ∀ x : R, IsAlgebraic k (x : K)) : Algebra.IsAlgebraic k K := sorry\n\n-- this uses `Algebra.isAlgebraic_of_subring_isAlgebraic` but I think we're going to have\n-- to introduce `f` anyway because we need not just that the extension is algebraic but\n-- that every element satisfies a poly of degree <= |G|.\ntheorem algebraic {A : Type*} [CommRing A] {B : Type*} [Nontrivial B] [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) (B ⧸ Q) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): Algebra.IsAlgebraic K L := sorry\n\ninclude G in\ntheorem normal [DecidableEq L] : Normal K L := sorry\n\nopen Module\n\ntheorem separableClosure_finiteDimensional : FiniteDimensional K (separableClosure K L) := sorry\n\n-- degree of max sep subextension is ≤ |G|\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nThe maximal separable subextension $M$ of $L/K$ has degree at most $|G|$."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem separableClosure_finrank_le : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a := by sorry"}
3
+ {"prediction": "theorem separableClosure_finrank_le [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by sorry"}
4
+ {"prediction": "theorem separableClosure_finrank_le : IsCyclic (@SeparableAlgebra.mk L K).G := by sorry"}
5
+ {"prediction": "theorem separableClosure_finrank_le (A : Type*) [CommRing A] {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime] (hP : P ≠ ⊤) (hP1 : P ≠ ⊥) (Q : Ideal B) [Q.IsPrime] (hQ : Q ≠ ⊤) (hQ1 : Q ≠ ⊥) (h : ∀ b : B, (∀ g : G, g • b = b) ↔ ∃ a : A, b = a) : (Algebra.mk A B).separability()< |G| := by sorry"}
6
+ {"prediction": "theorem separableClosure_finrank_le : ∀ (P : Ideal A) [P.IsPrime] (Q : Ideal B) [Q.IsPrime] (hP : P = ↑A) (hQ : Q = ↑B) (h : image (MulSemiringAction.mk G hQ) = ↑B) : (IsSepMax K L)._okay := by sorry"}
7
+ {"prediction": "theorem separableClosure_finrank_le {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): FiniteDimensional K (separableClosure K L) ∧ @separableClosure.finrank K L = G_finrank := by sorry"}
8
+ {"prediction": "theorem separableClosure_finrank_le : (∀ (M : Module K L), M ∈ returnExtensions G hG → ∃ (x : L), IsPrimitiveRoot x M) ∧ (∀ (C : Module G (Module K L)), C ∈ returnFrobeniusConjugacyClasses G hG → ∃ (x : L), IsPrimitiveRoot x C) ∧ (∀ (F : Module G (Module K L)), F ∈ returnFrobeniusElements G hG → ∃ (x : L), IsPrimitiveRoot x F) := by sorry"}
9
+ {"prediction": "theorem separableClosure_finrank_le : frobenius_ELEMENT_CONjugacy = frobenius_CONjugacy ∘ frobenius_ELEMENT := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-9c7bf2b80ac04b0a85876e36863d16de",
3
+ "created": 1749028667,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] (b : B) : G ",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "noncomputable def maxSepSubextension (G : Type*) [Group G] [Finite G] (k : Type*) [Field k] (L : Type*) [Field L] [Algebra k L] : (L ⧸ k) →* L ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "noncomputable def frobenius_element (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime]\n : G ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "noncomputable def maxSepExt : K → L → Prop := ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "noncomputable def Frobenius conj (g : G) (p : Ideal B) : Ideal B := ((Ideal.Quotient.mk (g • p)) : Ideal B ⧸ span ({g • p} : Set (Ideal B))). localization.mk _ _\nnoncomputable def frosh (g : G) : Ideal B := frosh G.mk\n\ntheorem my_favorite_theorem : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "noncomputable def GaloisGroup (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B] (P : Ideal A) [P.IsPrime] : Type* := MulSemiringAction (ZMod P) B\n\nnoncomputable def frobenius (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B] (P : Ideal A) [P.IsPrime] : GaloisGroup A B ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "variable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nnoncomputable def residueFieldExtensionPolynomial [DecidableEq L] (x : L) : K[X] :=\n if x = 0 then monomial (Nat.card G) 1\n else 37 -- this is not actually right. In the nonzero case you\n -- clear denominators with a nonzero element of A, using\n -- `Algebra.exists_dvd_nonzero_if_isIntegral` above, and then use Mbar\n -- scaled appropriately.\n\ntheorem f_exists [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "noncomputable def frobenius_element (G : Type*) (A : Type*) [CommRing A] [Field A] [MulSemiringAction G A] : G → A ",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B]\n [Algebra G B] : G ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] {B : Type*} [CommRing B] (h : Fintype.card G = frobeniusDegree G B) : G ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "noncomputable def maximal_separable_subextension : K →+* L → Prop ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "def FrobeniusElement {G : Type*} [Group G] {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B] [GaloisGroup G A B]\n : G → B ≃* B ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] (B : Type*) [CommRing B]\n (h : MulSemiringAction G B) : G ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B] (P : Ideal A) [P.IsPrime] (Q : Ideal B) [Q.IsPrime] : G ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B]\n [Algebra G B] : G ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "def countablyGenerated (R : Type*) [CommRing R] (M : Submodule R MvPolynomial)\n : Prop := ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "noncomputable defores (G : Type*) [Group G] [Finite G] {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] [Algebra.IsIntegral A B]\n {P : Ideal A} [P.IsPrime] (hP : P ≠ ⊥) (hP1 : P ≠ ⊤)\n (Q : Ideal B) [Q.IsPrime] (hQ : Q ≠ ⊥) (hQ1 : Q ≠ ⊤)\n : ∃ M : Ideal (B ⧸ Q), M.IsSeparable K L ∧ M.IsMaximal K L ∧\n M Dimen L = (Nat.card G) ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "def galoisGroup (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] : Type* :=\n",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "noncomputable def subextensionOf (R : Type*) [CommRing R] [IsScalarTower R K L] : Prop := ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "noncomputable def frobenius_element (G : Type*) [Group G] [Finite G] {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B] : G ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "def Frobenius_element (G : Type*) [Group G] [Finite G] (g : G) : G ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "noncomputable def maxSepExt (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime] (Q : Ideal B) [Q.IsPrime] : Ideal B :=\n",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "noncomputable def GaloisGroup {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] : Type* :=\n",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "noncomputable def extensionPolynomial {R : Type*} [CommRing R] {L : Type*} [Field L]\n {P : Polynomial L} (hP : P.Monic) (hP1 : P.natDegree = Nat.card G) :\n ∃ F : G →* (L ⧸ span ({P.eval x} : Set L)), ∀ x : L, F x • x = x ",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "noncomputable deflocalinstance : IsSeparable L K := @SeparableAlgebra.mk L K\n\nnoncomputable deflocalinstance : IsMaxSeparable L K := @SeparableAlgebra.mk L K\n\ntheorem algebraMap.mk.exists.mk.lcm : IsCyclic (@SeparableAlgebra.mk L K).G ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "variable {A : Type*} [CommRing A]\n {B : Type*} [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [Finite G] [MulSemiringAction G B]\n\nopen Fintype Subgroup Set Polynomial Ideal\nopen scoped BigOperators\n\ndef frobenius (G : Type*) [Group G] [Fintype G] : G ≃* G ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "noncomputable def frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime]\n : G → B ⧸ P ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "def frobeniusElementType {R G : Type*} [CommRing R] [Group G] [Fintype G]\n [MulSemiringAction G R] : G → R ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "noncomputable def maximalSeparableSubextension (K L : Type*) [Field K] [Field L] : Subextension K L :=\n",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "noncomputable def residualField (K : Type*) [Field K] : Type* := {x : K | ∃ a : A, x = a}\n\nnoncomputable def extension (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] (Q : Ideal B) [Q.IsPrime] (P : Ideal A)\n [P.IsPrime] (hP : Submodule.IsAlgebraic P_A_B P) (hQ : Submodule.IsAlgebraic Q_A_B Q)\n : Type* := {x : B | ∃ a : A, x = a}\n\nnoncomputable def conjugacyGroup (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] (Q : Ideal B) [Q.IsPrime] (hQ : Submodule.IsAlgebraic Q_A_B Q) :\n Type* := {g : G | ∃ x : B, g • x = x}\n\nnoncomputable def frobeniusConjugacyGroup (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] (Q : Ideal B) [Q.IsPrime] (hQ : Submodule.IsAlgebraic Q_A_B Q) :\n Type* := {g : G | ∃ x : B, g • x = x ∧ g • (x ^ (Q_A_B).ncard) = x}\n\nnoncomputable def frobeniusElement (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [MulSemiringAction G B] (Q : Ideal B) [Q.IsPrime] (hQ : Submodule.IsAlgebraic Q_A_B Q) :\n G ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def GaloisGroup : Type* := Subgroup.Perm (Fin (Nat.card G))\n\ndef frobenius : GaloisGroup → Subgroup.Perm B ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "noncomputable def GaloisGroup (G : Type*) [Group G] (A : Type*) [CommRing A] (B : Type*) [CommRing B]\n [Algebra A B] : Type* := MulSemiringAction G B\n\nnoncomputable def frobeniusElement (G : Type*) [Group G] [Fintype G] (A : Type*) [CommRing A] (B : Type*) [CommRing B]\n [Algebra A B] : GaloisGroup G A B ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "noncomputable def fracs : Type := {x : ℚ | ∃ a : ℤ, x = a / 37}\n\nnoncomputable def Fr frob : fracs → fracs ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def frobenius_element {A : Type*} [CommRing A] {B : Type*} [CommRing B]\n [Algebra A B] {G : Type*} [Group G] [MulSemiringAction G B] : G →* G :=\n",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "theorem my_favorite_theorem (A : Type*) [CommRing A] {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime] (hP : P ≠ ⊤) (hP1 : P ≠ ⊥) (Q : Ideal B) [Q.IsPrime] (hQ : Q ≠ ⊤) (hQ1 : Q ≠ ⊥) (h : ∀ b : B, (∀ g : G, g • b = b) ↔ ∃ a : A, b = a) : (Algebra.mk A B).separability()< |G| ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "noncomputable def image (f : G → B) : Set B := {b : B | ∃ g : G, f g • b = b}\n\ntheorem my_favorite_theorem : ∀ (P : Ideal A) [P.IsPrime] (Q : Ideal B) [Q.IsPrime] (hP : P = ↑A) (hQ : Q = ↑B) (h : image (MulSemiringAction.mk G hQ) = ↑B) : (IsSepMax K L)._okay ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "noncomputable def GaloisGroup (A : Type*) [CommRing A] (B : Type*) [CommRing B]\n [Algebra A B] [Algebra.IsIntegral A B] (G : Type*) [Group G] [Finite G]\n [MulSemiringAction G B] : Type* := MulSemiringAction G B\n\nnoncomputable def frobenius_element (A : Type*) [CommRing A] (B : Type*) [CommRing B]\n [Algebra A B] [Algebra.IsIntegral A B] (G : Type*) [Group G] [Finite G]\n [MulSemiringAction G B] (P : Ideal A) [P.IsPrime] (hP : P ≠ ⊤) (hP1 : P ≠ ⊥)\n : GaloisGroup A B ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "noncomputable def maxSepSubextension (K L : Type*) [Field K] [Field L] [Algebra K L] : Module K L ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "noncomputable def answer ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable defGeneralization def frobenius_element (G : Type*) [Group G] [Finite G] (B : Type*) [CommRing B] [Algebra G B] (p : Ideal B) [p.IsPrime] (x : B) : G ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "noncomputable def isFrobenius (A : Type*) [CommRing A] (B : Type*) [CommRing B] [Algebra A B]\n (G : Type*) [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime]\n (Q : Ideal B) [Q.IsPrime] (h : Q = P.restrict B) : G →* (B ⧸ Q)ˣ ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "noncomputable def OreLocalisation {A B : Type*} [CommRing A] [CommRing B] [Algebra A B]\n {G : Type*} [Group G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime] (hP : P ≠ ⊤) :\n ∃ F : G →* B, ∀ x : B, (∀ g : G, g • x = x) ↔\n ∃ a : A, x = a ",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "theorem my_favorite_theorem {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): FiniteDimensional K (separableClosure K L) ∧ @separableClosure.finrank K L = G_finrank ",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "noncomputable def returnExtensions (G : Type*) [Group G] (hG : Finite G) : Set (Module K L) := {M : Module K L | ∃ f : Module L M, f.Monic ∧ f.Splits id ∧ f.MapsTo id}\n\nnoncomputable def returnFrobeniusConjugacyClasses (G : Type*) [Group G] (hG : Finite G) : Set (Module G (Module K L)) := {ConjugacyClass.mk G L _ _ | (M : Module K L) (_ : M ∈ returnExtensions G hG)}\n\nnoncomputable def returnFrobeniusElements (G : Type*) [Group G] (hG : Finite G) : Set (Module G (Module K L)) := {Frobenius.mk G L _ _ | (M : Module K L) (_ : M ∈ returnExtensions G hG)}\n\ntheorem my_favorite_theorem : (∀ (M : Module K L), M ∈ returnExtensions G hG → ∃ (x : L), IsPrimitiveRoot x M) ∧ (∀ (C : Module G (Module K L)), C ∈ returnFrobeniusConjugacyClasses G hG → ∃ (x : L), IsPrimitiveRoot x C) ∧ (∀ (F : Module G (Module K L)), F ∈ returnFrobeniusElements G hG → ∃ (x : L), IsPrimitiveRoot x F) ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "noncomputable def GaloisGroup {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] : Type* ",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "noncomputable def GaloisGroup : Type* ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "def frobenius_element (G : Type*) [Group G] [Finite G] (B : Type*) [CommRing B] [Algebra A B]\n (P : Ideal A) [P.IsPrime] (hP : P ≠ ⊤) : G :=\n",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "noncomputable def G : Type* := GaloisGroup.mk _ _ _\nnoncomputable def A : Type* := GaloisGroup.mk _ _ _.carrier\nnoncomputable def B : Type* := GaloisGroup.mk _ _.carrier\nnoncomputable def GAlgebra : Type* := Algebra.mk G B\nnoncomputable def frobenius : GAlgebra → GAlgebra := GaloisGroup.frobenius.mk G _\nnoncomputable def frobenius_ELEMENT : GAlgebra := GaloisGroup.frobenius_ELEMENT G _.carrier\nnoncomputable def frobenius_CONjugacy : GAlgebra ≃* GAlgebra := GaloisGroup.frobenius_CONjugacy G _.carrier\n\nnoncomputable def frobenius_ELEMENT_CONjugacy : GAlgebra ≃* GAlgebra := GaloisGroup.frobenius_ELEMENT_CONjugacy G _.carrier\n\ntheorem my_favorite_theorem : frobenius_ELEMENT_CONjugacy = frobenius_CONjugacy ∘ frobenius_ELEMENT ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "noncomputable def GaloisGroup : Type* := Subgroup.Closure {g : G | ∃ a : A, g • a = a}\n\ndef frobenius_element : GaloisGroup → B ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "def frobenius_element (G : Type*) [Group G] [Fintype G] (B : Type*) [CommRing B] [Algebra G B]\n: B →ₗ[G]ₗ[G] B :=\n",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 4476,
511
+ "prompt_tokens": 2213,
512
+ "total_tokens": 6689,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/Bourbaki52222.separableClosure_finrank_le/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": "theorem separableClosure_finrank_le : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": "theorem separableClosure_finrank_le [DecidableEq L] (l : L) :\n ∃ f : K[X], f.Monic ∧ f.degree = Nat.card G ∧\n eval₂ (algebraMap K L) l f = 0 ∧ f.Splits (algebraMap K L) := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": "theorem separableClosure_finrank_le : IsCyclic (@SeparableAlgebra.mk L K).G := by sorry", "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": "theorem separableClosure_finrank_le (A : Type*) [CommRing A] {B : Type*} [CommRing B] [Algebra A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (P : Ideal A) [P.IsPrime] (hP : P ≠ ⊤) (hP1 : P ≠ ⊥) (Q : Ideal B) [Q.IsPrime] (hQ : Q ≠ ⊤) (hQ1 : Q ≠ ⊥) (h : ∀ b : B, (∀ g : G, g • b = b) ↔ ∃ a : A, b = a) : (Algebra.mk A B).separability()< |G| := by sorry", "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": "theorem separableClosure_finrank_le : ∀ (P : Ideal A) [P.IsPrime] (Q : Ideal B) [Q.IsPrime] (hP : P = ↑A) (hQ : Q = ↑B) (h : image (MulSemiringAction.mk G hQ) = ↑B) : (IsSepMax K L)._okay := by sorry", "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": "theorem separableClosure_finrank_le {A : Type*} [CommRing A] {B : Type*} [CommRing B] [Algebra A B]\n [Algebra.IsIntegral A B] {G : Type*} [Group G] [Finite G] [MulSemiringAction G B] (Q : Ideal B)\n [Q.IsPrime] (P : Ideal A) [P.IsPrime] [Algebra (A ⧸ P) (B ⧸ Q)]\n [IsScalarTower A (A ⧸ P) (B ⧸ Q)] (L : Type*) [Field L] [Algebra (B ⧸ Q) L]\n [IsFractionRing (B ⧸ Q) L] [Algebra (A ⧸ P) L] [IsScalarTower (A ⧸ P) L]\n (K : Type*) [Field K] [Algebra (A ⧸ P) K] [IsFractionRing (A ⧸ P) K]\n [Algebra K L] [IsScalarTower (A ⧸ P) K L] [Algebra A K] [IsScalarTower A (A ⧸ P) K]\n [Algebra B L] [IsScalarTower B (B ⧸ Q) L] [Algebra A L] [IsScalarTower A K L]\n [IsScalarTower A B L]\n (hFull : ∀ (b : B), (∀ (g : G), g • b = b) → ∃ a : A, b = a): FiniteDimensional K (separableClosure K L) ∧ @separableClosure.finrank K L = G_finrank := by sorry", "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": "theorem separableClosure_finrank_le : (∀ (M : Module K L), M ∈ returnExtensions G hG → ∃ (x : L), IsPrimitiveRoot x M) ∧ (∀ (C : Module G (Module K L)), C ∈ returnFrobeniusConjugacyClasses G hG → ∃ (x : L), IsPrimitiveRoot x C) ∧ (∀ (F : Module G (Module K L)), F ∈ returnFrobeniusElements G hG → ∃ (x : L), IsPrimitiveRoot x F) := by sorry", "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": "theorem separableClosure_finrank_le : frobenius_ELEMENT_CONjugacy = frobenius_CONjugacy ∘ frobenius_ELEMENT := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/ground_truth.lean ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Kevin Buzzard. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Kevin Buzzard, Ludwig Monnerjahn, Hannah Scholz
5
+ -/
6
+ import Mathlib.Geometry.Manifold.Instances.UnitsOfNormedAlgebra
7
+ import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup.Basic
8
+ import Mathlib.NumberTheory.NumberField.Basic
9
+ import Mathlib.RingTheory.DedekindDomain.FiniteAdeleRing
10
+ import Mathlib.Algebra.Group.Subgroup.Pointwise
11
+ import FLT.ForMathlib.ActionTopology
12
+ import FLT.NumberField.IsTotallyReal
13
+ import FLT.NumberField.AdeleRing
14
+ import Mathlib.GroupTheory.DoubleCoset
15
+
16
+ /-
17
+
18
+ # Fujisaki's lemma
19
+
20
+ We prove a lemma which Voight (in his quaternion algebra book) attributes to Fujisaki:
21
+ if `D` is a finite-dimensional division algebra over a number field `K`
22
+ and if `U ⊆ (D ⊗[K] 𝔸_K^infty)ˣ` is a compact open subgroup then the double coset
23
+ space `Dˣ \ (D ⊗ 𝔸_F^infty)ˣ / U` is finite.
24
+
25
+ -/
26
+
27
+ suppress_compilation
28
+
29
+ open DedekindDomain
30
+
31
+ open scoped NumberField TensorProduct
32
+
33
+ variable (K : Type*) [Field K] [NumberField K]
34
+ variable (D : Type*) [DivisionRing D] [Algebra K D]
35
+
36
+ local instance : TopologicalSpace (FiniteAdeleRing (𝓞 K) K ⊗[K] D) :=
37
+ actionTopology (FiniteAdeleRing (𝓞 K) K) _
38
+ local instance : IsActionTopology (FiniteAdeleRing (𝓞 K) K) ((FiniteAdeleRing (𝓞 K) K) ⊗[K] D) :=
39
+ ⟨rfl⟩
40
+
41
+ variable [FiniteDimensional K D]
42
+
43
+ instance : TopologicalRing ((FiniteAdeleRing (𝓞 K) K) ⊗[K] D) :=
44
+ ActionTopology.Module.topologicalRing (FiniteAdeleRing (𝓞 K) K) _
45
+
46
+ variable [Algebra.IsCentral K D]
47
+
48
+ abbrev Dfx := ((FiniteAdeleRing (𝓞 K) K) ⊗[K] D)ˣ
49
+
50
+ noncomputable abbrev incl₁ : Dˣ →* Dfx K D :=
51
+ Units.map Algebra.TensorProduct.includeRight.toMonoidHom
52
+
53
+ -- noncomputable abbrev incl₂ : (FiniteAdeleRing (𝓞 K) K)ˣ →* Dfx K D :=
54
+ -- Units.map Algebra.TensorProduct.includeLeftRingHom.toMonoidHom
55
+
56
+ -- Voight "Main theorem 27.6.14(b) (Fujisaki's lemma)"
57
+ /-!
58
+ If `D` is a finite-dimensional division algebra over a number field `K`
59
+ then the double coset space `Dˣ \ (D ⊗ 𝔸_K^infty)ˣ / U` is finite for any compact open subgroup `U`
60
+ of `(D ⊗ 𝔸_F^infty)ˣ`.
61
+ -/
62
+
63
+ theorem DivisionAlgebra.finiteDoubleCoset {U : Subgroup (Dfx K D)} (hU : IsOpen (U : Set (Dfx K D))) :
64
+ Finite (Doset.Quotient (Set.range (incl₁ K D)) U) := by sorry
results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/input_messages_compress_0.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.Geometry.Manifold.Instances.UnitsOfNormedAlgebra\nimport Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup.Basic\nimport Mathlib.NumberTheory.NumberField.Basic\nimport Mathlib.RingTheory.DedekindDomain.FiniteAdeleRing\nimport Mathlib.Algebra.Group.Subgroup.Pointwise\nimport FLT.ForMathlib.ActionTopology\nimport FLT.NumberField.IsTotallyReal\nimport FLT.NumberField.AdeleRing\nimport Mathlib.GroupTheory.DoubleCoset\n\n/-\n\n# Fujisaki's lemma\n\nWe prove a lemma which Voight (in his quaternion algebra book) attributes to Fujisaki:\nif `D` is a finite-dimensional division algebra over a number field `K`\nand if `U ⊆ (D ⊗[K] 𝔸_K^infty)ˣ` is a compact open subgroup then the double coset\nspace `Dˣ \\ (D ⊗ 𝔸_F^infty)ˣ / U` is finite.\n\n-/\n\nsuppress_compilation\n\nopen DedekindDomain\n\nopen scoped NumberField TensorProduct\n\nvariable (K : Type*) [Field K] [NumberField K]\nvariable (D : Type*) [DivisionRing D] [Algebra K D]\n\nlocal instance : TopologicalSpace (FiniteAdeleRing (𝓞 K) K ⊗[K] D) :=\n actionTopology (FiniteAdeleRing (𝓞 K) K) _\nlocal instance : IsActionTopology (FiniteAdeleRing (𝓞 K) K) ((FiniteAdeleRing (𝓞 K) K) ⊗[K] D) :=\n ⟨rfl⟩\n\nvariable [FiniteDimensional K D]\n\ninstance : TopologicalRing ((FiniteAdeleRing (𝓞 K) K) ⊗[K] D) :=\n ActionTopology.Module.topologicalRing (FiniteAdeleRing (𝓞 K) K) _\n\nvariable [Algebra.IsCentral K D]\n\nabbrev Dfx := ((FiniteAdeleRing (𝓞 K) K) ⊗[K] D)ˣ\n\nnoncomputable abbrev incl₁ : Dˣ →* Dfx K D :=\n Units.map Algebra.TensorProduct.includeRight.toMonoidHom\n\n-- noncomputable abbrev incl₂ : (FiniteAdeleRing (𝓞 K) K)ˣ →* Dfx K D :=\n-- Units.map Algebra.TensorProduct.includeLeftRingHom.toMonoidHom\n\n-- Voight \"Main theorem 27.6.14(b) (Fujisaki's lemma)\"\n/-!\nIf `D` is a finite-dimensional division algebra over a number field `K`\nthen the double coset space `Dˣ \\ (D ⊗ 𝔸_K^infty)ˣ / U` is finite for any compact open subgroup `U`\nof `(D ⊗ 𝔸_F^infty)ˣ`.\n-/\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nIf $U\\subseteq (B\\otimes _K\\mathbb {A}_K^\\infty )^\\times $ is a compact open subgroup, then the double coset space $B^\\times \\backslash (B\\otimes _K\\mathbb {A}_K^\\infty )^\\times /U$ is a finite set."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup B} (hU : IsOpen U ∧ U.IsCompact) : Finite (Bˣ \\ (B ⊗[K] (Bˣ)) / U) := by sorry"}
3
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n [FiniteDimensional K B] (U : Subgroup (B ⊗ₗ[K] (𝓞 K))) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((Bˣ) \\ (B ⊗ₗ[K] (𝓞 K))ˣ / U) := by sorry"}
4
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n (U : Subgroup (B⊗ₗ[K] Aₗ[K])) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((B⊗ₗ[K] Aₗ[K])ˣ \\ (B⊗ₗ[K] Aₗ[K])ˣ / U) := by sorry"}
5
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n (U : Subgroup ((B ⧸ span ({⟨0, 1⟩} : Set B))ˣ)) (hU : IsOpen U) :\n Finite ((B ⧸ span ({⟨0, 1⟩} : Set B))ˣ \\ (B ⧸ span ({⟨0, 1⟩} : Set B))ˣ / U) := by sorry"}
6
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n [FiniteDimensional K B] (U : Subgroup ((B ⊗[K] (borah K))ˣ)) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite (Bˣ \\ (B ⊗[K] (borah K))ˣ / U) := by sorry"}
7
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B⊗ K $ AdeleRing K)} (hU : IsOpen U ∧ U.IsCompact) : Finite ((B⊗ K $ AdeleRing K)ˣ \\ (B⊗ K $ AdeleRing K)ˣ / U) := by sorry"}
8
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset (B : Type*) [DivisionRing B] [Algebra K B]\n (U : Subgroup (B⊗ₗ[K] (B ⧸ span ({⟨0⟩} : Set B))ˣ))\n (hU : IsCompact U ∧ IsOpen U) :\n Finite (doubleCoset B U) := by sorry"}
9
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup B}\n(hU : IsCompact U ∧ IsOpen U) : Finite (doubleCosetSpace U) := by sorry"}
10
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n {U : Subgroup (B ×ₗ[K] B)} (hU : IsOpen U) (hU1 : IsCompact U) :\n Finite ((B ×ₗ[K] B) ⧸ U) := by sorry"}
11
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [NormedAddCommGroup B] [InnerProductSpace K B] [FiniteDimensional K B]\n (U : Subgroup ((B ◓ (环氧 K))ˣ)) (hU : IsOpen U) (hU1 : IsCompact U) :\n Finite ((B ◓ (环氧 K))ˣ ⧸ ((B ◓ (环氧 K))ˣ) / U) := by sorry"}
12
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset (K : Type*) [Field K] [NumberField K]\n (B : Type*) [DivisionRing B] [Algebra K B] :\n ∀ U : Subgroup ((B ⊗[K] (Algebra.of K B))ˣ), IsCompact U → IsOpen U → Finite (Bˣ \\ (B ⊗[K] (Algebra.of K B))ˣ / U) := by sorry"}
13
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B ⊗ₗ[K] B)}\n(hU : IsOpen U ∧ IsCompact U) : Finite (B × \\ (B ⊗ₗ[K] B) × / U) := by sorry"}
14
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n {U : Subgroup ((B ◸ span ({⟨0⟩} : Set B)) × B)}\n (hU : IsCompact U) (hU1 : IsOpen U) :\n Finite ((B ◸ span ({⟨0⟩} : Set B)) × B)ˣ / U := by sorry"}
15
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n (hB : FiniteDimensional K B)\n (U : Subgroup ((B × K)ˣ))\n (hU : IsCompact U)\n (hU1 : IsOpen U) :\n Finite ((B × K)ˣ \\ (B × K)ˣ / U) := by sorry"}
16
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B × 𝔸 K)}\n (hU : IsCompact U) (hU1 : IsOpen U) :\n Finite ((B × 𝔸 K) / U) := by sorry"}
17
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] (hB : FiniteDimensional K B) (U : Subgroup B) (hU : IsOpen U) (hU1 : IsCompact U) : Finite (Bˣ \\ (B ⊗ 𝔸 K)ˣ / U) := by sorry"}
18
+ {"prediction": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B ⊗[K] Algebra.AffineSpace K)}\n (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((B ⊗[K] Algebra.AffineSpace K)ˣ \\ (B ⊗[K] Algebra.AffineSpace K)ˣ / U) := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-826f3d565a23479e9dcda86f145f87fa",
3
+ "created": 1749028660,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "noncomputable def doubleCosetSpace {K : Type*} [Field K] [NumberField K] {B : Type*} [DivisionRing B] [Algebra K B]\n (U : Subgroup (B ⊗ₗ[K] (AdèleRing K))) : Set (B ×ₗ[K] (AdèleRing K)) :=\n",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B × 𝔸 K)) : Set (B × 𝔸 K) ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : AddSubgroup (B ⊗[K] Algebra.Archimedean B)) : Type* ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "noncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B ⊗[K] (AdeleRing K))) : Set (B ⊗[K] (AdeleRing K)) ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B ⊗[K] A)) : Set (B ⊗[K] A) ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "open scoped BigOperators\n\ntheorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup B} (hU : IsOpen U ∧ U.IsCompact) : Finite (Bˣ \\ (B ⊗[K] (Bˣ)) / U) ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "variable {B : Type*} [DivisionRing B] [Algebra K B]\n\nnoncomputable def double_coset (U : Subgroup (B ⊗ₗ[K] A)) : Set (B ⊗ₗ[K] A) ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B]\n [FiniteDimensional K B] (U : Subgroup (B ⊗ₗ[K] (𝓞 K))) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((Bˣ) \\ (B ⊗ₗ[K] (𝓞 K))ˣ / U) :=\n",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B ⊗[K] (Algebra K B))) : Set (B × B ⊗[K] (Algebra K B) / U) ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "variable {B : Type*} [DivisionRing B] [Algebra K B]\n\nnoncomputable def double_coset (U : Subgroup (B⊗ₗ[K] Aₗ[K] B)) : Set (B⊗ₗ[K] Aₗ[K] B) ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "open scoped BigOperators\n\ntheorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B]\n (U : Subgroup (B⊗ₗ[K] Aₗ[K])) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((B⊗ₗ[K] Aₗ[K])ˣ \\ (B⊗ₗ[K] Aₗ[K])ˣ / U) ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "open Fintype Set Real Ideal Polynomial\nopen scoped BigOperators\n\ntheorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B]\n (U : Subgroup ((B ⧸ span ({⟨0, 1⟩} : Set B))ˣ)) (hU : IsOpen U) :\n Finite ((B ⧸ span ({⟨0, 1⟩} : Set B))ˣ \\ (B ⧸ span ({⟨0, 1⟩} : Set B))ˣ / U) :=\n",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "variable {B : Type*} [DivisionRing B] [Algebra K B]\n\nnoncomputable def doubleCosetSpace (UB : Subgroup ((B ⊗ 𝔸 K)ˣ)) : Type* ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B]\n [FiniteDimensional K B] (U : Subgroup ((B ⊗[K] (borah K))ˣ)) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite (Bˣ \\ (B ⊗[K] (borah K))ˣ / U) :=\n",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "noncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B] (U : AddSubgroup (B ⊗ₗ[K] A)) : Type* ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B⊗ K $ AdeleRing K)} (hU : IsOpen U ∧ U.IsCompact) : Finite ((B⊗ K $ AdeleRing K)ˣ \\ (B⊗ K $ AdeleRing K)ˣ / U) ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "open scoped BigOperators\n\ndef doubleCosetSpace {K : Type*} [Field K] [NumberField K]\n {B : Type*} [DivisionRing B] [Algebra K B] (hB : FiniteDimensional K B)\n {U : Subgroup ((B ⊗[K] (AdeleRing K))ˣ)} (hU : IsCompact U) (hU1 : IsOpen U) :\n Finite (Bˣ \\ (B ⊗[K] (AdeleRing K))ˣ / U) :=\n",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "def double_coset (B : Type*) [DivisionRing B] [Algebra K B] (U : AddSubgroup (B ⊗[K] A))\n : Set Bˣ ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B ⊗[K] A)) : Type ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B ⊗[K] (Dfx K B))) : Set (B × (B ⊗[K] (Dfx K B))) ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "noncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup ((B ⊗[K] A)ˣ)) : Set (Bˣ) ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "open scoped BigOperators\n\nnoncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B]\n (U : Subgroup ((B ⊗[K] A)ˣ)) : Set (Bˣ) ",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B⊗ₗ[K] (B ⧸ span ({⟨0⟩} : Set B))ˣ)) : Set (B⊗ₗ[K] (B ⧸ span ({⟨0⟩} : Set B))ˣ) :=\n (B⊗ₗ[K] (B ⧸ span ({⟨0⟩} : Set B))ˣ)⁻¹ ⊓ U\n\ntheorem my_favorite_theorem\n (B : Type*) [DivisionRing B] [Algebra K B]\n (U : Subgroup (B⊗ₗ[K] (B ⧸ span ({⟨0⟩} : Set B))ˣ))\n (hU : IsCompact U ∧ IsOpen U) :\n Finite (doubleCoset B U) :=\n",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "noncomputable def doubleCosetSpace {B : Type*} [DivisionRing B] [Algebra K B] (U : Subgroup (Bˣ)) : Type :=\n (Bˣ) ⧸ U\n\nnoncomputable def AdeleRing : Type := FiniteAdeleRing (𝓞 K) K\n\nnoncomputable def quaternionAlgebra : Type := TensorProduct AdeleRing ( QuaternionAlgebra.build QuaternionAlgebra.componentwise QuaternionAlgebra.literature QuaternionAlgebra.sym )\n\nnoncomputable def U : Subgroup (quaternionAlgebraˣ) := Subgroup.closure { incl₁ , incl₂ }\n\nnoncomputable def doubleCosetSpace QuaternionAlgebra : Type := doubleCosetSpace QuaternionAlgebra U\n\nnoncomputable def Voight_ Main_ Theorem_27_6_14_b_Fujisaki_87 : Prop ",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup ((B ⊗[K] A)ˣ)) : Set ((B ⊗[K] A)ˣ) ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup ((B ⊗[K] A)ˣ)) : Set Bˣ ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup B}\n(hU : IsCompact U ∧ IsOpen U) : Finite (doubleCosetSpace U) ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [NormedAddCommGroup B] [InnerProductSpace K B] [FiniteDimensional K B] (U : Subgroup (InnerProductSpace K B)) : Set (InnerProductSpace K B) ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B]\n {U : Subgroup (B ×ₗ[K] B)} (hU : IsOpen U) (hU1 : IsCompact U) :\n Finite ((B ×ₗ[K] B) ⧸ U) :=\n",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B⊗ₗ[K] (A : Type*) [DivisionRing A])) : Set (B⊗ₗ[K] (A : Type*) [DivisionRing A]) ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B] [FiniteDimensional K B]\n (U : Subgroup (B ⊗[K] Algebra.of K B)) : Set*Bˣ ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "noncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B⊗K(AdeleRing K B))) : Set (B⊗K(AdeleRing K B)) ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup ((B ⊗[K] A)ˣ)) : Type ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B] [FiniteDimensional K B]\n (U : Subgroup ((B ⊗ K ⌊B⌋)ˣ)) : Set ((B ⊗ K ⌊B⌋)ˣ) :=\n",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B ⊗[K] A K)) : Set (B × B ⊗[K] A K) ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "noncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B] [FiniteDimensional K B]\n (U : Subgroup ((B ×代 K)ˣ)) : Set (B ×代 K) :=\n",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "open scoped BigOperators\n\ntheorem my_favorite_theorem\n {B : Type*} [NormedAddCommGroup B] [InnerProductSpace K B] [FiniteDimensional K B]\n (U : Subgroup ((B ◓ (环氧 K))ˣ)) (hU : IsOpen U) (hU1 : IsCompact U) :\n Finite ((B ◓ (环氧 K))ˣ ⧸ ((B ◓ (环氧 K))ˣ) / U) ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "open scoped BigOperators\n\ntheorem NumberField.Basic.totalDegree\n (K : Type*) [Field K] [NumberField K]\n (B : Type*) [DivisionRing B] [Algebra K B] :\n ∀ U : Subgroup ((B ⊗[K] (Algebra.of K B))ˣ), IsCompact U → IsOpen U → Finite (Bˣ \\ (B ⊗[K] (Algebra.of K B))ˣ / U) :=\n",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "noncomputable def double_coset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup ((B ⊗[K] A)ˣ)) : Set ((B ⊗[K] A)ˣ) ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B⊗ₗ[K] (AdeleRing K))) : Set (B⊗ₗ[K] (AdeleRing K)) ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "open scoped BigOperators\n\ntheorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B ⊗ₗ[K] B)}\n(hU : IsOpen U ∧ IsCompact U) : Finite (B × \\ (B ⊗ₗ[K] B) × / U) ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B]\n {U : Subgroup ((B ◸ span ({⟨0⟩} : Set B)) × B)}\n (hU : IsCompact U) (hU1 : IsOpen U) :\n Finite ((B ◸ span ({⟨0⟩} : Set B)) × B)ˣ / U :=\n",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "open scoped BigOperators\n\ntheorem my_favorite_theorem\n {B : Type*} [DivisionRing B] [Algebra K B]\n (hB : FiniteDimensional K B)\n (U : Subgroup ((B × K)ˣ))\n (hU : IsCompact U)\n (hU1 : IsOpen U) :\n Finite ((B × K)ˣ \\ (B × K)ˣ / U) :=\n",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B × �� K)}\n (hU : IsCompact U) (hU1 : IsOpen U) :\n Finite ((B × 𝔸 K) / U) ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B] (U : Subgroup (B ⊗[K] 𝔸 K)) : Set Bˣ :=\n let R := (B ⊗[K] 𝔸 K)ˣ\n let S := Bˣ \\ R / U\n let T := Subgroup.closure {x : R | ∃ y : S, x = incl₁ y}\n let U' := Subgroup.closure {x : R | ∃ y : S, x = incl₂ y}\n let V := T \\ U'\n let W := Subgroup.closure {x : T | ∃ y : V, x = y}\n let Z := Subgroup.closure {x : T | ∃ y : W, x = y}\n let doubleCoset := T \\ Z\n doubleCoset\n\nnoncomputable def Fujisaki_Levi_94_28_2623_27_6_14_b (B : Type*) [DivisionRing B] [Algebra K B] (hB : FiniteDimensional K B) (U : Subgroup (B ⊗[K] 𝔸 K)) : Finite (doubleCoset B hB U) :=\n",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "noncomputable def doubleCosetSpace (B : Type*) [DivisionRing B] [Algebra K B] (U : AddSubgroup (B ⊗[K] (Algebra.powerset B))) : Type* ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "noncomputable def doubleCosetSpace {K : Type*} [Field K] [NumberField K] {B : Type*} [DivisionRing B] [Algebra K B] (U : Subgroup ((B ×K B)ˣ)) : Set ((B ×K B)ˣ) ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "noncomputable def doubleCoset (B : Type*) [DivisionRing B] [Algebra K B]\n (U : Subgroup ((B ⊗[K] (A K))ˣ)) : Set (Bˣ) :=\n",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B] (hB : FiniteDimensional K B) (U : Subgroup B) (hU : IsOpen U) (hU1 : IsCompact U) : Finite (Bˣ \\ (B ⊗ 𝔸 K)ˣ / U) :=\n",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "theorem my_favorite_theorem {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B ⊗[K] Algebra.AffineSpace K)}\n (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((B ⊗[K] Algebra.AffineSpace K)ˣ \\ (B ⊗[K] Algebra.AffineSpace K)ˣ / U) ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 3776,
511
+ "prompt_tokens": 735,
512
+ "total_tokens": 4511,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/DivisionAlgebra.finiteDoubleCoset/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup B} (hU : IsOpen U ∧ U.IsCompact) : Finite (Bˣ \\ (B ⊗[K] (Bˣ)) / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n [FiniteDimensional K B] (U : Subgroup (B ⊗ₗ[K] (𝓞 K))) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((Bˣ) \\ (B ⊗ₗ[K] (𝓞 K))ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n (U : Subgroup (B⊗ₗ[K] Aₗ[K])) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((B⊗ₗ[K] Aₗ[K])ˣ \\ (B⊗ₗ[K] Aₗ[K])ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n (U : Subgroup ((B ⧸ span ({⟨0, 1⟩} : Set B))ˣ)) (hU : IsOpen U) :\n Finite ((B ⧸ span ({⟨0, 1⟩} : Set B))ˣ \\ (B ⧸ span ({⟨0, 1⟩} : Set B))ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n [FiniteDimensional K B] (U : Subgroup ((B ⊗[K] (borah K))ˣ)) (hU : IsOpen U) (hU' : IsCompact U) :\n Finite (Bˣ \\ (B ⊗[K] (borah K))ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B⊗ K $ AdeleRing K)} (hU : IsOpen U ∧ U.IsCompact) : Finite ((B⊗ K $ AdeleRing K)ˣ \\ (B⊗ K $ AdeleRing K)ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset (B : Type*) [DivisionRing B] [Algebra K B]\n (U : Subgroup (B⊗ₗ[K] (B ⧸ span ({⟨0⟩} : Set B))ˣ))\n (hU : IsCompact U ∧ IsOpen U) :\n Finite (doubleCoset B U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup B}\n(hU : IsCompact U ∧ IsOpen U) : Finite (doubleCosetSpace U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n {U : Subgroup (B ×ₗ[K] B)} (hU : IsOpen U) (hU1 : IsCompact U) :\n Finite ((B ×ₗ[K] B) ⧸ U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [NormedAddCommGroup B] [InnerProductSpace K B] [FiniteDimensional K B]\n (U : Subgroup ((B ◓ (环氧 K))ˣ)) (hU : IsOpen U) (hU1 : IsCompact U) :\n Finite ((B ◓ (环氧 K))ˣ ⧸ ((B ◓ (环氧 K))ˣ) / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset (K : Type*) [Field K] [NumberField K]\n (B : Type*) [DivisionRing B] [Algebra K B] :\n ∀ U : Subgroup ((B ⊗[K] (Algebra.of K B))ˣ), IsCompact U → IsOpen U → Finite (Bˣ \\ (B ⊗[K] (Algebra.of K B))ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B ⊗ₗ[K] B)}\n(hU : IsOpen U ∧ IsCompact U) : Finite (B × \\ (B ⊗ₗ[K] B) × / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n {U : Subgroup ((B ◸ span ({⟨0⟩} : Set B)) × B)}\n (hU : IsCompact U) (hU1 : IsOpen U) :\n Finite ((B ◸ span ({⟨0⟩} : Set B)) × B)ˣ / U := by sorry", "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B]\n (hB : FiniteDimensional K B)\n (U : Subgroup ((B × K)ˣ))\n (hU : IsCompact U)\n (hU1 : IsOpen U) :\n Finite ((B × K)ˣ \\ (B × K)ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B × 𝔸 K)}\n (hU : IsCompact U) (hU1 : IsOpen U) :\n Finite ((B × 𝔸 K) / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] (hB : FiniteDimensional K B) (U : Subgroup B) (hU : IsOpen U) (hU1 : IsCompact U) : Finite (Bˣ \\ (B ⊗ 𝔸 K)ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": "theorem DivisionAlgebra.finiteDoubleCoset {B : Type*} [DivisionRing B] [Algebra K B] {U : Subgroup (B ⊗[K] Algebra.AffineSpace K)}\n (hU : IsOpen U) (hU' : IsCompact U) :\n Finite ((B ⊗[K] Algebra.AffineSpace K)ˣ \\ (B ⊗[K] Algebra.AffineSpace K)ˣ / U) := by sorry", "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/ground_truth.lean ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Kevin Buzzard. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Kevin Buzzard
5
+ -/
6
+ import Mathlib.AlgebraicGeometry.EllipticCurve.Group
7
+ import Mathlib.FieldTheory.IsSepClosed
8
+ import Mathlib.RepresentationTheory.Basic
9
+
10
+ /-!
11
+
12
+ See
13
+ https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/n-torsion.20or.20multiplication.20by.20n.20as.20an.20additive.20group.20hom/near/429096078
14
+
15
+ The main theorems in this file are part of the PhD thesis work of David Angdinata, one of KB's
16
+ PhD students. It would be great if anyone who is interested in working on these results
17
+ could talk to David first. Note that he has already made substantial progress.
18
+
19
+ -/
20
+
21
+ universe u
22
+
23
+ variable {k : Type u} [Field k] (E : EllipticCurve k)
24
+
25
+ open WeierstrassCurve WeierstrassCurve.Affine
26
+
27
+ abbrev EllipticCurve.n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n
28
+
29
+ --variable (n : ℕ) in
30
+ --#synth AddCommGroup (E.n_torsion n)
31
+
32
+ def ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :
33
+ Module (ZMod n) A :=
34
+ sorry
35
+
36
+ -- not sure if this instance will cause more trouble than it's worth
37
+ instance (n : ℕ) : Module (ZMod n) (E.n_torsion n) := sorry -- shouldn't be too hard
38
+
39
+ -- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.
40
+ -- Please do not work on it without talking to KB and David first.
41
+ theorem EllipticCurve.n_torsion_finite {n : ℕ} (hn : 0 < n) : Finite (E.n_torsion n) := sorry
42
+
43
+ -- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.
44
+ -- Please do not work on it without talking to KB and David first.
45
+ theorem EllipticCurve.n_torsion_card [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :
46
+ Nat.card (E.n_torsion n) = n^2 := sorry
47
+
48
+ set_option autoImplicit true in -- TODO: fix statement
49
+ theorem group_theory_lemma {A : Type*} [AddCommGroup A] {n : ℕ} (hn : 0 < n) (r : ℕ)
50
+ (h : ∀ d : ℕ, d ∣ n → Nat.card (Submodule.torsionBy ℤ A d) = d ^ r) :
51
+ ∃ φ :(Submodule.torsionBy ℤ A n) ≃+ Fin d → (ZMod n), True := sorry
52
+
53
+ -- I only need this if n is prime but there's no harm thinking about it in general I guess.
54
+ -- It follows from the previous theorem using pure group theory (possibly including the
55
+ -- structure theorem for finite abelian groups)
56
+ theorem EllipticCurve.n_torsion_dimension [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :
57
+ ∃ φ : E.n_torsion n ≃+ (ZMod n) × (ZMod n), True := sorry
58
+
59
+ -- This should be a straightforward but perhaps long unravelling of the definition
60
+ /-- The map on points for an elliptic curve over `k` induced by a morphism of `k`-algebras
61
+ is a group homomorphism. -/
62
+ def EllipticCurve.Points.map {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]
63
+ (f : K →ₐ[k] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ := sorry
64
+
65
+ lemma EllipticCurve.Points.map_id (K : Type u) [Field K] [Algebra k K] :
66
+ EllipticCurve.Points.map E (AlgHom.id k K) = AddMonoidHom.id _ := sorry
67
+
68
+
69
+ theorem EllipticCurve.Points.map_comp (K L M : Type u) [Field K] [Field L] [Field M]
70
+ [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₐ[k] L) (g : L →ₐ[k] M) :
71
+ (EllipticCurve.Points.map E g).comp (EllipticCurve.Points.map E f) =
72
+ EllipticCurve.Points.map E (g.comp f) := by sorry
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/input_messages_compress_0.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.AlgebraicGeometry.EllipticCurve.Group\nimport Mathlib.FieldTheory.IsSepClosed\nimport Mathlib.RepresentationTheory.Basic\n\n/-!\n\nSee\nhttps://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/n-torsion.20or.20multiplication.20by.20n.20as.20an.20additive.20group.20hom/near/429096078\n\nThe main theorems in this file are part of the PhD thesis work of David Angdinata, one of KB's\nPhD students. It would be great if anyone who is interested in working on these results\ncould talk to David first. Note that he has already made substantial progress.\n\n-/\n\nuniverse u\n\nvariable {k : Type u} [Field k] (E : EllipticCurve k)\n\nopen WeierstrassCurve WeierstrassCurve.Affine\n\nabbrev EllipticCurve.n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\n--variable (n : ℕ) in\n--#synth AddCommGroup (E.n_torsion n)\n\ndef ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :\n Module (ZMod n) A :=\n sorry\n\n-- not sure if this instance will cause more trouble than it's worth\ninstance (n : ℕ) : Module (ZMod n) (E.n_torsion n) := sorry -- shouldn't be too hard\n\n-- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.\n-- Please do not work on it without talking to KB and David first.\ntheorem EllipticCurve.n_torsion_finite {n : ℕ} (hn : 0 < n) : Finite (E.n_torsion n) := sorry\n\n-- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.\n-- Please do not work on it without talking to KB and David first.\ntheorem EllipticCurve.n_torsion_card [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :\n Nat.card (E.n_torsion n) = n^2 := sorry\n\nset_option autoImplicit true in -- TODO: fix statement\ntheorem group_theory_lemma {A : Type*} [AddCommGroup A] {n : ℕ} (hn : 0 < n) (r : ℕ)\n (h : ∀ d : ℕ, d ∣ n → Nat.card (Submodule.torsionBy ℤ A d) = d ^ r) :\n ∃ φ :(Submodule.torsionBy ℤ A n) ≃+ Fin d → (ZMod n), True := sorry\n\n-- I only need this if n is prime but there's no harm thinking about it in general I guess.\n-- It follows from the previous theorem using pure group theory (possibly including the\n-- structure theorem for finite abelian groups)\ntheorem EllipticCurve.n_torsion_dimension [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :\n ∃ φ : E.n_torsion n ≃+ (ZMod n) × (ZMod n), True := sorry\n\n-- This should be a straightforward but perhaps long unravelling of the definition\n/-- The map on points for an elliptic curve over `k` induced by a morphism of `k`-algebras\nis a group homomorphism. -/\ndef EllipticCurve.Points.map {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₐ[k] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ := sorry\n\nlemma EllipticCurve.Points.map_id (K : Type u) [Field K] [Algebra k K] :\n EllipticCurve.Points.map E (AlgHom.id k K) = AddMonoidHom.id _ := sorry\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nIf $K\\to L\\to M$ are $k$-algebra homomorphisms then the group homomorphism $E(K)\\to E(M)$ induced by the map $K\\to M$ is the composite of the map $E(K)\\to E(L)$ induced by $K\\to L$ and the map $E(L)\\to E(M)$ induced by the map $L\\to M$."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n let E : Type u := by sorry"}
3
+ {"prediction": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ := by sorry"}
4
+ {"prediction": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L]\n [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n let e := EllipticCurve.Points.map E f\n let f' := EllipticCurve.Points.map E g\n e ∘ f' = EllipticCurve.Points.map E (f ∘ g) := by sorry"}
5
+ {"prediction": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n ( EllipticCurve.Points.map E f ) ∘ ( EllipticCurve.Points.map E g ) =\n EllipticCurve.Points.map E ( f ∘ g ) := by sorry"}
6
+ {"prediction": "theorem EllipticCurve.Points.map_comp {K L M : Type u} (hK :Field K) (hL :Field L) (hM :Field M) (f : EHom K L) (g : EHom L M) : EHom K M = EHom.comp f g := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-d455bf44453b4bf194faf729df54f2ce",
3
+ "created": 1749028657,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "def EllipticCurve.map {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₗ[K] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "theorem EllipticCurve.map_composite {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n let E : Type u := Submodule.map f (E.toWeierstrassCurve ⟮K⟯) -- For the moment, we just use the fact that the resulting curve has the same name as the original curve\n let E' : Type u := Submodule.map g (E.toWeierstrassCurve ⟮L⟯) -- For the moment, we just use the fact that the resulting curve has the same name as the original curve\n let f' : E →ₗ[k] E' ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "def Points.map_composite {k : Type u} {K L M : Type u} [Field k] [Field L] [Field M]\n (f : L →ₗ[K] M) (g : K →ₗ[K] L) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "def EllipticCurve.map {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n (E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯) ∘ f =\n (E.toWeierstrassCurve ⟮L⟯ →+ E.toWeierstrassCurve ⟮M⟯) ∘ g ∘ f ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "def EHom (K L : Type u) [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₗ[K] L) : E.toWeierstrassCurve ⟮K⟯ → E.toWeierstrassCurve ⟮L⟯ ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "def EllipticCurve.map_points {K L : Type u} {k : Type u} [Field k] [Algebra k K] [Algebra k L]\n (f : K →ₗ[K] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "def EllipticCurve.map_points {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₗ[K] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "def groupHomomorphism {k : Type u} {A B : Type u} [Field k] [AddCommGroup A] [AddCommGroup B]\n (f : A →ₗ[k] B) : E.toWeierstrassCurve ⟮A⟯ →+ E.toWeierstrassCurve ⟮B⟯ ",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "def EllipticCurve.map {k : Type u} {K L M : Type u} [Field k] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ+k L) (g : L →ₗ+k M) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "def EllipticCurve.map_points {k : Type u} {E : EllipticCurve k} {K L : Type u}\n [Field k] [Algebra k K] [Algebra k L] (f : K →���[k] L) :\n E.toWeierstrassCurve K →+ E.toWeierstrassCurve L ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "def EllipticCurve.Points.map_composite {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n ( EllipticCurve.Points.map E f ) ∘ ( EllipticCurve.Points.map E g ) =\n EllipticCurve.Points.map E ( f ∘ g ) ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "def EllipticCurve.map_points {K L : Type u} {k : Type u} [Field k] [Algebra k K] [Algebra k L]\n (f : K →ₗ[k] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "def EllipticCurve.map {K L : Type u} {k : Type u} (hk : IsField k) (f : K →ₗ[k] L) :\n ∃ g h : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯,\n ∀ x : E.toWeierstrassCurve ⟮K⟯, g x = h (f x) ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "def EllipticCurve.map {k : Type u} {E : EllipticCurve k} (f : k →ₗ[K] k) :\n E.toWeierstrassCurve.map f = E.toWeierstrassCurve.map (fun x => f (x.1)) * E.toWeierstrassCurve.map (fun x => x.2) ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "theorem EllipticCurve.map_composite {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "def EllipticCurve.map_points {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n let points_f := EllipticCurve.Points.map E f\n let points_g := EllipticCurve.Points.map E g\n points_f ∘ points_g = EllipticCurve.Points.map E (f ∘ g) ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "def EllipticCurve.Maps.map {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] M) (g : L →ₗ[K] M)\n : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "def EllipticCurve.Points.map_composite {K L M : Type u} (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n EllipticCurve.Points.map K M = (EllipticCurve.Points.map K L) ∘ (EllipticCurve.Points.map L M) ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "def EllipticCurve.Points.map_composite {K L M : Type u} [Field k] [Field K] [Field L] [Field M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "def EllipticCurve.map_points {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "noncomputable def composite (f g : E.toWeierstrassCurve ⟮k⟯ → E.toWeierstrassCurve ⟮k⟯) : E.toWeierstrassCurve ⟮k⟯ → E.toWeierstrassCurve ⟮k⟯ ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "def EllipticCurve Points.map_composite {K L M : Type u} [Field k] [Field K] [Field L] [Field M]\n (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n ( EllipticCurve.Points.map E f ) ∘ ( EllipticCurve.Points.map E g ) =\n EllipticCurve.Points.map E ( f ∘ g ) ",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "theorem EllipticCurve.map_composite {K L M : Type u} [Field k] [Algebra k K] [Algebra k L]\n [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n let e := EllipticCurve.Points.map E f\n let f' := EllipticCurve.Points.map E g\n e ∘ f' = EllipticCurve.Points.map E (f ∘ g) ",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "def EllipticCurve.map {K L : Type u} {k : Type u} (f : E.toWeierstrassCurve ⟮K⟯ →ₗ[k] E.toWeierstrassCurve ⟮L⟯) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "def EllipticCurve.Maps.to (K L : Type u) [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₗ[K] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "noncomputable def groupHomomorphism {k : Type u} {A B : Type u} [Field k] [AddCommGroup A] [AddCommGroup B]\n (f : A →ₗ[k] B) : (ElticCurve k A) →* (ElticCurve k B) ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "def groupHom (G : Type*) [Group G] (k : Type u) [Field k] : Type u := SubmoduleHom G k\n\ndef EllipticCurve.map (f : k →ₗ[K] k) : groupHom (E.toWeierstrassCurve ⟮k⟫) k ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "def EllipticCurve.map_points {K L : Type u} {k : Type u} [Field k] [Algebra k K] [Algebra k L]\n (f : K →ₗ[k] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "def EllipticCurve.map {k : Type u} {K L M : Type u} [Field k] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "def EllipticCurve.map {k : Type u} {K L M : Type u} [Field k] [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n E.toWeierstrassCurve.map f ∘ E.toWeierstrassCurve.map g = E.toWeierstrassCurve.map (fun x => f x * g x) ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def compositeHomomorphisms {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "def EllipticCurve.map {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n E.toWeierstrassCurve.map (E.toWeierstrassCurve.map f g) =\n E.toWeierstrassCurve.map f ∘ E.toWeierstrassCurve.map g ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "def EllipticCurve.Points.map_composite {K L M : Type u} [Field k] [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ+k M) (g : L →ₗ+k M)\n (h : ∀ x : K, f x = g (x : L)) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def G : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\ndef f_429096078 : G →+ G ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "def EllipticCurve.map {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n (E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯) ∘ (E.toWeierstrassCurve ⟮L⟯ →+ E.toWeierstrassCurve ⟮M⟯) =\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "def EllipticCurve.map_points {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] M) (g : L →ₗ[K] M) :\n let h ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "def EllipticCurve Points.map_composite {k : Type u} {K L M : Type u} [Field k] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ = E.toWeierstrassCurve ⟮L⟯ →+* E.toWeierstrassCurve ⟮L⟯ →+* E.toWeierstrassCurve ⟮M⟯ ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "noncomputable def curve_points (k : Type u) [Field k] (E : EllipticCurve k) : Type u := E.toWeierstrassCurve ⟮k⟯\n\nnoncomputable def curve_points.map (k : Type u) [Field k] (E : EllipticCurve k) (L : Type u) [Field L] (f : k →ₗ[L] L): curve_points k E → curve_points k (EllipticCurve.map f E) ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "def EllipticCurve.map_points {K L M : Type u} [Field K] [Field L] [Field M]\n [Algebra k K] [Algebra k L] [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n (E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯) ∘ f =\n (E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯) ∘ g ∘ f ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "noncomputable def groupHomomorphism {G H : Type*} [Group G] [Group H] : G ≃* H →\n G →* H ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "def E_points : Type u := Submodule.points E.toWeierstrassCurve ⟮k⟯\n\ndef E_points.map {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₗ[K] L) : E_points →+ E_points ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "def composite (f g : E.toWeierstrassCurve →*) : E.toWeierstrassCurve →* ",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "def EHom (k : Type u) {K L : Type u} [Field k] [Algebra k K] [Algebra k L] : E k →* E (k • L) ",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "def EllipticCurve.map_points {k : Type u} {K L : Type u} {E : EllipticCurve k}\n (f : K →ₗ[k] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "def EllipticCurve.Points.map_composite {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n (EPoints.map (EPoints.map f g)) =\n (EPoints.map f) ∘ (EPoints.map g) ",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "def EllipticCurve.map_points {k : Type u} {K L : Type u} [Field k] [Field K] [Field L]\n [Algebra k K] [Algebra k L] (f : K →ₗ[k] L) :\n E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "theorem EllipticCurve.map_composite {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n ( EllipticCurve.Points.map E f ) ∘ ( EllipticCurve.Points.map E g ) =\n EllipticCurve.Points.map E ( f ∘ g ) ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "def EllipticCurve.map {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n (E.toWeierstrassCurve ⟮K⟯).map (E.toWeierstrassCurve ⟮L⟯) ∘\n (E.toWeierstrassCurve ⟮L⟯).map (E.toWeierstrassCurve ⟮M⟯) =\n (E.toWeierstrassCurve ⟮K⟯).map (E.toWeierstrassCurve ⟮M⟯) ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "def EllipticCurve.map {k : Type u} {E : Type u} [Field k] [Field E] [Algebra k E]\n (f : E →ₗ[k] E) : E →ₗ[k] E ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "noncomputable def EHom (K L : Type u) (hK :Field K) (hL :Field L) : Type u := Submodule.MapsTo ℤ (E.toWeierstrassCurve ⟮K⟯) (E.toWeierstrassCurve ⟮L⟯)\n\ntheorem EllipticCurve.map_composite {K L M : Type u} (hK :Field K) (hL :Field L) (hM :Field M) (f : EHom K L) (g : EHom L M) : EHom K M = EHom.comp f g ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 4620,
511
+ "prompt_tokens": 1103,
512
+ "total_tokens": 5723,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_comp/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[k] L) (g : L →ₗ[k] M) :\n let E : Type u := by sorry", "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮M⟯ := by sorry", "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L]\n [Algebra k M] (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n let e := EllipticCurve.Points.map E f\n let f' := EllipticCurve.Points.map E g\n e ∘ f' = EllipticCurve.Points.map E (f ∘ g) := by sorry", "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": "theorem EllipticCurve.Points.map_comp {K L M : Type u} [Field k] [Algebra k K] [Algebra k L] [Algebra k M]\n (f : K →ₗ[K] L) (g : L →ₗ[K] M) :\n ( EllipticCurve.Points.map E f ) ∘ ( EllipticCurve.Points.map E g ) =\n EllipticCurve.Points.map E ( f ∘ g ) := by sorry", "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": "theorem EllipticCurve.Points.map_comp {K L M : Type u} (hK :Field K) (hL :Field L) (hM :Field M) (f : EHom K L) (g : EHom L M) : EHom K M = EHom.comp f g := by sorry", "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/ground_truth.lean ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Kevin Buzzard. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Kevin Buzzard
5
+ -/
6
+ import Mathlib.AlgebraicGeometry.EllipticCurve.Group
7
+ import Mathlib.FieldTheory.IsSepClosed
8
+ import Mathlib.RepresentationTheory.Basic
9
+
10
+ /-!
11
+
12
+ See
13
+ https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/n-torsion.20or.20multiplication.20by.20n.20as.20an.20additive.20group.20hom/near/429096078
14
+
15
+ The main theorems in this file are part of the PhD thesis work of David Angdinata, one of KB's
16
+ PhD students. It would be great if anyone who is interested in working on these results
17
+ could talk to David first. Note that he has already made substantial progress.
18
+
19
+ -/
20
+
21
+ universe u
22
+
23
+ variable {k : Type u} [Field k] (E : EllipticCurve k)
24
+
25
+ open WeierstrassCurve WeierstrassCurve.Affine
26
+
27
+ abbrev EllipticCurve.n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n
28
+
29
+ --variable (n : ℕ) in
30
+ --#synth AddCommGroup (E.n_torsion n)
31
+
32
+ def ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :
33
+ Module (ZMod n) A :=
34
+ sorry
35
+
36
+ -- not sure if this instance will cause more trouble than it's worth
37
+ instance (n : ℕ) : Module (ZMod n) (E.n_torsion n) := sorry -- shouldn't be too hard
38
+
39
+ -- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.
40
+ -- Please do not work on it without talking to KB and David first.
41
+ theorem EllipticCurve.n_torsion_finite {n : ℕ} (hn : 0 < n) : Finite (E.n_torsion n) := sorry
42
+
43
+ -- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.
44
+ -- Please do not work on it without talking to KB and David first.
45
+ theorem EllipticCurve.n_torsion_card [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :
46
+ Nat.card (E.n_torsion n) = n^2 := sorry
47
+
48
+ set_option autoImplicit true in -- TODO: fix statement
49
+ theorem group_theory_lemma {A : Type*} [AddCommGroup A] {n : ℕ} (hn : 0 < n) (r : ℕ)
50
+ (h : ∀ d : ℕ, d ∣ n → Nat.card (Submodule.torsionBy ℤ A d) = d ^ r) :
51
+ ∃ φ :(Submodule.torsionBy ℤ A n) ≃+ Fin d → (ZMod n), True := sorry
52
+
53
+ -- I only need this if n is prime but there's no harm thinking about it in general I guess.
54
+ -- It follows from the previous theorem using pure group theory (possibly including the
55
+ -- structure theorem for finite abelian groups)
56
+ theorem EllipticCurve.n_torsion_dimension [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :
57
+ ∃ φ : E.n_torsion n ≃+ (ZMod n) × (ZMod n), True := sorry
58
+
59
+ -- This should be a straightforward but perhaps long unravelling of the definition
60
+ /-- The map on points for an elliptic curve over `k` induced by a morphism of `k`-algebras
61
+ is a group homomorphism. -/
62
+ def EllipticCurve.Points.map {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]
63
+ (f : K →ₐ[k] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ := sorry
64
+
65
+
66
+ theorem EllipticCurve.Points.map_id (K : Type u) [Field K] [Algebra k K] :
67
+ EllipticCurve.Points.map E (AlgHom.id k K) = AddMonoidHom.id _ := by sorry
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/input_messages_compress_0.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.AlgebraicGeometry.EllipticCurve.Group\nimport Mathlib.FieldTheory.IsSepClosed\nimport Mathlib.RepresentationTheory.Basic\n\n/-!\n\nSee\nhttps://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/n-torsion.20or.20multiplication.20by.20n.20as.20an.20additive.20group.20hom/near/429096078\n\nThe main theorems in this file are part of the PhD thesis work of David Angdinata, one of KB's\nPhD students. It would be great if anyone who is interested in working on these results\ncould talk to David first. Note that he has already made substantial progress.\n\n-/\n\nuniverse u\n\nvariable {k : Type u} [Field k] (E : EllipticCurve k)\n\nopen WeierstrassCurve WeierstrassCurve.Affine\n\nabbrev EllipticCurve.n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\n--variable (n : ℕ) in\n--#synth AddCommGroup (E.n_torsion n)\n\ndef ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :\n Module (ZMod n) A :=\n sorry\n\n-- not sure if this instance will cause more trouble than it's worth\ninstance (n : ℕ) : Module (ZMod n) (E.n_torsion n) := sorry -- shouldn't be too hard\n\n-- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.\n-- Please do not work on it without talking to KB and David first.\ntheorem EllipticCurve.n_torsion_finite {n : ℕ} (hn : 0 < n) : Finite (E.n_torsion n) := sorry\n\n-- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.\n-- Please do not work on it without talking to KB and David first.\ntheorem EllipticCurve.n_torsion_card [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :\n Nat.card (E.n_torsion n) = n^2 := sorry\n\nset_option autoImplicit true in -- TODO: fix statement\ntheorem group_theory_lemma {A : Type*} [AddCommGroup A] {n : ℕ} (hn : 0 < n) (r : ℕ)\n (h : ∀ d : ℕ, d ∣ n → Nat.card (Submodule.torsionBy ℤ A d) = d ^ r) :\n ∃ φ :(Submodule.torsionBy ℤ A n) ≃+ Fin d → (ZMod n), True := sorry\n\n-- I only need this if n is prime but there's no harm thinking about it in general I guess.\n-- It follows from the previous theorem using pure group theory (possibly including the\n-- structure theorem for finite abelian groups)\ntheorem EllipticCurve.n_torsion_dimension [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :\n ∃ φ : E.n_torsion n ≃+ (ZMod n) × (ZMod n), True := sorry\n\n-- This should be a straightforward but perhaps long unravelling of the definition\n/-- The map on points for an elliptic curve over `k` induced by a morphism of `k`-algebras\nis a group homomorphism. -/\ndef EllipticCurve.Points.map {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₐ[k] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ := sorry\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\nThe group homomorphism $E(K)\\to E(K)$ induced by the identity map $K\\to K$ is the identity group homomorphism."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] {E : EllipticCurve k} (f : k →ₗ[K] k) :\n E.toWeierstrassCurve ≃+ E.toWeierstrassCurve := by sorry"}
3
+ {"prediction": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] (E : EllipticCurve k) :\n (E.toWeierstrassCurve k) →+* (E.toWeierstrassCurve k) = id := by sorry"}
4
+ {"prediction": "theorem EllipticCurve.Points.map_id {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ := by sorry"}
5
+ {"prediction": "theorem EllipticCurve.Points.map_id {E : Type u} [Field k] [IsSepClosed k] [Algebra k E] [Group E]\n (f : E →ₗ[E] E) (hf : f = id) :\n ∀ x : E, f x = x := by sorry"}
6
+ {"prediction": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] (E : EllipticCurve k) : E to itself ≃+ E to itself := by sorry"}
7
+ {"prediction": "theorem EllipticCurve.Points.map_id {E : Type u} [Field k] [AddCommGroup E] [IsSepClosed k] :\n ∃ φ : E ≃+ E, ∀ x : E, φ x = x := by sorry"}
8
+ {"prediction": "theorem EllipticCurve.Points.map_id : ∀ (K : Type u) [Field K] [Algebra k K], E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ := by sorry"}
9
+ {"prediction": "theorem EllipticCurve.Points.map_id (K : Type u) [Field K] (f : K →ₗ[K] K) (hf : f = id) :\n ( EllipticCurve.Points.map f ) = id := by sorry"}
10
+ {"prediction": "theorem EllipticCurve.Points.map_id : ∀ (k : Type u) [Field k] (E : EllipticCurve k), (E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯) = Submodule.id := by sorry"}
11
+ {"prediction": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] {E : EllipticCurve k} : E.toWeierstrassCurve ≃+ E.toWeierstrassCurve := by sorry"}
12
+ {"prediction": "theorem EllipticCurve.Points.map_id : E.toWeierstrassCurve ⟮k⟯ ≃+ E.toWeierstrassCurve ⟮k⟯ := by sorry"}
13
+ {"prediction": "theorem EllipticCurve.Points.map_id {E : Type u} [Field k] [EllipticCurve k E] :\n E ≃+ E := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-73df3205f5964183a10981d6c814eceb",
3
+ "created": 1749028659,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "def EllipticCurve.id_points {k : Type u} [Field k] : E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "theorem group_theory_348765 {k : Type u} [Field k] {E : EllipticCurve k} (f : k →ₗ[K] k) :\n E.toWeierstrassCurve ≃+ E.toWeierstrassCurve ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "stop",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "theorem my_favorite_theorem {k : Type u} [Field k] (E : EllipticCurve k) :\n (E.toWeierstrassCurve k) →+* (E.toWeierstrassCurve k) = id ",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "def EllipticCurve.identity_pointsmap {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "theorem my_favorite_theorem {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "def EllipticCurve_points (E : EllipticCurve k) : Type u := {P : E.toWeierstrassCurve | P.toAFine = 1}\n\ndef EllipticCurve_points.map (E : EllipticCurve k) : EllipticCurve_points E →+ EllipticCurve_points E ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "noncomputable def idHom (E : Type u) [Equiv.Perm E] : E ≃* E ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "def E_points : E (ZMod n) ≃+ E (ZMod n) ",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "def EllipticCurve.identity_hom (E : Type u) [EllipticCurve E] : E →ₗ[E] E ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "def EllipticCurve.pointsMapUsing [IsSepClosed k] {K L : Type u} [Field K] [Field L] [Algebra k K] [Algebra k L]\n (f : K →ₗ[K] L) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "theorem my_favorite_theorem {E : Type u} [Field k] [IsSepClosed k] [Algebra k E] [Group E]\n (f : E →ₗ[E] E) (hf : f = id) :\n ∀ x : E, f x = x ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "def EllipticCurve.idHom {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "def EPOINTS_MAP : E.toWeierstrassCurve k → E.toWeierstrassCurve k ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "noncomputable def E_points (K : Type u) : Type u := Submodule.map (EllipticCurve.Points.map K K) E.toWeierstrassCurve\n\nnoncomputable def E_points_identity (K : Type u) : E_points K ≃+ E_points K ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "noncomputable def Endpoints.map (f : E k →+ E k) : E k →+ E k ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "noncomputable def E_points : Type u := Submodule.points E.toWeierstrassCurve ⟮k⟯\n\nnoncomputable def E_points.map (f : k →ₗ[K] k) : E_points →+ E_points := Submodule.map E.toWeierstrassCurve ⟮k⟯ f",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "def EllipticCurve.Points.id {k : Type u} [Field k] : E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "def EllipticCurve.Points.id[K][L] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮L⟯ ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "def EllipticCurve_points (@E_points k E) : Type u := Submodule.points E\n\ndef EllipticCurve_points.map {K : Type u} [Field k] [Algebra k K] (f : k →ₗ[K] K) : E_points k E →+ E_points K E ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "theorem my_favorite_theorem {k : Type u} [Field k] (E : EllipticCurve k) : E to itself ≃+ E to itself ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "def EllipticCurve.morphisms {k : Type u} [Field k] : (E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯) ↔\n (E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯) ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "theorem group_theory_94727 {E : Type u} [Field k] [AddCommGroup E] [IsSepClosed k] :\n ∃ φ : E ≃+ E, ∀ x : E, φ x = x ",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "def EllipticCurve.id_points {k : Type u} {E : EllipticCurve k} : E →+ E ",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "def EllipticCurve Points.map_to自身 {k : Type u} [Field k] [Algebra k k] (f : k →ₗ[K] k) :\n E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "noncomputable def Endpoints.mk {k : Type u} [Field k] (E : EllipticCurve k) : Set (E.toWeierstrassCurve AffineSpace ℝ) ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "def EllipticCurve.id_points (E : EllipticCurve k) : E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "theorem my_favorite_theorem : ∀ (K : Type u) [Field K] [Algebra k K], E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "def EllipticCurve.idHom {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "def idHom (E : Type u) [EllipticCurve E] : E →ₗ[E] E ",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "def EllipticCurve.idHom {k : Type u} {E : EllipticCurve k} : E →ₗ[E] E ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "noncomputable def Points.map [IsSepClosed k] (f : k → k) : E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "def EllipticCurve.identity : E.toWeierstrassCurve →+* E.toWeierstrassCurve ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "theorem my_favorite_theorem (K : Type u) [Field K] (f : K →ₗ[K] K) (hf : f = id) :\n ( EllipticCurve.Points.map f ) = id ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "noncomputable def idHom : E.toWeierstrassCurve k →+ E.toWeierstrassCurve k ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "theorem my_favorite_theorem : ∀ (k : Type u) [Field k] (E : EllipticCurve k), (E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯) = Submodule.id ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "def E_points : E ≃* E ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "theorem my_favorite_theorem {k : Type u} [Field k] {E : EllipticCurve k} : E.toWeierstrassCurve ≃+ E.toWeierstrassCurve ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "def E_points : E toWeierstrassCurve ≃+ E toWeierstrassCurve ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "noncomputable def groupHomomorphism (G : Type u) [Group G] (f : G �� G) : G → G ≃* G ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "def E_points : E toWeierstrassCurve →+ E toWeierstrassCurve ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "def EllipticCurve.id_points {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "def EllipticCurve.Points.idmap {k : Type u} [Field k] : E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "def E_points : E →+* E ",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "noncomputable def Endpoints.map {k : Type u} (f : k →ₗ[K] k) : E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "theorem my_favorite_theorem : E.toWeierstrassCurve ⟮k⟯ ≃+ E.toWeierstrassCurve ⟮k⟯ ",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "def EllipticCurve.Points.map.Identity {K : Type u} [Field K] (f : K →ₗ[K] K) : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "theorem my_favorite_theorem {E : Type u} [Field k] [EllipticCurve k E] :\n E ≃+ E ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "def EllipticCurve.Points.identity {k : Type u} {E : EllipticCurve k} : E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯ ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "def ellipticCurve_points_identityHom {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "def EllipticCurve.morphism {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 2205,
511
+ "prompt_tokens": 997,
512
+ "total_tokens": 3202,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.Points.map_id/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] {E : EllipticCurve k} (f : k →ₗ[K] k) :\n E.toWeierstrassCurve ≃+ E.toWeierstrassCurve := by sorry", "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] (E : EllipticCurve k) :\n (E.toWeierstrassCurve k) →+* (E.toWeierstrassCurve k) = id := by sorry", "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": "theorem EllipticCurve.Points.map_id {K : Type u} [Field K] : E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ := by sorry", "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": "theorem EllipticCurve.Points.map_id {E : Type u} [Field k] [IsSepClosed k] [Algebra k E] [Group E]\n (f : E →ₗ[E] E) (hf : f = id) :\n ∀ x : E, f x = x := by sorry", "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] (E : EllipticCurve k) : E to itself ≃+ E to itself := by sorry", "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": "theorem EllipticCurve.Points.map_id {E : Type u} [Field k] [AddCommGroup E] [IsSepClosed k] :\n ∃ φ : E ≃+ E, ∀ x : E, φ x = x := by sorry", "well_typed": true, "beq_result": {"beql_unidirections": [null, null], "beq_plus_unidirections": [null, null]}, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": "theorem EllipticCurve.Points.map_id : ∀ (K : Type u) [Field K] [Algebra k K], E.toWeierstrassCurve ⟮K⟯ →+ E.toWeierstrassCurve ⟮K⟯ := by sorry", "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": "theorem EllipticCurve.Points.map_id (K : Type u) [Field K] (f : K →ₗ[K] K) (hf : f = id) :\n ( EllipticCurve.Points.map f ) = id := by sorry", "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": "theorem EllipticCurve.Points.map_id : ∀ (k : Type u) [Field k] (E : EllipticCurve k), (E.toWeierstrassCurve ⟮k⟯ →+ E.toWeierstrassCurve ⟮k⟯) = Submodule.id := by sorry", "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": "theorem EllipticCurve.Points.map_id {k : Type u} [Field k] {E : EllipticCurve k} : E.toWeierstrassCurve ≃+ E.toWeierstrassCurve := by sorry", "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": "theorem EllipticCurve.Points.map_id : E.toWeierstrassCurve ⟮k⟯ ≃+ E.toWeierstrassCurve ⟮k⟯ := by sorry", "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": "theorem EllipticCurve.Points.map_id {E : Type u} [Field k] [EllipticCurve k E] :\n E ≃+ E := by sorry", "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/ground_truth.lean ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /-
2
+ Copyright (c) 2024 Kevin Buzzard. All rights reserved.
3
+ Released under Apache 2.0 license as described in the file LICENSE.
4
+ Authors: Kevin Buzzard
5
+ -/
6
+ import Mathlib.AlgebraicGeometry.EllipticCurve.Group
7
+ import Mathlib.FieldTheory.IsSepClosed
8
+ import Mathlib.RepresentationTheory.Basic
9
+
10
+ /-!
11
+
12
+ See
13
+ https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/n-torsion.20or.20multiplication.20by.20n.20as.20an.20additive.20group.20hom/near/429096078
14
+
15
+ The main theorems in this file are part of the PhD thesis work of David Angdinata, one of KB's
16
+ PhD students. It would be great if anyone who is interested in working on these results
17
+ could talk to David first. Note that he has already made substantial progress.
18
+
19
+ -/
20
+
21
+ universe u
22
+
23
+ variable {k : Type u} [Field k] (E : EllipticCurve k)
24
+
25
+ open WeierstrassCurve WeierstrassCurve.Affine
26
+
27
+ abbrev EllipticCurve.n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n
28
+
29
+ --variable (n : ℕ) in
30
+ --#synth AddCommGroup (E.n_torsion n)
31
+
32
+ def ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :
33
+ Module (ZMod n) A :=
34
+ sorry
35
+
36
+ -- not sure if this instance will cause more trouble than it's worth
37
+ instance (n : ℕ) : Module (ZMod n) (E.n_torsion n) := sorry -- shouldn't be too hard
38
+
39
+ -- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.
40
+ -- Please do not work on it without talking to KB and David first.
41
+ theorem EllipticCurve.n_torsion_finite {n : ℕ} (hn : 0 < n) : Finite (E.n_torsion n) := sorry
42
+
43
+ -- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.
44
+ -- Please do not work on it without talking to KB and David first.
45
+
46
+ theorem EllipticCurve.n_torsion_card [IsSepClosed k] {n : ℕ} (hn : (n : k) ≠ 0) :
47
+ Nat.card (E.n_torsion n) = n^2 := by sorry
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/input_messages_compress_0.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are an expert in mathematics and Lean 4."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "Please autoformalize the following problem in Lean 4 with a header. Here is some context for the problem:\n\nimport Mathlib.AlgebraicGeometry.EllipticCurve.Group\nimport Mathlib.FieldTheory.IsSepClosed\nimport Mathlib.RepresentationTheory.Basic\n\n/-!\n\nSee\nhttps://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/n-torsion.20or.20multiplication.20by.20n.20as.20an.20additive.20group.20hom/near/429096078\n\nThe main theorems in this file are part of the PhD thesis work of David Angdinata, one of KB's\nPhD students. It would be great if anyone who is interested in working on these results\ncould talk to David first. Note that he has already made substantial progress.\n\n-/\n\nuniverse u\n\nvariable {k : Type u} [Field k] (E : EllipticCurve k)\n\nopen WeierstrassCurve WeierstrassCurve.Affine\n\nabbrev EllipticCurve.n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\n--variable (n : ℕ) in\n--#synth AddCommGroup (E.n_torsion n)\n\ndef ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :\n Module (ZMod n) A :=\n sorry\n\n-- not sure if this instance will cause more trouble than it's worth\ninstance (n : ℕ) : Module (ZMod n) (E.n_torsion n) := sorry -- shouldn't be too hard\n\n-- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.\n-- Please do not work on it without talking to KB and David first.\ntheorem EllipticCurve.n_torsion_finite {n : ℕ} (hn : 0 < n) : Finite (E.n_torsion n) := sorry\n\n-- This theorem needs e.g. a theory of division polynomials. It's ongoing work of David Angdinata.\n-- Please do not work on it without talking to KB and David first.\n\nNow formalize the problem. Use the following theorem names: my_favorite_theorem.\n\n\n\\notready Let $n$ be a positive integer, let $F$ be a separably closed field with $n$ nonzero in $F$, and let $E$ be an elliptic curve over $F$. Then the $n$-torsion $E(K)[n]$ in the $F$-points of $E$ is a finite group of size $n^2$."
9
+ }
10
+ ]
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/postprocessed_dedup_predictions.jsonl ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"prediction": null}
2
+ {"prediction": "theorem EllipticCurve.n_torsion_card (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n Finite (n_torsion E n) ∧ (n_torsion E n).ncard = n ^ 2 := by sorry"}
3
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype Fˣ) (E : Ecurve F) : Fintype (E.points F)ˣ := by sorry"}
4
+ {"prediction": "theorem EllipticCurve.n_torsion_card (E : EllipticCurve k) (n : ℕ) : Prop := by sorry"}
5
+ {"prediction": "theorem EllipticCurve.n_torsion_card {k : Type u} [Field k] [SepClosed k] (E : Type*) [Field E] [EllipticCurve E] [IsSepClosed E k] (n : ℕ) (hn : 0 < n) :\n Finite (curve_torsor E k n) ∧ curve_torsor E k n.encard = n ^ 2 := by sorry"}
6
+ {"prediction": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] (n : ℕ) (hn : 0 < n) (hF : IsSepClosed F) (hF1 : Fintype F)\n (hF2 : Nonempty F) (E : EllipticCurve F) :\n curve_n_torsion_finite F n ∧ curve_n_torsion_add_group F n = (ZMod n)ˣ := by sorry"}
7
+ {"prediction": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : n > 0)\n (E : Affine WeierstrassCurve F) (hE : E.toWeierstrassCurve.natDegree = 2) :\n ∃ g : Fintype (E.points ⧸ span ({1} : Set (E.points))), (E.points ⧸ span ({1} : Set (E.points))) = g ∧\n Fintype.card (E.points ⧸ span ({1} : Set (E.points))) = n ^ 2 := by sorry"}
8
+ {"prediction": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n IsSepClosed k → (E.n_torsion n).Finite ∧ (E.n_torsion n).ncard = n ^ 2 := by sorry"}
9
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F]\n (hF : Fintype F) (hF1 : Fintype.card F = n) (E : Affine E) :\n (E.points.filter (fun x => x ^ n = 1)).Finite ∧\n Fintype ((E.points.filter (fun x => x ^ n = 1)) : Set E.points ) ∧\n Fintype.card ((E.points.filter (fun x => x ^ n = 1)) : Set E.points ) = n ^ 2 := by sorry"}
10
+ {"prediction": "theorem EllipticCurve.n_torsion_card {F : Type} [Field F] [IsSepClosed F] (hF : Nonempty Fˣ) (E : EllipticCurve F) (n : ℕ) (hn : 0 < n) :\n Nonempty (E.points ⧸ span ({0} : Set (E.points)))ˣ ∧\n (E.points ⧸ span ({0} : Set (E.points)))ˣ.ncard = n ^ 2 := by sorry"}
11
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ)\n (hn : 0 < n)\n (F : Type*) [Field F]\n (hF : IsSepClosed F)\n (hF1 : Nonempty (Fˣ))\n (E : AffineCurse F)\n (hE : E.Nonempty)\n : Finite (E.points.filter (fun x => x ^ n = 1)) ∧ (E.points.filter (fun x => x ^ n = 1)).ncard = n ^ 2 := by sorry"}
12
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F]\n [IsSepClosed F] (hF : Fintype F) (E : Type*) [EllipticCurve F E]\n (hE : IsCyclic Eˣ) :\n Nonempty (E n_torsion) ∧ Fintype (E n_torsion) ∧\n (E n_torsion).ncard = n ^ 2 := by sorry"}
13
+ {"prediction": "theorem EllipticCurve.n_torsion_card {k : Type u} [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (F : SeparablyClosed k) [Field F] (hF : Fintype F) (hF1 : card F = n) :\n Fintype (E.toWeierstrassCurve F 0) ∧ @card (E.toWeierstrassCurve F 0) = n ^ 2 := by sorry"}
14
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [SeparableClosed F] (hF : n ≠ 0) (E : Type*) [EllipticCurve E] :\n Finite (curve_points (E.n_torsion n)) ∧ curve_points (E.n_torsion n).ncard = n ^ 2 := by sorry"}
15
+ {"prediction": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : 0 < n) (hn1 : n ≠ 1) (E : EllipticCurve F) :\n Finite (E.toWeierstrassCurve n_torsion) ∧ E.toWeierstrassCurve n_torsion.ncard = n ^ 2 := by sorry"}
16
+ {"prediction": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype F) (hF1 : Fintype.card F = n) : Finite (E.n_torsion n) ∧ (E.n_torsion n).card = n ^ 2 := by sorry"}
17
+ {"prediction": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k)\n (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype F)\n (hF1 : Fintype.card F = n) :\n let G := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n [inst : NeZero k] [inst : Fintype G] [inst : Group G] [inst : AddCommGroup G] [inst : Module k G]\n G.fintype.card = n ^ 2 := by sorry"}
18
+ {"prediction": "theorem EllipticCurve.n_torsion_card {k : Type u} [Field k] [IsSepClosed k]\n (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (hn1 : n ≠ 1) :\n ∃ F : Fintype (E.n_torsion n), F.card = n ^ 2 ∧\n (E.n_torsion n : Type*)[AddCommGroup (E.n_torsion n)] = AddCommGroup.mk\n (E.n_torsion n : Type*)[Module (ZMod n) (E.n_torsion n)] = Module.mk\n (E.n_torsion n : Type*)[Fintype (E.n_torsion n)] = Fintype.mk := by sorry"}
19
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (E : WeierstrassCurve k) : Finite (curve_n_torsion E n) := by sorry"}
20
+ {"prediction": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (h : IsSepClosed k) :\n IsAddCommGroup (E.n_torsion n) ∧ Finite (E.n_torsion n) ∧ (E.n_torsion n).ncard = n ^ 2 := by sorry"}
21
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (k : Type) [Field k] (E : EllipticCurve k) [IsSepClosed k] (hE : Nonempty (E.toWeierstrassCurve ⟮k⟯)) (hE1 : ∀ x : E.toWeierstrassCurve ⟮k⟯, x ^ n = 1) : Finite (curve_n_torsion n E) ∧ (curve_n_torsion n E).ncard = n ^ 2 := by sorry"}
22
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F]\n [IsSepClosed F] (hF : n ≠ 0) (E : ECurve F) :\n Finite (EPoints F)[n]! ∧\n (EPoints F)[n]!.ncard = n ^ 2 := by sorry"}
23
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Nonempty (Fˣ)) (E : EllipticCurve F) :\n Nonempty (E.toWeierstrassCurve Fˣ) ∧ Fintype (E.toWeierstrassCurve Fˣ) ∧ Fintype.card (E.toWeierstrassCurve Fˣ) = n ^ 2 := by sorry"}
24
+ {"prediction": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (k : Type*) [Field k] (E : EllipticCurve k) [IsSepClosed k] (hE : Nonempty (E.toWeierstrassCurve ⟮k⟯)) : IsGroup (E.toWeierstrassCurve ⟮k⟯)ˣ ∧ ∀ x : E.toWeierstrassCurve ⟮k⟯, x ^ n = 1 := by sorry"}
25
+ {"prediction": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : 0 < n) :\n Nonempty (E n_torsion) ∧\n ∃ fin : Fintype (E n_torsion), fin.card = n ^ 2 := by sorry"}
26
+ {"prediction": "theorem EllipticCurve.n_torsion_card {n : ℕ} (hn : 0 < n) (k : Type*) [Field k] (hk : IsSepClosed k)\n (hk1 : Nonempty k) (E : EllipticCurve k) :\n Finite (E.toWeierstrassCurve k) ∧ card (E.toWeierstrassCurve k) = n^2 := by sorry"}
27
+ {"prediction": "theorem EllipticCurve.n_torsion_card (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n Finite (curve_n_torsion E n) ∧ curve_n_torsion E n =+* curve_n_torsion E n := by sorry"}
28
+ {"prediction": "theorem EllipticCurve.n_torsion_card (k : Type*) [Field k] (E : ECurve k) (n : ℕ) (hn : n ≠ 0)\n (hSepClosed : IsSepClosed k) : Nonempty (E.points k ⧸ span ({0} : Set k)) ∧\n (E.points k ⧸ span ({0} : Set k)).Finite ∧\n (E.points k ⧸ span ({0} : Set k)).ncard = n ^ 2 := by sorry"}
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/raw_completion.json ADDED
@@ -0,0 +1,518 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "chatcmpl-bad6d119847441c5bb58f8b0b59b8ff0",
3
+ "created": 1749028693,
4
+ "model": "hosted_vllm/sorgfresser/kiminaembedbeta",
5
+ "object": "chat.completion",
6
+ "system_fingerprint": null,
7
+ "choices": [
8
+ {
9
+ "finish_reason": "stop",
10
+ "index": 0,
11
+ "message": {
12
+ "content": "def SeparablyClosedField (F : Type*) [Field F] : Prop :=\n let rcases := Fintype F\n let cardF := rcases.toNat.card\n cardF ≠ 0 ∧ ∀ x : F, x ≠ 0 → x ^ cardF = 1\n\ndef ellipticCurveModule (E : Type*) [Field k] [ EllipticCurve k] (n : ℕ) : Module (ZMod n) E :=\n",
13
+ "role": "assistant",
14
+ "tool_calls": null,
15
+ "function_call": null
16
+ }
17
+ },
18
+ {
19
+ "finish_reason": "stop",
20
+ "index": 1,
21
+ "message": {
22
+ "content": "noncomputable def n_torsion (E : EllipticCurve k) (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\ntheorem EllipticCurve.n_torsion_finite (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n Finite (n_torsion E n) ∧ (n_torsion E n).ncard = n ^ 2 ",
23
+ "role": "assistant",
24
+ "tool_calls": null,
25
+ "function_call": null
26
+ }
27
+ },
28
+ {
29
+ "finish_reason": "length",
30
+ "index": 2,
31
+ "message": {
32
+ "content": "noncomputable def SeparatelyClosed (F : Type u) (hF : IsSepClosed F) : Type u := Submodulesep.Fintype F\n\nnoncomputable def EllipticCurve.fintype (E : EllipticCurve k) : Type u := E.toWeierstrassCurve.Fintype\n\nnoncomputable def AddCommGroup.fintype {A : Type u} [AddCommGroup A] : Type u := Submodulesep.Fintype A\n\nnoncomputable def Module.fintype {F : Type u} {A : Type u} [AddCommGroup A] [Field F] : Type u := Submodulesep.Fintype F A\n\nnoncomputable def Finite.fintype {F : Type u} {A : Type u} [AddCommGroup A] [Field F] : Type u := Submodulesep.Fintype F A\n\nnoncomputable def card (F : Type u) {A : Type u} [AddCommGroup A] [Field F] : ℕ := Submodulesep.card F A\n\nnoncomputable def card.fintype {F : Type u} {A : Type u} [AddCommGroup A] [Field F] : Type u := Submodulesep.Fintype.card F A\n\nnoncomputable def Countable.fintype {F : Type u} {A : Type u} [AddCommGroup A] [Field F] : Type u := Submodulesep.Fintype.Countable F A\n\nnoncomputable def Fintype.fintype {F : Type u} {A : Type u} [AddCommGroup A] [Field F] : Type u := Submodulesep.Fintype.Fintype F A\n\nnoncomputable def clearFintype {F : Type u} {A : Type u} [AddCommGroup A] [Field F] : Type u := Submodulesep.Fintype.clearFintype F A\n\nnoncomputable def card.fintype (E : EllipticCurve k) : Type u := Submodulesep.Fintype.card (E.toWeierstrassCurve ⟮k⟯)\n\nnoncomputable def Countable.fintype (E : EllipticCurve k) : Type u := Submodulesep.Fintype.Countable (E.toWeierstrassCurve ⟮k⟯)\n\nnoncomputable def Finite.fintype (E : EllipticCurve",
33
+ "role": "assistant",
34
+ "tool_calls": null,
35
+ "function_call": null
36
+ }
37
+ },
38
+ {
39
+ "finish_reason": "stop",
40
+ "index": 3,
41
+ "message": {
42
+ "content": "theorem my_favorite_theorem (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype Fˣ) (E : Ecurve F) : Fintype (E.points F)ˣ ",
43
+ "role": "assistant",
44
+ "tool_calls": null,
45
+ "function_call": null
46
+ }
47
+ },
48
+ {
49
+ "finish_reason": "stop",
50
+ "index": 4,
51
+ "message": {
52
+ "content": "noncomputable def AddCommGroupHom (A B : Type*) [AddCommGroup A] [AddCommGroup B] : Type u := Submodule.mapHom ℤ A B\n\ndef SeparablyClosedField (F : Type*) [Field F] : Prop := Submodule.Separable ℤ F ∧ Submodule.Closed F\n\ndef EllipticCurve.finite_n_torsion (E : EllipticCurve k) (n : ℕ) : Prop := Finite (E.n_torsion n)\n\ndef EllipticCurve.card_n_torsion (E : EllipticCurve k) (n : ℕ) : ℕ := Nat.card (E.n_torsion n)\n\ntheorem EllipticCurve.finite_n_torsion_iff (E : EllipticCurve k) (n : ℕ) : Prop ",
53
+ "role": "assistant",
54
+ "tool_calls": null,
55
+ "function_call": null
56
+ }
57
+ },
58
+ {
59
+ "finish_reason": "stop",
60
+ "index": 5,
61
+ "message": {
62
+ "content": "noncomputable def curve_torsor (E : Type*) [Field E] [EllipticCurve E] (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮E⟩) n\n\ntheorem EllipticCurve.torsor_finite {k : Type u} [Field k] [SepClosed k] (E : Type*) [Field E] [EllipticCurve E] [IsSepClosed E k] (n : ℕ) (hn : 0 < n) :\n Finite (curve_torsor E k n) ∧ curve_torsor E k n.encard = n ^ 2 ",
63
+ "role": "assistant",
64
+ "tool_calls": null,
65
+ "function_call": null
66
+ }
67
+ },
68
+ {
69
+ "finish_reason": "stop",
70
+ "index": 6,
71
+ "message": {
72
+ "content": "def SeparablyClosedField.n_zero (F : Type u) [Field F] (n : ℕ) : Prop := ",
73
+ "role": "assistant",
74
+ "tool_calls": null,
75
+ "function_call": null
76
+ }
77
+ },
78
+ {
79
+ "finish_reason": "stop",
80
+ "index": 7,
81
+ "message": {
82
+ "content": "noncomputable def E_n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\nnoncomputable def ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :\n Module (ZMod n) A :=\n ",
83
+ "role": "assistant",
84
+ "tool_calls": null,
85
+ "function_call": null
86
+ }
87
+ },
88
+ {
89
+ "finish_reason": "stop",
90
+ "index": 8,
91
+ "message": {
92
+ "content": "noncomputable def curve_n_torsion (F : Type*) [Field F] (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮F⟯) n\n\nnoncomputable def curve_n_torsion_add_group (F : Type*) [Field F] (n : ℕ) : AddCommGroup (curve_n_torsion F n) := Submodule.addCommGroupOfTorsor _curve_n_torsion F n\n\nnoncomputable def curve_n_torsion_finite (F : Type*) [Field F] (n : ℕ) : Finite (curve_n_torsion F n) := Submodule.finiteTorsor _curve_n_torsion F n\n\ntheorem my_favorite_theorem\n (F : Type*) [Field F] (n : ℕ) (hn : 0 < n) (hF : IsSepClosed F) (hF1 : Fintype F)\n (hF2 : Nonempty F) (E : EllipticCurve F) :\n curve_n_torsion_finite F n ∧ curve_n_torsion_add_group F n = (ZMod n)ˣ ",
93
+ "role": "assistant",
94
+ "tool_calls": null,
95
+ "function_call": null
96
+ }
97
+ },
98
+ {
99
+ "finish_reason": "stop",
100
+ "index": 9,
101
+ "message": {
102
+ "content": "theorem my_favorite_theorem (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : n > 0)\n (E : Affine WeierstrassCurve F) (hE : E.toWeierstrassCurve.natDegree = 2) :\n ∃ g : Fintype (E.points ⧸ span ({1} : Set (E.points))), (E.points ⧸ span ({1} : Set (E.points))) = g ∧\n Fintype.card (E.points ⧸ span ({1} : Set (E.points))) = n ^ 2 ",
103
+ "role": "assistant",
104
+ "tool_calls": null,
105
+ "function_call": null
106
+ }
107
+ },
108
+ {
109
+ "finish_reason": "stop",
110
+ "index": 10,
111
+ "message": {
112
+ "content": "theorem my_favorite_theorem (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n IsSepClosed k → (E.n_torsion n).Finite ∧ (E.n_torsion n).ncard = n ^ 2 ",
113
+ "role": "assistant",
114
+ "tool_calls": null,
115
+ "function_call": null
116
+ }
117
+ },
118
+ {
119
+ "finish_reason": "stop",
120
+ "index": 11,
121
+ "message": {
122
+ "content": "theorem my_favorite_theorem (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F]\n (hF : Fintype F) (hF1 : Fintype.card F = n) (E : Affine E) :\n (E.points.filter (fun x => x ^ n = 1)).Finite ∧\n Fintype ((E.points.filter (fun x => x ^ n = 1)) : Set E.points ) ∧\n Fintype.card ((E.points.filter (fun x => x ^ n = 1)) : Set E.points ) = n ^ 2 ",
123
+ "role": "assistant",
124
+ "tool_calls": null,
125
+ "function_call": null
126
+ }
127
+ },
128
+ {
129
+ "finish_reason": "stop",
130
+ "index": 12,
131
+ "message": {
132
+ "content": "theorem my_favorite_theorem {F : Type} [Field F] [IsSepClosed F] (hF : Nonempty Fˣ) (E : EllipticCurve F) (n : ℕ) (hn : 0 < n) :\n Nonempty (E.points ⧸ span ({0} : Set (E.points)))ˣ ∧\n (E.points ⧸ span ({0} : Set (E.points)))ˣ.ncard = n ^ 2 ",
133
+ "role": "assistant",
134
+ "tool_calls": null,
135
+ "function_call": null
136
+ }
137
+ },
138
+ {
139
+ "finish_reason": "stop",
140
+ "index": 13,
141
+ "message": {
142
+ "content": "noncomputable def separator (k : Type u) (F : Type u) [Field F] [SeparablyClosed F] (n : ℕ) : Prop ",
143
+ "role": "assistant",
144
+ "tool_calls": null,
145
+ "function_call": null
146
+ }
147
+ },
148
+ {
149
+ "finish_reason": "stop",
150
+ "index": 14,
151
+ "message": {
152
+ "content": "def SeparablyClosedField (F : Type*) [Field F] : Prop := ",
153
+ "role": "assistant",
154
+ "tool_calls": null,
155
+ "function_call": null
156
+ }
157
+ },
158
+ {
159
+ "finish_reason": "stop",
160
+ "index": 15,
161
+ "message": {
162
+ "content": "theorem my_favorite_theorem\n (n : ℕ)\n (hn : 0 < n)\n (F : Type*) [Field F]\n (hF : IsSepClosed F)\n (hF1 : Nonempty (Fˣ))\n (E : AffineCurse F)\n (hE : E.Nonempty)\n : Finite (E.points.filter (fun x => x ^ n = 1)) ∧ (E.points.filter (fun x => x ^ n = 1)).ncard = n ^ 2 ",
163
+ "role": "assistant",
164
+ "tool_calls": null,
165
+ "function_call": null
166
+ }
167
+ },
168
+ {
169
+ "finish_reason": "stop",
170
+ "index": 16,
171
+ "message": {
172
+ "content": "def SeparablyClosed (F : Type*) [Field F] : Prop ",
173
+ "role": "assistant",
174
+ "tool_calls": null,
175
+ "function_call": null
176
+ }
177
+ },
178
+ {
179
+ "finish_reason": "stop",
180
+ "index": 17,
181
+ "message": {
182
+ "content": "theorem my_favorite_theorem (n : ℕ) (hn : 0 < n) (F : Type*) [Field F]\n [IsSepClosed F] (hF : Fintype F) (E : Type*) [EllipticCurve F E]\n (hE : IsCyclic Eˣ) :\n Nonempty (E n_torsion) ∧ Fintype (E n_torsion) ∧\n (E n_torsion).ncard = n ^ 2 ",
183
+ "role": "assistant",
184
+ "tool_calls": null,
185
+ "function_call": null
186
+ }
187
+ },
188
+ {
189
+ "finish_reason": "stop",
190
+ "index": 18,
191
+ "message": {
192
+ "content": "open Fintype Set Real Ideal Polynomial\nopen scoped BigOperators\n\ntheorem my_favorite_theorem {k : Type u} [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (F : SeparablyClosed k) [Field F] (hF : Fintype F) (hF1 : card F = n) :\n Fintype (E.toWeierstrassCurve F 0) ∧ @card (E.toWeierstrassCurve F 0) = n ^ 2 ",
193
+ "role": "assistant",
194
+ "tool_calls": null,
195
+ "function_call": null
196
+ }
197
+ },
198
+ {
199
+ "finish_reason": "stop",
200
+ "index": 19,
201
+ "message": {
202
+ "content": "def SeparableClosed (F : Type*) [Field F] : Prop :=\n ∀ x : F, x ≠ 0 → IsUnit x\n\ndef curve_points (E : Type*) [EllipticCurve E] : Set E := {P : E | P.toWeierstrassCurve.X ≠ 0}\n\ntheorem EllipticCurve.finite_n_torsion (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [SeparableClosed F] (hF : n ≠ 0) (E : Type*) [EllipticCurve E] :\n Finite (curve_points (E.n_torsion n)) ∧ curve_points (E.n_torsion n).ncard = n ^ 2 ",
203
+ "role": "assistant",
204
+ "tool_calls": null,
205
+ "function_call": null
206
+ }
207
+ },
208
+ {
209
+ "finish_reason": "stop",
210
+ "index": 20,
211
+ "message": {
212
+ "content": "theorem my_favorite_theorem (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : 0 < n) (hn1 : n ≠ 1) (E : EllipticCurve F) :\n Finite (E.toWeierstrassCurve n_torsion) ∧ E.toWeierstrassCurve n_torsion.ncard = n ^ 2 ",
213
+ "role": "assistant",
214
+ "tool_calls": null,
215
+ "function_call": null
216
+ }
217
+ },
218
+ {
219
+ "finish_reason": "stop",
220
+ "index": 21,
221
+ "message": {
222
+ "content": "theorem my_favorite_theorem (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype F) (hF1 : Fintype.card F = n) : Finite (E.n_torsion n) ∧ (E.n_torsion n).card = n ^ 2 ",
223
+ "role": "assistant",
224
+ "tool_calls": null,
225
+ "function_call": null
226
+ }
227
+ },
228
+ {
229
+ "finish_reason": "stop",
230
+ "index": 22,
231
+ "message": {
232
+ "content": "def SeparablyClosed (F : Type*) [Field F] : Prop :=\n ",
233
+ "role": "assistant",
234
+ "tool_calls": null,
235
+ "function_call": null
236
+ }
237
+ },
238
+ {
239
+ "finish_reason": "stop",
240
+ "index": 23,
241
+ "message": {
242
+ "content": "theorem my_favorite_theorem (k : Type u) [Field k] (E : EllipticCurve k)\n (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype F)\n (hF1 : Fintype.card F = n) :\n let G := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n [inst : NeZero k] [inst : Fintype G] [inst : Group G] [inst : AddCommGroup G] [inst : Module k G]\n G.fintype.card = n ^ 2 ",
243
+ "role": "assistant",
244
+ "tool_calls": null,
245
+ "function_call": null
246
+ }
247
+ },
248
+ {
249
+ "finish_reason": "stop",
250
+ "index": 24,
251
+ "message": {
252
+ "content": "noncomputable def n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\nnoncomputable def ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) : Module (ZMod n) A ",
253
+ "role": "assistant",
254
+ "tool_calls": null,
255
+ "function_call": null
256
+ }
257
+ },
258
+ {
259
+ "finish_reason": "stop",
260
+ "index": 25,
261
+ "message": {
262
+ "content": "noncomputable def E_n_torsion (E : EllipticCurve k) (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\nnoncomputable def ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :\n Module (ZMod n) A :=\n ",
263
+ "role": "assistant",
264
+ "tool_calls": null,
265
+ "function_call": null
266
+ }
267
+ },
268
+ {
269
+ "finish_reason": "stop",
270
+ "index": 26,
271
+ "message": {
272
+ "content": "def SeparatelyClosedField (F : Type u) : Prop := ",
273
+ "role": "assistant",
274
+ "tool_calls": null,
275
+ "function_call": null
276
+ }
277
+ },
278
+ {
279
+ "finish_reason": "stop",
280
+ "index": 27,
281
+ "message": {
282
+ "content": "open Fintype Set Real Ideal Polynomial\nopen scoped BigOperators\n\ntheorem my_favorite_theorem {k : Type u} [Field k] [IsSepClosed k]\n (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (hn1 : n ≠ 1) :\n ∃ F : Fintype (E.n_torsion n), F.card = n ^ 2 ∧\n (E.n_torsion n : Type*)[AddCommGroup (E.n_torsion n)] = AddCommGroup.mk\n (E.n_torsion n : Type*)[Module (ZMod n) (E.n_torsion n)] = Module.mk\n (E.n_torsion n : Type*)[Fintype (E.n_torsion n)] = Fintype.mk ",
283
+ "role": "assistant",
284
+ "tool_calls": null,
285
+ "function_call": null
286
+ }
287
+ },
288
+ {
289
+ "finish_reason": "stop",
290
+ "index": 28,
291
+ "message": {
292
+ "content": "noncomputable def SeparatelyClosed (F : Type) [Field F] : Prop := ",
293
+ "role": "assistant",
294
+ "tool_calls": null,
295
+ "function_call": null
296
+ }
297
+ },
298
+ {
299
+ "finish_reason": "stop",
300
+ "index": 29,
301
+ "message": {
302
+ "content": "noncomputable def curve_n_torsion (E : WeierstrassCurve k) (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\ntheorem EllipticCurve.n_torsion_finite (n : ℕ) (hn : 0 < n) (E : WeierstrassCurve k) : Finite (curve_n_torsion E n) ",
303
+ "role": "assistant",
304
+ "tool_calls": null,
305
+ "function_call": null
306
+ }
307
+ },
308
+ {
309
+ "finish_reason": "stop",
310
+ "index": 30,
311
+ "message": {
312
+ "content": "theorem my_favorite_theorem (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (h : IsSepClosed k) :\n IsAddCommGroup (E.n_torsion n) ∧ Finite (E.n_torsion n) ∧ (E.n_torsion n).ncard = n ^ 2 ",
313
+ "role": "assistant",
314
+ "tool_calls": null,
315
+ "function_call": null
316
+ }
317
+ },
318
+ {
319
+ "finish_reason": "stop",
320
+ "index": 31,
321
+ "message": {
322
+ "content": "noncomputable def curve_group (E : EllipticCurve k) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) 1\n\ndef curve_multiplication (E : EllipticCurve k) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) 2\n\ndef curve_add (E : EllipticCurve k) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) 3\n\nnoncomputable def curve_n_torsion (n : ℕ) (E : EllipticCurve k) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\ntheorem my_favorite_theorem (n : ℕ) (hn : 0 < n) (k : Type) [Field k] (E : EllipticCurve k) [IsSepClosed k] (hE : Nonempty (E.toWeierstrassCurve ⟮k⟯)) (hE1 : ∀ x : E.toWeierstrassCurve ⟮k⟯, x ^ n = 1) : Finite (curve_n_torsion n E) ∧ (curve_n_torsion n E).ncard = n ^ 2 ",
323
+ "role": "assistant",
324
+ "tool_calls": null,
325
+ "function_call": null
326
+ }
327
+ },
328
+ {
329
+ "finish_reason": "stop",
330
+ "index": 32,
331
+ "message": {
332
+ "content": "theorem my_favorite_theorem (n : ℕ) (hn : 0 < n) (F : Type*) [Field F]\n [IsSepClosed F] (hF : n ≠ 0) (E : ECurve F) :\n Finite (EPoints F)[n]! ∧\n (EPoints F)[n]!.ncard = n ^ 2 ",
333
+ "role": "assistant",
334
+ "tool_calls": null,
335
+ "function_call": null
336
+ }
337
+ },
338
+ {
339
+ "finish_reason": "stop",
340
+ "index": 33,
341
+ "message": {
342
+ "content": "theorem my_favorite_theorem (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Nonempty (Fˣ)) (E : EllipticCurve F) :\n Nonempty (E.toWeierstrassCurve Fˣ) ∧ Fintype (E.toWeierstrassCurve Fˣ) ∧ Fintype.card (E.toWeierstrassCurve Fˣ) = n ^ 2 ",
343
+ "role": "assistant",
344
+ "tool_calls": null,
345
+ "function_call": null
346
+ }
347
+ },
348
+ {
349
+ "finish_reason": "stop",
350
+ "index": 34,
351
+ "message": {
352
+ "content": "noncomputable def SeparallyClosedField (F : Type*) [Field F] : Prop := ",
353
+ "role": "assistant",
354
+ "tool_calls": null,
355
+ "function_call": null
356
+ }
357
+ },
358
+ {
359
+ "finish_reason": "stop",
360
+ "index": 35,
361
+ "message": {
362
+ "content": "def SeparatelyClosed (F : Type*) [Field F] : Prop := ",
363
+ "role": "assistant",
364
+ "tool_calls": null,
365
+ "function_call": null
366
+ }
367
+ },
368
+ {
369
+ "finish_reason": "stop",
370
+ "index": 36,
371
+ "message": {
372
+ "content": "def SeparablyClosed (F : Type*) [Field F] : Prop := ",
373
+ "role": "assistant",
374
+ "tool_calls": null,
375
+ "function_call": null
376
+ }
377
+ },
378
+ {
379
+ "finish_reason": "stop",
380
+ "index": 37,
381
+ "message": {
382
+ "content": "open Fintype Set Real Ideal Polynomial\nopen scoped BigOperators\n\ntheorem EllipticCurve.n_torsion_group (n : ℕ) (hn : 0 < n) (k : Type*) [Field k] (E : EllipticCurve k) [IsSepClosed k] (hE : Nonempty (E.toWeierstrassCurve ⟮k⟯)) : IsGroup (E.toWeierstrassCurve ⟮k⟯)ˣ ∧ ∀ x : E.toWeierstrassCurve ⟮k⟯, x ^ n = 1 ",
383
+ "role": "assistant",
384
+ "tool_calls": null,
385
+ "function_call": null
386
+ }
387
+ },
388
+ {
389
+ "finish_reason": "stop",
390
+ "index": 38,
391
+ "message": {
392
+ "content": "theorem my_favorite_theorem (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : 0 < n) :\n Nonempty (E n_torsion) ∧\n ∃ fin : Fintype (E n_torsion), fin.card = n ^ 2 ",
393
+ "role": "assistant",
394
+ "tool_calls": null,
395
+ "function_call": null
396
+ }
397
+ },
398
+ {
399
+ "finish_reason": "stop",
400
+ "index": 39,
401
+ "message": {
402
+ "content": "def SeparatelyClosed (F : Type u) [Field F] : Prop := ",
403
+ "role": "assistant",
404
+ "tool_calls": null,
405
+ "function_call": null
406
+ }
407
+ },
408
+ {
409
+ "finish_reason": "stop",
410
+ "index": 40,
411
+ "message": {
412
+ "content": "def SeparatelyClosed (F : Type) : Prop ",
413
+ "role": "assistant",
414
+ "tool_calls": null,
415
+ "function_call": null
416
+ }
417
+ },
418
+ {
419
+ "finish_reason": "stop",
420
+ "index": 41,
421
+ "message": {
422
+ "content": "noncomputable def other_544869 (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\nabbrev EllipticCurve.n_torsion (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\nnoncomputable def ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :\n Module (ZMod n) A :=\n ",
423
+ "role": "assistant",
424
+ "tool_calls": null,
425
+ "function_call": null
426
+ }
427
+ },
428
+ {
429
+ "finish_reason": "stop",
430
+ "index": 42,
431
+ "message": {
432
+ "content": "open Fintype Subgroup Set Polynomial Ideal\nopen scoped BigOperators\n\ntheorem my_favorite_theorem {n : ℕ} (hn : 0 < n) (k : Type*) [Field k] (hk : IsSepClosed k)\n (hk1 : Nonempty k) (E : EllipticCurve k) :\n Finite (E.toWeierstrassCurve k) ∧ card (E.toWeierstrassCurve k) = n^2 :=\n",
433
+ "role": "assistant",
434
+ "tool_calls": null,
435
+ "function_call": null
436
+ }
437
+ },
438
+ {
439
+ "finish_reason": "stop",
440
+ "index": 43,
441
+ "message": {
442
+ "content": "def SeparatelyClosed (F : Type*) [Field F] : Prop := ",
443
+ "role": "assistant",
444
+ "tool_calls": null,
445
+ "function_call": null
446
+ }
447
+ },
448
+ {
449
+ "finish_reason": "stop",
450
+ "index": 44,
451
+ "message": {
452
+ "content": "noncomputable def curve_n_torsion (E : EllipticCurve k) (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\ntheorem EllipticCurve.n_torsion_finite (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n Finite (curve_n_torsion E n) ∧ curve_n_torsion E n =+* curve_n_torsion E n ",
453
+ "role": "assistant",
454
+ "tool_calls": null,
455
+ "function_call": null
456
+ }
457
+ },
458
+ {
459
+ "finish_reason": "stop",
460
+ "index": 45,
461
+ "message": {
462
+ "content": "theorem my_favorite_theorem (k : Type*) [Field k] (E : ECurve k) (n : ℕ) (hn : n ≠ 0)\n (hSepClosed : IsSepClosed k) : Nonempty (E.points k ⧸ span ({0} : Set k)) ∧\n (E.points k ⧸ span ({0} : Set k)).Finite ∧\n (E.points k ⧸ span ({0} : Set k)).ncard = n ^ 2 ",
463
+ "role": "assistant",
464
+ "tool_calls": null,
465
+ "function_call": null
466
+ }
467
+ },
468
+ {
469
+ "finish_reason": "stop",
470
+ "index": 46,
471
+ "message": {
472
+ "content": "def SeparablyClosed (F : Type*) [Field F] : Prop :=\n SeparableAlgebra.Fintype Fˣ\n\ndef EllipticCurve.n_torsion (E : EllipticCurve k) (n : ℕ) : Type u := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n\ndef ZMod.module (A : Type*) [AddCommGroup A] (n : ℕ) (hn : ∀ a : A, n • a = 0) :\n Module (ZMod n) A :=\n ",
473
+ "role": "assistant",
474
+ "tool_calls": null,
475
+ "function_call": null
476
+ }
477
+ },
478
+ {
479
+ "finish_reason": "stop",
480
+ "index": 47,
481
+ "message": {
482
+ "content": "noncomputable def SeparablyClosed {F : Type u} [Field F] : Prop := ",
483
+ "role": "assistant",
484
+ "tool_calls": null,
485
+ "function_call": null
486
+ }
487
+ },
488
+ {
489
+ "finish_reason": "stop",
490
+ "index": 48,
491
+ "message": {
492
+ "content": "def SeparablyClosed (F : Type*) [Field F] : Prop := ",
493
+ "role": "assistant",
494
+ "tool_calls": null,
495
+ "function_call": null
496
+ }
497
+ },
498
+ {
499
+ "finish_reason": "stop",
500
+ "index": 49,
501
+ "message": {
502
+ "content": "def separablyClosedField (F : Type*) [Field F] : Prop := ",
503
+ "role": "assistant",
504
+ "tool_calls": null,
505
+ "function_call": null
506
+ }
507
+ }
508
+ ],
509
+ "usage": {
510
+ "completion_tokens": 4904,
511
+ "prompt_tokens": 643,
512
+ "total_tokens": 5547,
513
+ "completion_tokens_details": null,
514
+ "prompt_tokens_details": null
515
+ },
516
+ "service_tier": null,
517
+ "prompt_logprobs": null
518
+ }
results/FLT/kiminaembedbeta/20250604_090129/EllipticCurve.n_torsion_card/validity_results.jsonl ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
2
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n Finite (n_torsion E n) ∧ (n_torsion E n).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
3
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
4
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype Fˣ) (E : Ecurve F) : Fintype (E.points F)ˣ := by sorry", "well_typed": false, "beq_result": null, "error": null}
5
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (E : EllipticCurve k) (n : ℕ) : Prop := by sorry", "well_typed": false, "beq_result": null, "error": null}
6
+ {"lean_code": "theorem EllipticCurve.n_torsion_card {k : Type u} [Field k] [SepClosed k] (E : Type*) [Field E] [EllipticCurve E] [IsSepClosed E k] (n : ℕ) (hn : 0 < n) :\n Finite (curve_torsor E k n) ∧ curve_torsor E k n.encard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
7
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
8
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
9
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] (n : ℕ) (hn : 0 < n) (hF : IsSepClosed F) (hF1 : Fintype F)\n (hF2 : Nonempty F) (E : EllipticCurve F) :\n curve_n_torsion_finite F n ∧ curve_n_torsion_add_group F n = (ZMod n)ˣ := by sorry", "well_typed": false, "beq_result": null, "error": null}
10
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : n > 0)\n (E : Affine WeierstrassCurve F) (hE : E.toWeierstrassCurve.natDegree = 2) :\n ∃ g : Fintype (E.points ⧸ span ({1} : Set (E.points))), (E.points ⧸ span ({1} : Set (E.points))) = g ∧\n Fintype.card (E.points ⧸ span ({1} : Set (E.points))) = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
11
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n IsSepClosed k → (E.n_torsion n).Finite ∧ (E.n_torsion n).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
12
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F]\n (hF : Fintype F) (hF1 : Fintype.card F = n) (E : Affine E) :\n (E.points.filter (fun x => x ^ n = 1)).Finite ∧\n Fintype ((E.points.filter (fun x => x ^ n = 1)) : Set E.points ) ∧\n Fintype.card ((E.points.filter (fun x => x ^ n = 1)) : Set E.points ) = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
13
+ {"lean_code": "theorem EllipticCurve.n_torsion_card {F : Type} [Field F] [IsSepClosed F] (hF : Nonempty Fˣ) (E : EllipticCurve F) (n : ℕ) (hn : 0 < n) :\n Nonempty (E.points ⧸ span ({0} : Set (E.points)))ˣ ∧\n (E.points ⧸ span ({0} : Set (E.points)))ˣ.ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
14
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
15
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
16
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ)\n (hn : 0 < n)\n (F : Type*) [Field F]\n (hF : IsSepClosed F)\n (hF1 : Nonempty (Fˣ))\n (E : AffineCurse F)\n (hE : E.Nonempty)\n : Finite (E.points.filter (fun x => x ^ n = 1)) ∧ (E.points.filter (fun x => x ^ n = 1)).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
17
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
18
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F]\n [IsSepClosed F] (hF : Fintype F) (E : Type*) [EllipticCurve F E]\n (hE : IsCyclic Eˣ) :\n Nonempty (E n_torsion) ∧ Fintype (E n_torsion) ∧\n (E n_torsion).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
19
+ {"lean_code": "theorem EllipticCurve.n_torsion_card {k : Type u} [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (F : SeparablyClosed k) [Field F] (hF : Fintype F) (hF1 : card F = n) :\n Fintype (E.toWeierstrassCurve F 0) ∧ @card (E.toWeierstrassCurve F 0) = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
20
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [SeparableClosed F] (hF : n ≠ 0) (E : Type*) [EllipticCurve E] :\n Finite (curve_points (E.n_torsion n)) ∧ curve_points (E.n_torsion n).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
21
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : 0 < n) (hn1 : n ≠ 1) (E : EllipticCurve F) :\n Finite (E.toWeierstrassCurve n_torsion) ∧ E.toWeierstrassCurve n_torsion.ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
22
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype F) (hF1 : Fintype.card F = n) : Finite (E.n_torsion n) ∧ (E.n_torsion n).card = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
23
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
24
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k)\n (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Fintype F)\n (hF1 : Fintype.card F = n) :\n let G := Submodule.torsionBy ℤ (E.toWeierstrassCurve ⟮k⟯) n\n [inst : NeZero k] [inst : Fintype G] [inst : Group G] [inst : AddCommGroup G] [inst : Module k G]\n G.fintype.card = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
25
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
26
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
27
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
28
+ {"lean_code": "theorem EllipticCurve.n_torsion_card {k : Type u} [Field k] [IsSepClosed k]\n (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (hn1 : n ≠ 1) :\n ∃ F : Fintype (E.n_torsion n), F.card = n ^ 2 ∧\n (E.n_torsion n : Type*)[AddCommGroup (E.n_torsion n)] = AddCommGroup.mk\n (E.n_torsion n : Type*)[Module (ZMod n) (E.n_torsion n)] = Module.mk\n (E.n_torsion n : Type*)[Fintype (E.n_torsion n)] = Fintype.mk := by sorry", "well_typed": false, "beq_result": null, "error": null}
29
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
30
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (E : WeierstrassCurve k) : Finite (curve_n_torsion E n) := by sorry", "well_typed": false, "beq_result": null, "error": null}
31
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (k : Type u) [Field k] (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) (h : IsSepClosed k) :\n IsAddCommGroup (E.n_torsion n) ∧ Finite (E.n_torsion n) ∧ (E.n_torsion n).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
32
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (k : Type) [Field k] (E : EllipticCurve k) [IsSepClosed k] (hE : Nonempty (E.toWeierstrassCurve ⟮k⟯)) (hE1 : ∀ x : E.toWeierstrassCurve ⟮k⟯, x ^ n = 1) : Finite (curve_n_torsion n E) ∧ (curve_n_torsion n E).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
33
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F]\n [IsSepClosed F] (hF : n ≠ 0) (E : ECurve F) :\n Finite (EPoints F)[n]! ∧\n (EPoints F)[n]!.ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
34
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (F : Type*) [Field F] [IsSepClosed F] (hF : Nonempty (Fˣ)) (E : EllipticCurve F) :\n Nonempty (E.toWeierstrassCurve Fˣ) ∧ Fintype (E.toWeierstrassCurve Fˣ) ∧ Fintype.card (E.toWeierstrassCurve Fˣ) = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
35
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
36
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
37
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
38
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (n : ℕ) (hn : 0 < n) (k : Type*) [Field k] (E : EllipticCurve k) [IsSepClosed k] (hE : Nonempty (E.toWeierstrassCurve ⟮k⟯)) : IsGroup (E.toWeierstrassCurve ⟮k⟯)ˣ ∧ ∀ x : E.toWeierstrassCurve ⟮k⟯, x ^ n = 1 := by sorry", "well_typed": false, "beq_result": null, "error": null}
39
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (F : Type*) [Field F] [IsSepClosed F] (n : ℕ) (hn : 0 < n) :\n Nonempty (E n_torsion) ∧\n ∃ fin : Fintype (E n_torsion), fin.card = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
40
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
41
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
42
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
43
+ {"lean_code": "theorem EllipticCurve.n_torsion_card {n : ℕ} (hn : 0 < n) (k : Type*) [Field k] (hk : IsSepClosed k)\n (hk1 : Nonempty k) (E : EllipticCurve k) :\n Finite (E.toWeierstrassCurve k) ∧ card (E.toWeierstrassCurve k) = n^2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
44
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
45
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (E : EllipticCurve k) (n : ℕ) (hn : 0 < n) :\n Finite (curve_n_torsion E n) ∧ curve_n_torsion E n =+* curve_n_torsion E n := by sorry", "well_typed": false, "beq_result": null, "error": null}
46
+ {"lean_code": "theorem EllipticCurve.n_torsion_card (k : Type*) [Field k] (E : ECurve k) (n : ℕ) (hn : n ≠ 0)\n (hSepClosed : IsSepClosed k) : Nonempty (E.points k ⧸ span ({0} : Set k)) ∧\n (E.points k ⧸ span ({0} : Set k)).Finite ∧\n (E.points k ⧸ span ({0} : Set k)).ncard = n ^ 2 := by sorry", "well_typed": false, "beq_result": null, "error": null}
47
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
48
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
49
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}
50
+ {"lean_code": null, "well_typed": false, "beq_result": null, "error": null}