Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[Merged by Bors] - feat(NumberTheory/EllipticDivisibilitySequence): extend even-odd recursion to integers #13786

Closed
wants to merge 80 commits into from
Closed
Show file tree
Hide file tree
Changes from 73 commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
4ee67ce
Add Ring.divide
Multramate Jul 15, 2023
eab1469
Add IsUnit.divide_eq_mul_inverse
Multramate Jul 18, 2023
50f07f5
Remove redundant assumption
Multramate Jul 18, 2023
7cd0323
Replace NeZero with Nontrivial
Multramate Aug 8, 2023
4dc082e
Merge branch 'master' into Ring.divide
Multramate Aug 21, 2023
bd2f111
Define division polynomials
Multramate Aug 21, 2023
3d63eed
Merge branch 'master' into division_polynomial
Multramate Nov 27, 2023
24f6d6e
Remove divisibility changes
Multramate Nov 27, 2023
dec8062
Merge branch 'master' into division_polynomial
Multramate Dec 29, 2023
04200b4
Define elliptic divisibility sequences
Multramate Jan 1, 2024
09adefb
Merge branch 'EllipticDivisibilitySequence' into division_polynomial
Multramate Jan 1, 2024
ba72afb
Use elliptic divisibility sequences
Multramate Jan 1, 2024
bb1bf7e
Implement Jacobian coordinates
Multramate Jan 2, 2024
906e858
Implement equations and nonsingularity for Jacobian coordinates
Multramate Jan 4, 2024
b9e60a1
Implement group operation polynomials for Jacobian coordinates
Multramate Jan 4, 2024
d42c841
Implement group operations on point representatives for Jacobian coor…
Multramate Jan 4, 2024
59a7cf4
Implement group operations on nonsingular rational points for Jacobia…
Multramate Jan 4, 2024
4449702
Merge branch 'EllipticCurve.Jacobian.Point' into EllipticCurve.Jacobian
Multramate Jan 4, 2024
18e2fd4
Remove extraneous factor in addition
Multramate Jan 5, 2024
04c8b01
Merge branch 'EllipticCurve.Jacobian.Polynomial' into EllipticCurve.J…
Multramate Jan 5, 2024
44f37d6
Fix merge error
Multramate Jan 5, 2024
2fdd995
Merge branch 'EllipticCurve.Jacobian.Representative' into EllipticCur…
Multramate Jan 5, 2024
8b3cc83
Fix merge error
Multramate Jan 5, 2024
640f3a4
Merge branch 'EllipticCurve.Jacobian.Point' into EllipticCurve.Jacobian
Multramate Jan 5, 2024
aebed9b
Merge branch 'EllipticCurve.Jacobian' into DivisionPolynomial
Multramate Jan 6, 2024
595eee8
Merge remote-tracking branch 'origin/master' into division_polynomial
Multramate Feb 3, 2024
d67fb6a
Expose the auxiliary sequence
Multramate Feb 21, 2024
9abf5de
Define recursion principle for normalised EDS
Multramate Feb 22, 2024
21fd348
Merge branch 'EllipticDivisibilitySequence' into division_polynomial
Multramate Feb 22, 2024
59b7909
Redefine division polynomials
Multramate Feb 22, 2024
9f4fb43
Fix dependencies
Multramate Feb 22, 2024
750cb47
Merge branch 'EDSRec' into DivisionPolynomial
Multramate Feb 22, 2024
2e23f41
Compute degrees of division polynomials
Multramate Feb 23, 2024
e774105
Merge remote-tracking branch 'origin/master' into DivisionPolynomial
Multramate May 22, 2024
863e697
Fix merge
Multramate May 22, 2024
6a76f32
Fix upstream
Multramate May 23, 2024
343fc96
Rename division polynomials and add further documentation
Multramate May 27, 2024
087072f
Add further map lemmas
Multramate May 29, 2024
f38bd5e
Fix Group
Multramate May 29, 2024
092eeab
Fix names
Multramate May 30, 2024
de9d170
Fix sentence
Multramate May 30, 2024
f5feacc
Merge branch 'division_polynomial' into DivisionPolynomial.Map
Multramate May 30, 2024
6495e45
Fix docstring
Multramate May 30, 2024
4c05448
Add maps for division polynomials
Multramate May 30, 2024
0eeb05e
Golf odd/even lemmas
Multramate May 31, 2024
18a53a3
Rename variable
Multramate May 31, 2024
0c4dcaa
Merge remote-tracking branch 'origin/master' into EllipticCurve.Affin…
Multramate Jun 1, 2024
c71e42e
Fix merge
Multramate Jun 1, 2024
7717581
Add sections
Multramate Jun 1, 2024
ba56b6a
Merge branch 'EllipticCurve.Affine.Map' into DivisionPolynomial.Map
Multramate Jun 1, 2024
d21d346
Add base changes
Multramate Jun 1, 2024
0d3e52e
Merge branch 'division_polynomial' into DivisionPolynomial.Map
Multramate Jun 1, 2024
3176ddb
Merge remote-tracking branch 'origin/master' into division_polynomial
Multramate Jun 8, 2024
fa64986
Fix merge
Multramate Jun 8, 2024
7190e5e
Move DivisionPolynomial to DivisionPolynomial.Basic
Multramate Jun 8, 2024
d97a437
Fix names
Multramate Jun 8, 2024
aa51ca4
Merge branch 'division_polynomial' into DivisionPolynomial.Map
Multramate Jun 8, 2024
572d359
Fix merge
Multramate Jun 8, 2024
83ca5ba
Remove protection
Multramate Jun 9, 2024
6dfda98
Merge branch 'division_polynomial' into DivisionPolynomial.Map
Multramate Jun 9, 2024
98bbd5f
Fix merge
Multramate Jun 9, 2024
a1ef8e9
Prove congruences in coordinate ring
Multramate Jun 9, 2024
c24d5e2
Merge branch 'master' into DivisionPolynomial.Map
Multramate Jun 9, 2024
f75eba2
Improve docstrings
Multramate Jun 10, 2024
6667911
Add dots
Multramate Jun 10, 2024
854c757
Fix English
Multramate Jun 10, 2024
fd29797
Fix English
Multramate Jun 10, 2024
541bb1d
Change order
Multramate Jun 10, 2024
05b4d65
Extend odd-even recursion to integers
Multramate Jun 12, 2024
959e769
Swap even and odd order
Multramate Jun 12, 2024
7466596
Swap even and odd order
Multramate Jun 12, 2024
4e3744a
Merge branch 'master' into EllipticDivisibilitySequence.Int
Multramate Jun 27, 2024
409be1f
Fix merge
Multramate Jun 27, 2024
aa108f6
Merge branch 'master' into EllipticDivisibilitySequence.Int
Multramate Nov 5, 2024
257461b
Rename declarations with primes and replace latex with unicode
Multramate Nov 5, 2024
e587b2e
Merge branch 'master' into EllipticDivisibilitySequence.Int
Multramate Nov 5, 2024
489c10f
Fix merge
Multramate Nov 6, 2024
9845768
Remove erw
Multramate Nov 6, 2024
24ba9fc
Apply suggestions
Multramate Nov 29, 2024
2650a8e
Merge remote-tracking branch 'origin/master' into EllipticDivisibilit…
Multramate Nov 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 79 additions & 34 deletions Mathlib/AlgebraicGeometry/EllipticCurve/DivisionPolynomial/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -179,16 +179,16 @@ lemma preΨ'_three : W.preΨ' 3 = W.Ψ₃ :=
lemma preΨ'_four : W.preΨ' 4 = W.preΨ₄ :=
preNormEDS'_four ..

lemma preΨ'_odd (m : ℕ) : W.preΨ' (2 * (m + 2) + 1) =
W.preΨ' (m + 4) * W.preΨ' (m + 2) ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ' (m + 1) * W.preΨ' (m + 3) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2) :=
preNormEDS'_odd ..

lemma preΨ'_even (m : ℕ) : W.preΨ' (2 * (m + 3)) =
W.preΨ' (m + 2) ^ 2 * W.preΨ' (m + 3) * W.preΨ' (m + 5) -
W.preΨ' (m + 1) * W.preΨ' (m + 3) * W.preΨ' (m + 4) ^ 2 :=
preNormEDS'_even ..

lemma preΨ'_odd (m : ℕ) : W.preΨ' (2 * (m + 2) + 1) =
W.preΨ' (m + 4) * W.preΨ' (m + 2) ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ' (m + 1) * W.preΨ' (m + 3) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2) :=
preNormEDS'_odd ..

end preΨ'

section preΨ
Expand Down Expand Up @@ -224,20 +224,30 @@ lemma preΨ_three : W.preΨ 3 = W.Ψ₃ :=
lemma preΨ_four : W.preΨ 4 = W.preΨ₄ :=
preNormEDS_four ..

lemma preΨ_odd (m : ℕ) : W.preΨ (2 * (m + 2) + 1) =
W.preΨ (m + 4) * W.preΨ (m + 2) ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ (m + 1) * W.preΨ (m + 3) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2) :=
preNormEDS_odd ..

lemma preΨ_even (m : ℕ) : W.preΨ (2 * (m + 3)) =
lemma preΨ_even' (m : ℕ) : W.preΨ (2 * (m + 3)) =
W.preΨ (m + 2) ^ 2 * W.preΨ (m + 3) * W.preΨ (m + 5) -
W.preΨ (m + 1) * W.preΨ (m + 3) * W.preΨ (m + 4) ^ 2 :=
preNormEDS_even ..
preNormEDS_even' ..

lemma preΨ_odd' (m : ℕ) : W.preΨ (2 * (m + 2) + 1) =
W.preΨ (m + 4) * W.preΨ (m + 2) ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ (m + 1) * W.preΨ (m + 3) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2) :=
preNormEDS_odd' ..

@[simp]
lemma preΨ_neg (n : ℤ) : W.preΨ (-n) = -W.preΨ n :=
preNormEDS_neg ..

lemma preΨ_even (m : ℤ) : W.preΨ (2 * m) =
W.preΨ (m - 1) ^ 2 * W.preΨ m * W.preΨ (m + 2) -
W.preΨ (m - 2) * W.preΨ m * W.preΨ (m + 1) ^ 2 :=
preNormEDS_even ..

lemma preΨ_odd (m : ℤ) : W.preΨ (2 * m + 1) =
W.preΨ (m + 2) * W.preΨ m ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ (m - 1) * W.preΨ (m + 1) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2) :=
preNormEDS_odd ..

end preΨ

section ΨSq
Expand Down Expand Up @@ -272,20 +282,30 @@ lemma ΨSq_three : W.ΨSq 3 = W.Ψ₃ ^ 2 := by
lemma ΨSq_four : W.ΨSq 4 = W.preΨ₄ ^ 2 * W.Ψ₂Sq := by
erw [ΨSq_ofNat, preΨ'_four, if_pos <| by decide]

lemma ΨSq_odd (m : ℕ) : W.ΨSq (2 * (m + 2) + 1) =
(W.preΨ' (m + 4) * W.preΨ' (m + 2) ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ' (m + 1) * W.preΨ' (m + 3) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2)) ^ 2 := by
erw [ΨSq_ofNat, preΨ'_odd, if_neg (m + 2).not_even_two_mul_add_one, mul_one]

lemma ΨSq_even (m : ℕ) : W.ΨSq (2 * (m + 3)) =
lemma ΨSq_even' (m : ℕ) : W.ΨSq (2 * (m + 3)) =
(W.preΨ' (m + 2) ^ 2 * W.preΨ' (m + 3) * W.preΨ' (m + 5) -
W.preΨ' (m + 1) * W.preΨ' (m + 3) * W.preΨ' (m + 4) ^ 2) ^ 2 * W.Ψ₂Sq := by
erw [ΨSq_ofNat, preΨ'_even, if_pos <| even_two_mul _]

lemma ΨSq_odd' (m : ℕ) : W.ΨSq (2 * (m + 2) + 1) =
(W.preΨ' (m + 4) * W.preΨ' (m + 2) ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ' (m + 1) * W.preΨ' (m + 3) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2)) ^ 2 := by
erw [ΨSq_ofNat, preΨ'_odd, if_neg (m + 2).not_even_two_mul_add_one, mul_one]

@[simp]
lemma ΨSq_neg (n : ℤ) : W.ΨSq (-n) = W.ΨSq n := by
simp only [ΨSq, preΨ_neg, neg_sq, even_neg]

lemma ΨSq_even (m : ℤ) : W.ΨSq (2 * m) =
(W.preΨ (m - 1) ^ 2 * W.preΨ m * W.preΨ (m + 2) -
W.preΨ (m - 2) * W.preΨ m * W.preΨ (m + 1) ^ 2) ^ 2 * W.Ψ₂Sq := by
erw [ΨSq, preΨ_even, if_pos <| even_two_mul _]

lemma ΨSq_odd (m : ℤ) : W.ΨSq (2 * m + 1) =
(W.preΨ (m + 2) * W.preΨ m ^ 3 * (if Even m then W.Ψ₂Sq ^ 2 else 1) -
W.preΨ (m - 1) * W.preΨ (m + 1) ^ 3 * (if Even m then 1 else W.Ψ₂Sq ^ 2)) ^ 2 := by
erw [ΨSq, preΨ_odd, if_neg m.not_even_two_mul_add_one, mul_one]

end ΨSq

section Ψ
Expand Down Expand Up @@ -322,25 +342,42 @@ lemma Ψ_three : W.Ψ 3 = C W.Ψ₃ := by
lemma Ψ_four : W.Ψ 4 = C W.preΨ₄ * W.ψ₂ := by
erw [Ψ_ofNat, preΨ'_four, if_pos <| by decide]

lemma Ψ_odd (m : ℕ) : W.Ψ (2 * (m + 2) + 1) =
W.Ψ (m + 4) * W.Ψ (m + 2) ^ 3 - W.Ψ (m + 1) * W.Ψ (m + 3) ^ 3 +
W.toAffine.polynomial * (16 * W.toAffine.polynomial - 8 * W.ψ₂ ^ 2) * C
(if Even m then W.preΨ' (m + 4) * W.preΨ' (m + 2) ^ 3
else -W.preΨ' (m + 1) * W.preΨ' (m + 3) ^ 3) := by
repeat erw [Ψ_ofNat]
simp_rw [preΨ'_odd, if_neg (m + 2).not_even_two_mul_add_one, Nat.even_add_one, ite_not]
split_ifs <;> C_simp <;> rw [C_Ψ₂Sq] <;> ring1

lemma Ψ_even (m : ℕ) : W.Ψ (2 * (m + 3)) * W.ψ₂ =
lemma Ψ_even' (m : ℕ) : W.Ψ (2 * (m + 3)) * W.ψ₂ =
W.Ψ (m + 2) ^ 2 * W.Ψ (m + 3) * W.Ψ (m + 5) - W.Ψ (m + 1) * W.Ψ (m + 3) * W.Ψ (m + 4) ^ 2 := by
repeat erw [Ψ_ofNat]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is erw needed? Is there perhaps a bit of API missing, making rw work smoothly?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some of these are just for the sake of my sanity, e.g. converting 4 - 1 to 3 by rw [show (4 - 1 : ℤ) = 3 by rfl] etc.

I can add these to the bottom of this file though, what do you think?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait, I have to find a different home for those lemmas, since I don't think file imports AddGroup...

simp_rw [preΨ'_even, if_pos <| even_two_mul _, Nat.even_add_one, ite_not]
split_ifs <;> C_simp <;> ring1

lemma Ψ_odd' (m : ℕ) : W.Ψ (2 * (m + 2) + 1) =
W.Ψ (m + 4) * W.Ψ (m + 2) ^ 3 - W.Ψ (m + 1) * W.Ψ (m + 3) ^ 3 +
W.toAffine.polynomial * (16 * W.toAffine.polynomial - 8 * W.ψ₂ ^ 2) *
C (if Even m then W.preΨ' (m + 4) * W.preΨ' (m + 2) ^ 3
else -W.preΨ' (m + 1) * W.preΨ' (m + 3) ^ 3) := by
repeat erw [Ψ_ofNat]
simp_rw [preΨ'_odd, if_neg (m + 2).not_even_two_mul_add_one, Nat.even_add_one, ite_not]
split_ifs <;> C_simp <;> rw [C_Ψ₂Sq] <;> ring1

@[simp]
lemma Ψ_neg (n : ℤ) : W.Ψ (-n) = -W.Ψ n := by
simp only [Ψ, preΨ_neg, C_neg, neg_mul (α := R[X][Y]), even_neg]

lemma Ψ_even (m : ℤ) : W.Ψ (2 * m) * W.ψ₂ =
W.Ψ (m - 1) ^ 2 * W.Ψ m * W.Ψ (m + 2) - W.Ψ (m - 2) * W.Ψ m * W.Ψ (m + 1) ^ 2 := by
repeat erw [Ψ]
simp_rw [preΨ_even, if_pos <| even_two_mul _, Int.even_add_one, show m + 2 = m + 1 + 1 by ring1,
Int.even_add_one, show m - 2 = m - 1 - 1 by ring1, Int.even_sub_one, ite_not]
split_ifs <;> C_simp <;> ring1

lemma Ψ_odd (m : ℤ) : W.Ψ (2 * m + 1) =
W.Ψ (m + 2) * W.Ψ m ^ 3 - W.Ψ (m - 1) * W.Ψ (m + 1) ^ 3 +
W.toAffine.polynomial * (16 * W.toAffine.polynomial - 8 * W.ψ₂ ^ 2) *
C (if Even m then W.preΨ (m + 2) * W.preΨ m ^ 3
else -W.preΨ (m - 1) * W.preΨ (m + 1) ^ 3) := by
repeat erw [Ψ]
simp_rw [preΨ_odd, if_neg m.not_even_two_mul_add_one, show m + 2 = m + 1 + 1 by ring1,
Int.even_add_one, Int.even_sub_one, ite_not]
split_ifs <;> C_simp <;> rw [C_Ψ₂Sq] <;> ring1

lemma Affine.CoordinateRing.mk_Ψ_sq (n : ℤ) : mk W (W.Ψ n) ^ 2 = mk W (C <| W.ΨSq n) := by
simp only [Ψ, ΨSq, map_one, map_mul, map_pow, one_pow, mul_pow, ite_pow, apply_ite C,
apply_ite <| mk W, mk_ψ₂_sq]
Expand Down Expand Up @@ -426,18 +463,26 @@ lemma ψ_three : W.ψ 3 = C W.Ψ₃ :=
lemma ψ_four : W.ψ 4 = C W.preΨ₄ * W.ψ₂ :=
normEDS_four ..

lemma ψ_odd (m : ℕ) : W.ψ (2 * (m + 2) + 1) =
W.ψ (m + 4) * W.ψ (m + 2) ^ 3 - W.ψ (m + 1) * W.ψ (m + 3) ^ 3 :=
normEDS_odd ..

lemma ψ_even (m : ℕ) : W.ψ (2 * (m + 3)) * W.ψ₂ =
lemma ψ_even' (m : ℕ) : W.ψ (2 * (m + 3)) * W.ψ₂ =
W.ψ (m + 2) ^ 2 * W.ψ (m + 3) * W.ψ (m + 5) - W.ψ (m + 1) * W.ψ (m + 3) * W.ψ (m + 4) ^ 2 :=
normEDS_even ..
normEDS_even' ..

lemma ψ_odd' (m : ℕ) : W.ψ (2 * (m + 2) + 1) =
W.ψ (m + 4) * W.ψ (m + 2) ^ 3 - W.ψ (m + 1) * W.ψ (m + 3) ^ 3 :=
normEDS_odd' ..

@[simp]
lemma ψ_neg (n : ℤ) : W.ψ (-n) = -W.ψ n :=
normEDS_neg ..

lemma ψ_even (m : ℤ) : W.ψ (2 * m) * W.ψ₂ =
W.ψ (m - 1) ^ 2 * W.ψ m * W.ψ (m + 2) - W.ψ (m - 2) * W.ψ m * W.ψ (m + 1) ^ 2 :=
normEDS_even ..

lemma ψ_odd (m : ℤ) : W.ψ (2 * m + 1) =
W.ψ (m + 2) * W.ψ m ^ 3 - W.ψ (m - 1) * W.ψ (m + 1) ^ 3 :=
normEDS_odd ..

lemma Affine.CoordinateRing.mk_ψ (n : ℤ) : mk W (W.ψ n) = mk W (W.Ψ n) := by
simp only [ψ, normEDS, Ψ, preΨ, map_mul, map_pow, map_preNormEDS, ← mk_ψ₂_sq, ← pow_mul]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,16 +270,16 @@ lemma natDegree_preΨ_le (n : ℤ) : (W.preΨ n).natDegree ≤
(n.natAbs ^ 2 - if Even n then 4 else 1) / 2 := by
induction n using Int.negInduction with
| nat n => exact_mod_cast W.preΨ_ofNat n ▸ W.natDegree_preΨ'_le n
| neg => simpa only [preΨ_neg, natDegree_neg, Int.natAbs_neg, even_neg]
| neg ih => simp only [preΨ_neg, natDegree_neg, Int.natAbs_neg, even_neg, ih]

@[simp]
lemma coeff_preΨ (n : ℤ) : (W.preΨ n).coeff ((n.natAbs ^ 2 - if Even n then 4 else 1) / 2) =
if Even n then n / 2 else n := by
induction n using Int.negInduction with
| nat n => exact_mod_cast W.preΨ_ofNat n ▸ W.coeff_preΨ' n
| neg n ih =>
| neg ih n =>
simp only [preΨ_neg, coeff_neg, Int.natAbs_neg, even_neg]
rcases n.even_or_odd' with ⟨n, rfl | rfl⟩ <;>
rcases ih n, n.even_or_odd' with ⟨ih, ⟨n, rfl | rfl⟩ <;>
push_cast [even_two_mul, Int.not_even_two_mul_add_one, Int.neg_ediv_of_dvd ⟨n, rfl⟩] at * <;>
rw [ih]

Expand All @@ -288,8 +288,8 @@ lemma coeff_preΨ_ne_zero {n : ℤ} (h : (n : R) ≠ 0) :
induction n using Int.negInduction with
| nat n => simpa only [preΨ_ofNat, Int.even_coe_nat]
using W.coeff_preΨ'_ne_zero <| by exact_mod_cast h
| neg n ih => simpa only [preΨ_neg, coeff_neg, neg_ne_zero, Int.natAbs_neg, even_neg]
using ih <| neg_ne_zero.mp <| by exact_mod_cast h
| neg ih n => simpa only [preΨ_neg, coeff_neg, neg_ne_zero, Int.natAbs_neg, even_neg]
using ih n <| neg_ne_zero.mp <| by exact_mod_cast h

@[simp]
lemma natDegree_preΨ {n : ℤ} (h : (n : R) ≠ 0) :
Expand All @@ -300,8 +300,8 @@ lemma natDegree_preΨ_pos {n : ℤ} (hn : 2 < n.natAbs) (h : (n : R) ≠ 0) :
0 < (W.preΨ n).natDegree := by
induction n using Int.negInduction with
| nat n => simpa only [preΨ_ofNat] using W.natDegree_preΨ'_pos hn <| by exact_mod_cast h
| neg n ih => simpa only [preΨ_neg, natDegree_neg]
using ih (by rwa [← Int.natAbs_neg]) <| neg_ne_zero.mp <| by exact_mod_cast h
| neg ih n => simpa only [preΨ_neg, natDegree_neg]
using ih n (by rwa [← Int.natAbs_neg]) <| neg_ne_zero.mp <| by exact_mod_cast h

@[simp]
lemma leadingCoeff_preΨ {n : ℤ} (h : (n : R) ≠ 0) :
Expand All @@ -311,7 +311,8 @@ lemma leadingCoeff_preΨ {n : ℤ} (h : (n : R) ≠ 0) :
lemma preΨ_ne_zero [Nontrivial R] {n : ℤ} (h : (n : R) ≠ 0) : W.preΨ n ≠ 0 := by
induction n using Int.negInduction with
| nat n => simpa only [preΨ_ofNat] using W.preΨ'_ne_zero <| by exact_mod_cast h
| neg n ih => simpa only [preΨ_neg, neg_ne_zero] using ih <| neg_ne_zero.mp <| by exact_mod_cast h
| neg ih n => simpa only [preΨ_neg, neg_ne_zero]
using ih n <| neg_ne_zero.mp <| by exact_mod_cast h

end preΨ

Expand Down Expand Up @@ -340,13 +341,13 @@ private lemma natDegree_coeff_ΨSq_ofNat (n : ℕ) :
lemma natDegree_ΨSq_le (n : ℤ) : (W.ΨSq n).natDegree ≤ n.natAbs ^ 2 - 1 := by
induction n using Int.negInduction with
| nat n => exact (W.natDegree_coeff_ΨSq_ofNat n).left
| neg => rwa [ΨSq_neg, Int.natAbs_neg]
| neg ih => simp only [ΨSq_neg, Int.natAbs_neg, ih]

@[simp]
lemma coeff_ΨSq (n : ℤ) : (W.ΨSq n).coeff (n.natAbs ^ 2 - 1) = n ^ 2 := by
induction n using Int.negInduction with
| nat n => exact_mod_cast (W.natDegree_coeff_ΨSq_ofNat n).right
| neg => rwa [ΨSq_neg, Int.natAbs_neg, ← Int.cast_pow, neg_sq, Int.cast_pow]
| neg ih => simp_rw [ΨSq_neg, Int.natAbs_neg, ← Int.cast_pow, neg_sq, Int.cast_pow, ih]

lemma coeff_ΨSq_ne_zero [NoZeroDivisors R] {n : ℤ} (h : (n : R) ≠ 0) :
(W.ΨSq n).coeff (n.natAbs ^ 2 - 1) ≠ 0 := by
Expand Down Expand Up @@ -415,13 +416,13 @@ private lemma natDegree_coeff_Φ_ofNat (n : ℕ) :
lemma natDegree_Φ_le (n : ℤ) : (W.Φ n).natDegree ≤ n.natAbs ^ 2 := by
induction n using Int.negInduction with
| nat n => exact (W.natDegree_coeff_Φ_ofNat n).left
| neg => rwa [Φ_neg, Int.natAbs_neg]
| neg ih => simp only [Φ_neg, Int.natAbs_neg, ih]

@[simp]
lemma coeff_Φ (n : ℤ) : (W.Φ n).coeff (n.natAbs ^ 2) = 1 := by
induction n using Int.negInduction with
| nat n => exact (W.natDegree_coeff_Φ_ofNat n).right
| neg => rwa [Φ_neg, Int.natAbs_neg]
| neg ih => simp only [Φ_neg, Int.natAbs_neg, ih]

lemma coeff_Φ_ne_zero [Nontrivial R] (n : ℤ) : (W.Φ n).coeff (n.natAbs ^ 2) ≠ 0 :=
W.coeff_Φ n ▸ one_ne_zero
Expand Down
4 changes: 2 additions & 2 deletions Mathlib/Data/Int/Defs.lean
Original file line number Diff line number Diff line change
Expand Up @@ -342,9 +342,9 @@ end inductionOn'

/-- Inductively define a function on `ℤ` by defining it on `ℕ` and extending it from `n` to `-n`. -/
@[elab_as_elim] protected def negInduction {C : ℤ → Sort*} (nat : ∀ n : ℕ, C n)
(neg : ∀ n : ℕ, C n C (-n)) : ∀ n : ℤ, C n
(neg : (∀ n : ℕ, C n) → ∀ n : ℕ, C (-n)) : ∀ n : ℤ, C n
| .ofNat n => nat n
| .negSucc n => neg _ <| nat <| n + 1
| .negSucc n => neg nat <| n + 1

/-- See `Int.inductionOn'` for an induction in both directions. -/
protected lemma le_induction {P : ℤ → Prop} {m : ℤ} (h0 : P m)
Expand Down
Loading
Loading