Skip to content

Commit 11cedf3

Browse files
committed
chore(AlgebraicGeometry/EllipticCurve/*): refactor VariableChange (#23217)
Drop certain definitions in `VariableChange` in favor of mathlib's built-in notation: - `VariableChange.id` -> `(1 : VariableChange R)` - `VariableChange.comp C C'` -> `C * C'` - `VariableChange.inv C` -> `C⁻¹` - `W.variableChange C` -> `C • W`
1 parent 7d8506d commit 11cedf3

File tree

4 files changed

+180
-176
lines changed

4 files changed

+180
-176
lines changed

Mathlib/AlgebraicGeometry/EllipticCurve/Affine.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ lemma equation_zero : W'.Equation 0 0 ↔ W'.a₆ = 0 := by
202202
rw [Equation, evalEval_polynomial_zero, neg_eq_zero]
203203

204204
lemma equation_iff_variableChange (x y : R) :
205-
W'.Equation x y ↔ (W'.variableChange ⟨1, x, 0, y⟩).toAffine.Equation 0 0 := by
205+
W'.Equation x y ↔ (VariableChange.mk 1 x 0 y • W').toAffine.Equation 0 0 := by
206206
rw [equation_iff', ← neg_eq_zero, equation_zero, variableChange_a₆, inv_one, Units.val_one]
207207
congr! 1
208208
ring1
@@ -271,10 +271,10 @@ lemma nonsingular_zero : W'.Nonsingular 0 0 ↔ W'.a₆ = 0 ∧ (W'.a₃ ≠ 0
271271
or_comm]
272272

273273
lemma nonsingular_iff_variableChange (x y : R) :
274-
W'.Nonsingular x y ↔ (W'.variableChange ⟨1, x, 0, y⟩).toAffine.Nonsingular 0 0 := by
274+
W'.Nonsingular x y ↔ (VariableChange.mk 1 x 0 y • W').toAffine.Nonsingular 0 0 := by
275275
rw [nonsingular_iff', equation_iff_variableChange, equation_zero, ← neg_ne_zero, or_comm,
276276
nonsingular_zero, variableChange_a₃, variableChange_a₄, inv_one, Units.val_one]
277-
simp only [variableChange]
277+
simp only [variableChange_def]
278278
congr! 3 <;> ring1
279279

280280
private lemma equation_zero_iff_nonsingular_zero_of_Δ_ne_zero (hΔ : W'.Δ ≠ 0) :

Mathlib/AlgebraicGeometry/EllipticCurve/IsomOfJ.lean

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ variable [CharP F 2]
3333
omit [E.IsElliptic] [E'.IsElliptic] in
3434
private lemma exists_variableChange_of_char_two_of_j_ne_zero
3535
[E.IsCharTwoJNeZeroNF] [E'.IsCharTwoJNeZeroNF] (heq : E.a₆ = E'.a₆) :
36-
∃ C : VariableChange F, E.variableChange C = E' := by
36+
∃ C : VariableChange F, C • E = E' := by
3737
obtain ⟨s, hs⟩ := IsSepClosed.exists_root_C_mul_X_pow_add_C_mul_X_add_C' 2 2
3838
1 1 (E.a₂ + E'.a₂) (by norm_num) (by norm_num) one_ne_zero
3939
use ⟨1, 0, s, 0
@@ -51,8 +51,7 @@ private lemma exists_variableChange_of_char_two_of_j_ne_zero
5151
ring1
5252

5353
private lemma exists_variableChange_of_char_two_of_j_eq_zero
54-
[E.IsCharTwoJEqZeroNF] [E'.IsCharTwoJEqZeroNF] :
55-
∃ C : VariableChange F, E.variableChange C = E' := by
54+
[E.IsCharTwoJEqZeroNF] [E'.IsCharTwoJEqZeroNF] : ∃ C : VariableChange F, C • E = E' := by
5655
have ha₃ := E.Δ'.ne_zero
5756
rw [E.coe_Δ', Δ_of_isCharTwoJEqZeroNF_of_char_two, pow_ne_zero_iff (Nat.succ_ne_zero _)] at ha₃
5857
have ha₃' := E'.Δ'.ne_zero
@@ -85,29 +84,26 @@ private lemma exists_variableChange_of_char_two_of_j_eq_zero
8584
linear_combination ht - (t ^ 2 + E.a₃ * t) * CharP.cast_eq_zero F 2
8685

8786
private lemma exists_variableChange_of_char_two (heq : E.j = E'.j) :
88-
∃ C : VariableChange F, E.variableChange C = E' := by
87+
∃ C : VariableChange F, C • E = E' := by
8988
obtain ⟨C, _ | _⟩ := E.exists_variableChange_isCharTwoNF
9089
· obtain ⟨C', _ | _⟩ := E'.exists_variableChange_isCharTwoNF
9190
· simp_rw [← variableChange_j E C, ← variableChange_j E' C',
9291
j_of_isCharTwoJNeZeroNF_of_char_two, one_div, inv_inj] at heq
9392
obtain ⟨C'', hC⟩ := exists_variableChange_of_char_two_of_j_ne_zero _ _ heq
94-
use (C'.inv.comp C'').comp C
95-
rw [variableChange_comp, variableChange_comp, hC, ← variableChange_comp,
96-
VariableChange.comp_left_inv, variableChange_id]
97-
· have h := (E.variableChange C).j_ne_zero_of_isCharTwoJNeZeroNF_of_char_two
93+
use C'⁻¹ * C'' * C
94+
rw [mul_smul, mul_smul, hC, ← mul_smul, inv_mul_cancel, one_smul]
95+
· have h := (C • E).j_ne_zero_of_isCharTwoJNeZeroNF_of_char_two
9896
rw [variableChange_j, heq, ← variableChange_j E' C',
9997
j_of_isCharTwoJEqZeroNF_of_char_two] at h
10098
exact False.elim (h rfl)
10199
· obtain ⟨C', _ | _⟩ := E'.exists_variableChange_isCharTwoNF
102-
· have h := (E'.variableChange C').j_ne_zero_of_isCharTwoJNeZeroNF_of_char_two
100+
· have h := (C' • E').j_ne_zero_of_isCharTwoJNeZeroNF_of_char_two
103101
rw [variableChange_j, ← heq, ← variableChange_j E C,
104102
j_of_isCharTwoJEqZeroNF_of_char_two] at h
105103
exact False.elim (h rfl)
106-
· obtain ⟨C'', hC⟩ := exists_variableChange_of_char_two_of_j_eq_zero
107-
(E.variableChange C) (E'.variableChange C')
108-
use (C'.inv.comp C'').comp C
109-
rw [variableChange_comp, variableChange_comp, hC, ← variableChange_comp,
110-
VariableChange.comp_left_inv, variableChange_id]
104+
· obtain ⟨C'', hC⟩ := exists_variableChange_of_char_two_of_j_eq_zero (C • E) (C' • E')
105+
use C'⁻¹ * C'' * C
106+
rw [mul_smul, mul_smul, hC, ← mul_smul, inv_mul_cancel, one_smul]
111107

112108
end CharTwo
113109

@@ -117,7 +113,7 @@ variable [CharP F 3]
117113

118114
private lemma exists_variableChange_of_char_three_of_j_ne_zero
119115
[E.IsCharThreeJNeZeroNF] [E'.IsCharThreeJNeZeroNF] (heq : E.j = E'.j) :
120-
∃ C : VariableChange F, E.variableChange C = E' := by
116+
∃ C : VariableChange F, C • E = E' := by
121117
have h := E.Δ'.ne_zero
122118
rw [E.coe_Δ', Δ_of_isCharThreeJNeZeroNF_of_char_three, mul_ne_zero_iff, neg_ne_zero,
123119
pow_ne_zero_iff three_ne_zero] at h
@@ -153,8 +149,7 @@ private lemma exists_variableChange_of_char_three_of_j_ne_zero
153149
linear_combination heq
154150

155151
private lemma exists_variableChange_of_char_three_of_j_eq_zero
156-
[E.IsShortNF] [E'.IsShortNF] :
157-
∃ C : VariableChange F, E.variableChange C = E' := by
152+
[E.IsShortNF] [E'.IsShortNF] : ∃ C : VariableChange F, C • E = E' := by
158153
have ha₄ := E.Δ'.ne_zero
159154
rw [E.coe_Δ', Δ_of_isShortNF_of_char_three, neg_ne_zero, pow_ne_zero_iff three_ne_zero] at ha₄
160155
have ha₄' := E'.Δ'.ne_zero
@@ -187,34 +182,31 @@ private lemma exists_variableChange_of_char_three_of_j_eq_zero
187182
linear_combination hr
188183

189184
private lemma exists_variableChange_of_char_three (heq : E.j = E'.j) :
190-
∃ C : VariableChange F, E.variableChange C = E' := by
185+
∃ C : VariableChange F, C • E = E' := by
191186
obtain ⟨C, _ | _⟩ := E.exists_variableChange_isCharThreeNF
192187
· obtain ⟨C', _ | _⟩ := E'.exists_variableChange_isCharThreeNF
193188
· rw [← variableChange_j E C, ← variableChange_j E' C'] at heq
194189
obtain ⟨C'', hC⟩ := exists_variableChange_of_char_three_of_j_ne_zero _ _ heq
195-
use (C'.inv.comp C'').comp C
196-
rw [variableChange_comp, variableChange_comp, hC, ← variableChange_comp,
197-
VariableChange.comp_left_inv, variableChange_id]
198-
· have h := (E.variableChange C).j_ne_zero_of_isCharThreeJNeZeroNF_of_char_three
190+
use C'⁻¹ * C'' * C
191+
rw [mul_smul, mul_smul, hC, ← mul_smul, inv_mul_cancel, one_smul]
192+
· have h := (C • E).j_ne_zero_of_isCharThreeJNeZeroNF_of_char_three
199193
rw [variableChange_j, heq, ← variableChange_j E' C', j_of_isShortNF_of_char_three] at h
200194
exact False.elim (h rfl)
201195
· obtain ⟨C', _ | _⟩ := E'.exists_variableChange_isCharThreeNF
202-
· have h := (E'.variableChange C').j_ne_zero_of_isCharThreeJNeZeroNF_of_char_three
196+
· have h := (C' • E').j_ne_zero_of_isCharThreeJNeZeroNF_of_char_three
203197
rw [variableChange_j, ← heq, ← variableChange_j E C, j_of_isShortNF_of_char_three] at h
204198
exact False.elim (h rfl)
205-
· obtain ⟨C'', hC⟩ := exists_variableChange_of_char_three_of_j_eq_zero
206-
(E.variableChange C) (E'.variableChange C')
207-
use (C'.inv.comp C'').comp C
208-
rw [variableChange_comp, variableChange_comp, hC, ← variableChange_comp,
209-
VariableChange.comp_left_inv, variableChange_id]
199+
· obtain ⟨C'', hC⟩ := exists_variableChange_of_char_three_of_j_eq_zero (C • E) (C' • E')
200+
use C'⁻¹ * C'' * C
201+
rw [mul_smul, mul_smul, hC, ← mul_smul, inv_mul_cancel, one_smul]
210202

211203
end CharThree
212204

213205
section CharNeTwoOrThree
214206

215207
private lemma exists_variableChange_of_char_ne_two_or_three
216208
{p : ℕ} [CharP F p] (hchar2 : p ≠ 2) (hchar3 : p ≠ 3) (heq : E.j = E'.j) :
217-
∃ C : VariableChange F, E.variableChange C = E' := by
209+
∃ C : VariableChange F, C • E = E' := by
218210
replace hchar2 : (2 : F) ≠ 0 := CharP.cast_ne_zero_of_ne_of_prime F Nat.prime_two hchar2
219211
replace hchar3 : (3 : F) ≠ 0 := CharP.cast_ne_zero_of_ne_of_prime F Nat.prime_three hchar3
220212
haveI := NeZero.mk hchar2
@@ -232,13 +224,12 @@ private lemma exists_variableChange_of_char_ne_two_or_three
232224
· obtain ⟨C, hE⟩ := E.exists_variableChange_isShortNF
233225
rw [← variableChange_j E C] at heq
234226
obtain ⟨C', hC⟩ := this _ heq hE
235-
exact ⟨C'.comp C, by rwa [variableChange_comp]⟩
227+
exact ⟨C' * C, by rwa [mul_smul]⟩
236228
wlog _ : E'.IsShortNF generalizing E'
237229
· obtain ⟨C, hE'⟩ := E'.exists_variableChange_isShortNF
238230
rw [← variableChange_j E' C] at heq
239231
obtain ⟨C', hC⟩ := this _ heq hE'
240-
exact ⟨C.inv.comp C', by rw [variableChange_comp, hC, ← variableChange_comp,
241-
VariableChange.comp_left_inv, variableChange_id]⟩
232+
exact ⟨C⁻¹ * C', by rw [mul_smul, hC, ← mul_smul, inv_mul_cancel, one_smul]⟩
242233
simp_rw [j, Units.val_inv_eq_inv_val, inv_mul_eq_div,
243234
div_eq_div_iff E.Δ'.ne_zero E'.Δ'.ne_zero, coe_Δ', Δ_of_isShortNF, c₄_of_isShortNF] at heq
244235
replace heq : E.a₄ ^ 3 * E'.a₆ ^ 2 = E'.a₄ ^ 3 * E.a₆ ^ 2 := by
@@ -335,8 +326,7 @@ end CharNeTwoOrThree
335326
/-- If there are two elliptic curves with the same `j`-invariants defined over a
336327
separably closed field, then there exists a change of variables over that field which change
337328
one curve into another. -/
338-
theorem exists_variableChange_of_j_eq (heq : E.j = E'.j) :
339-
∃ C : VariableChange F, E.variableChange C = E' := by
329+
theorem exists_variableChange_of_j_eq (heq : E.j = E'.j) : ∃ C : VariableChange F, C • E = E' := by
340330
obtain ⟨p, _⟩ := CharP.exists F
341331
by_cases hchar2 : p = 2
342332
· subst hchar2

Mathlib/AlgebraicGeometry/EllipticCurve/NormalForms.lean

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,10 @@ a normal form of characteristic ≠ 2, provided that 2 is invertible in the ring
162162
@[simps]
163163
def toCharNeTwoNF : VariableChange R := ⟨1, 0, ⅟2 * -W.a₁, ⅟2 * -W.a₃⟩
164164

165-
instance toCharNeTwoNF_spec : (W.variableChange W.toCharNeTwoNF).IsCharNeTwoNF := by
165+
instance toCharNeTwoNF_spec : (W.toCharNeTwoNF • W).IsCharNeTwoNF := by
166166
constructor <;> simp
167167

168-
theorem exists_variableChange_isCharNeTwoNF :
169-
∃ C : VariableChange R, (W.variableChange C).IsCharNeTwoNF :=
168+
theorem exists_variableChange_isCharNeTwoNF : ∃ C : VariableChange R, (C • W).IsCharNeTwoNF :=
170169
⟨_, W.toCharNeTwoNF_spec⟩
171170

172171
end VariableChange
@@ -262,14 +261,13 @@ variable [Invertible (2 : R)] [Invertible (3 : R)]
262261
a short normal form, provided that 2 and 3 are invertible in the ring.
263262
It is the composition of an explicit change of variables with `WeierstrassCurve.toCharNeTwoNF`. -/
264263
def toShortNF : VariableChange R :=
265-
.comp 1, ⅟3 * -(W.variableChange W.toCharNeTwoNF).a₂, 0, 0⟩ W.toCharNeTwoNF
264+
1, ⅟3 * -(W.toCharNeTwoNF • W).a₂, 0, 0 * W.toCharNeTwoNF
266265

267-
instance toShortNF_spec : (W.variableChange W.toShortNF).IsShortNF := by
268-
rw [toShortNF, variableChange_comp]
266+
instance toShortNF_spec : (W.toShortNF • W).IsShortNF := by
267+
rw [toShortNF, mul_smul]
269268
constructor <;> simp
270269

271-
theorem exists_variableChange_isShortNF :
272-
∃ C : VariableChange R, (W.variableChange C).IsShortNF :=
270+
theorem exists_variableChange_isShortNF : ∃ C : VariableChange R, (C • W).IsShortNF :=
273271
⟨_, W.toShortNF_spec⟩
274272

275273
end VariableChange
@@ -392,12 +390,11 @@ def toShortNFOfCharThree : VariableChange R :=
392390
letI : Invertible (2 : R) := ⟨2, h, h⟩
393391
W.toCharNeTwoNF
394392

395-
lemma toShortNFOfCharThree_a₂ : (W.variableChange W.toShortNFOfCharThree).a₂ = W.b₂ := by
393+
lemma toShortNFOfCharThree_a₂ : (W.toShortNFOfCharThree • W).a₂ = W.b₂ := by
396394
simp_rw [toShortNFOfCharThree, toCharNeTwoNF, variableChange_a₂, inv_one, Units.val_one, b₂]
397395
linear_combination (-W.a₂ - W.a₁ ^ 2) * CharP.cast_eq_zero R 3
398396

399-
theorem toShortNFOfCharThree_spec (hb₂ : W.b₂ = 0) :
400-
(W.variableChange W.toShortNFOfCharThree).IsShortNF := by
397+
theorem toShortNFOfCharThree_spec (hb₂ : W.b₂ = 0) : (W.toShortNFOfCharThree • W).IsShortNF := by
401398
have h : (2 : R) * 2 = 1 := by linear_combination CharP.cast_eq_zero R 3
402399
letI : Invertible (2 : R) := ⟨2, h, h⟩
403400
have H := W.toCharNeTwoNF_spec
@@ -412,15 +409,15 @@ there is an explicit change of variables of it to `WeierstrassCurve.IsCharThreeN
412409
It is the composition of an explicit change of variables with
413410
`WeierstrassCurve.toShortNFOfCharThree`. -/
414411
def toCharThreeNF : VariableChange F :=
415-
.comp 1, (W.variableChange W.toShortNFOfCharThree).a₄ /
416-
(W.variableChange W.toShortNFOfCharThree).a₂, 0, 0⟩ W.toShortNFOfCharThree
412+
1, (W.toShortNFOfCharThree • W).a₄ /
413+
(W.toShortNFOfCharThree • W).a₂, 0, 0 * W.toShortNFOfCharThree
417414

418415
theorem toCharThreeNF_spec_of_b₂_ne_zero (hb₂ : W.b₂ ≠ 0) :
419-
(W.variableChange W.toCharThreeNF).IsCharThreeJNeZeroNF := by
416+
(W.toCharThreeNF • W).IsCharThreeJNeZeroNF := by
420417
have h : (2 : F) * 2 = 1 := by linear_combination CharP.cast_eq_zero F 3
421418
letI : Invertible (2 : F) := ⟨2, h, h⟩
422-
rw [toCharThreeNF, variableChange_comp]
423-
set W' := W.variableChange W.toShortNFOfCharThree
419+
rw [toCharThreeNF, mul_smul]
420+
set W' := W.toShortNFOfCharThree • W
424421
haveI : W'.IsCharNeTwoNF := W.toCharNeTwoNF_spec
425422
constructor
426423
· simp
@@ -429,21 +426,18 @@ theorem toCharThreeNF_spec_of_b₂_ne_zero (hb₂ : W.b₂ ≠ 0) :
429426
field_simp [ha₂]
430427
linear_combination (W'.a₄ * W'.a₂ ^ 2 + W'.a₄ ^ 2) * CharP.cast_eq_zero F 3
431428

432-
theorem toCharThreeNF_spec_of_b₂_eq_zero (hb₂ : W.b₂ = 0) :
433-
(W.variableChange W.toCharThreeNF).IsShortNF := by
434-
rw [toCharThreeNF, toShortNFOfCharThree_a₂, hb₂, div_zero, ← VariableChange.id,
435-
VariableChange.id_comp]
429+
theorem toCharThreeNF_spec_of_b₂_eq_zero (hb₂ : W.b₂ = 0) : (W.toCharThreeNF • W).IsShortNF := by
430+
rw [toCharThreeNF, toShortNFOfCharThree_a₂, hb₂, div_zero, ← VariableChange.one_def, one_mul]
436431
exact W.toShortNFOfCharThree_spec hb₂
437432

438-
instance toCharThreeNF_spec : (W.variableChange W.toCharThreeNF).IsCharThreeNF := by
433+
instance toCharThreeNF_spec : (W.toCharThreeNF • W).IsCharThreeNF := by
439434
by_cases hb₂ : W.b₂ = 0
440435
· haveI := W.toCharThreeNF_spec_of_b₂_eq_zero hb₂
441436
infer_instance
442437
· haveI := W.toCharThreeNF_spec_of_b₂_ne_zero hb₂
443438
infer_instance
444439

445-
theorem exists_variableChange_isCharThreeNF :
446-
∃ C : VariableChange F, (W.variableChange C).IsCharThreeNF :=
440+
theorem exists_variableChange_isCharThreeNF : ∃ C : VariableChange F, (C • W).IsCharThreeNF :=
447441
⟨_, W.toCharThreeNF_spec⟩
448442

449443
end VariableChange
@@ -655,7 +649,7 @@ there is an explicit change of variables of it to `Y² + a₃Y = X³ + a₄X + a
655649
def toCharTwoJEqZeroNF : VariableChange R := ⟨1, W.a₂, 0, 0
656650

657651
theorem toCharTwoJEqZeroNF_spec (ha₁ : W.a₁ = 0) :
658-
(W.variableChange W.toCharTwoJEqZeroNF).IsCharTwoJEqZeroNF := by
652+
(W.toCharTwoJEqZeroNF • W).IsCharTwoJEqZeroNF := by
659653
constructor
660654
· simp [toCharTwoJEqZeroNF, ha₁]
661655
· simp_rw [toCharTwoJEqZeroNF, variableChange_a₂, inv_one, Units.val_one]
@@ -670,7 +664,7 @@ def toCharTwoJNeZeroNF (W : WeierstrassCurve F) (ha₁ : W.a₁ ≠ 0) : Variabl
670664
⟨Units.mk0 _ ha₁, W.a₃ / W.a₁, 0, (W.a₁ ^ 2 * W.a₄ + W.a₃ ^ 2) / W.a₁ ^ 3
671665

672666
theorem toCharTwoJNeZeroNF_spec (ha₁ : W.a₁ ≠ 0) :
673-
(W.variableChange (W.toCharTwoJNeZeroNF ha₁)).IsCharTwoJNeZeroNF := by
667+
(W.toCharTwoJNeZeroNF ha₁ • W).IsCharTwoJNeZeroNF := by
674668
constructor
675669
· simp [toCharTwoJNeZeroNF, ha₁]
676670
· field_simp [toCharTwoJNeZeroNF]
@@ -685,7 +679,7 @@ there is an explicit change of variables of it to `WeierstrassCurve.IsCharTwoNF`
685679
def toCharTwoNF [DecidableEq F] : VariableChange F :=
686680
if ha₁ : W.a₁ = 0 then W.toCharTwoJEqZeroNF else W.toCharTwoJNeZeroNF ha₁
687681

688-
instance toCharTwoNF_spec [DecidableEq F] : (W.variableChange W.toCharTwoNF).IsCharTwoNF := by
682+
instance toCharTwoNF_spec [DecidableEq F] : (W.toCharTwoNF • W).IsCharTwoNF := by
689683
by_cases ha₁ : W.a₁ = 0
690684
· rw [toCharTwoNF, dif_pos ha₁]
691685
haveI := W.toCharTwoJEqZeroNF_spec ha₁
@@ -694,8 +688,7 @@ instance toCharTwoNF_spec [DecidableEq F] : (W.variableChange W.toCharTwoNF).IsC
694688
haveI := W.toCharTwoJNeZeroNF_spec ha₁
695689
infer_instance
696690

697-
theorem exists_variableChange_isCharTwoNF :
698-
∃ C : VariableChange F, (W.variableChange C).IsCharTwoNF := by
691+
theorem exists_variableChange_isCharTwoNF : ∃ C : VariableChange F, (C • W).IsCharTwoNF := by
699692
classical
700693
exact ⟨_, W.toCharTwoNF_spec⟩
701694

0 commit comments

Comments
 (0)