Skip to content

Commit 0bee8dd

Browse files
committed
chore(Data/Int/Fib): add fib_neg (#32107)
Forgot to add `Int.fib_neg`: ```lean theorem fib_neg (n : ℤ) : fib (-n) = if Even n then -fib n else fib n := by ``` Also changes `Int.fib_gcd` to `Int.gcd_fib` and gets rid of the unnecessary coercions.
1 parent b25a4f7 commit 0bee8dd

File tree

3 files changed

+27
-30
lines changed

3 files changed

+27
-30
lines changed

Mathlib/Algebra/Ring/Parity.lean

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Authors: Damiano Testa
55
-/
66
module
77

8-
public import Mathlib.Algebra.Group.Nat.Even
8+
public import Mathlib.Algebra.Group.Int.Even
99
public import Mathlib.Data.Nat.Cast.Basic
1010
public import Mathlib.Data.Nat.Cast.Commute
1111
public import Mathlib.Data.Set.Operations
@@ -48,16 +48,6 @@ lemma Even.neg_one_pow (h : Even n) : (-1 : α) ^ n = 1 := by rw [h.neg_pow, one
4848

4949
end Monoid
5050

51-
section DivisionMonoid
52-
variable [DivisionMonoid α] [HasDistribNeg α] {a : α} {n : ℤ}
53-
54-
lemma Even.neg_zpow : Even n → ∀ a : α, (-a) ^ n = a ^ n := by
55-
rintro ⟨c, rfl⟩ a; simp_rw [← Int.two_mul, zpow_mul, zpow_two, neg_mul_neg]
56-
57-
lemma Even.neg_one_zpow (h : Even n) : (-1 : α) ^ n = 1 := by rw [h.neg_zpow, one_zpow]
58-
59-
end DivisionMonoid
60-
6151
@[simp] lemma IsSquare.zero [MulZeroClass α] : IsSquare (0 : α) := ⟨0, (mul_zero _).symm⟩
6252

6353
section Semiring
@@ -363,6 +353,20 @@ lemma neg_one_pow_eq_neg_one_iff_odd (h : (-1 : R) ≠ 1) :
363353

364354
end DistribNeg
365355

356+
section DivisionMonoid
357+
variable [DivisionMonoid α] [HasDistribNeg α] {a : α} {n : ℤ}
358+
359+
lemma Even.neg_zpow : Even n → ∀ a : α, (-a) ^ n = a ^ n := by
360+
rintro ⟨c, rfl⟩ a; simp_rw [← Int.two_mul, zpow_mul, zpow_two, neg_mul_neg]
361+
362+
lemma Even.neg_one_zpow (h : Even n) : (-1 : α) ^ n = 1 := by rw [h.neg_zpow, one_zpow]
363+
364+
lemma neg_one_zpow_eq_ite : (-1 : α) ^ n = if Even n then 1 else -1 := by
365+
obtain ⟨n, _⟩ := n.eq_nat_or_neg
366+
aesop (add safe (by rw [neg_one_pow_eq_ite]))
367+
368+
end DivisionMonoid
369+
366370
section CharTwo
367371

368372
-- We state the following theorems in terms of the slightly more general `2 = 0` hypothesis.

Mathlib/Data/Int/Fib.lean

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,12 @@ theorem fib_neg_natCast (n : ℕ) : fib (-n) = (-1) ^ (n + 1) * n.fib := by
5454
· simp [fib, hn, pow_add]
5555
· simp [fib_of_odd, hn]
5656

57+
theorem fib_neg (n : ℤ) : fib (-n) = if Even n then -fib n else fib n := by
58+
obtain ⟨n, _⟩ := n.eq_nat_or_neg
59+
aesop (add safe (by rw [fib_neg_natCast]))
60+
5761
theorem coe_fib_neg (n : ℤ) : (fib (-n) : ℚ) = (-1) ^ (n + 1) * fib n := by
58-
obtain ⟨n, (rfl | rfl)⟩ := n.eq_nat_or_neg
59-
· exact_mod_cast fib_neg_natCast _
60-
· rw [fib_neg_natCast, pow_add, Rat.zpow_add (by simp)]
61-
simp
62+
aesop (add safe (by rw [fib_neg, neg_one_zpow_eq_ite]))
6263

6364
theorem fib_add_two (n : ℤ) : fib (n + 2) = fib n + fib (n + 1) := by
6465
rcases n with (n | n)
@@ -149,24 +150,13 @@ theorem fib_two_mul_add_two (n : ℤ) :
149150
rw [← mul_add_one, fib_two_mul]
150151
grind [fib_add_two]
151152

152-
theorem fib_gcd (m n : ℤ) : fib (gcd m n) = gcd (fib m) (fib n) := by
153+
theorem gcd_fib (m n : ℤ) : gcd (fib m) (fib n) = Nat.fib (gcd m n) := by
153154
obtain ⟨m, (rfl | rfl)⟩ := m.eq_nat_or_neg
154-
· obtain ⟨n, (rfl | rfl)⟩ := n.eq_nat_or_neg
155-
· simp [Nat.fib_gcd]
156-
· simp only [gcd_neg, Int.gcd_natCast_natCast, fib_natCast, Nat.fib_gcd, fib_neg_natCast,
157-
reduceNeg, Nat.cast_inj]
158-
rcases neg_one_pow_eq_or ℤ (n + 1) with (h | h) <;> simp [h]
159-
· obtain ⟨n, (rfl | rfl)⟩ := n.eq_nat_or_neg
160-
· simp only [neg_gcd, Int.gcd_natCast_natCast, fib_natCast, Nat.fib_gcd, fib_neg_natCast,
161-
reduceNeg, Nat.cast_inj]
162-
rcases neg_one_pow_eq_or ℤ (m + 1) with (h | h) <;> simp [h]
163-
· simp only [gcd_neg, neg_gcd, Int.gcd_natCast_natCast, fib_natCast, Nat.fib_gcd,
164-
fib_neg_natCast, reduceNeg, Nat.cast_inj]
165-
rcases neg_one_pow_eq_or ℤ (n + 1) with (h | h) <;>
166-
rcases neg_one_pow_eq_or ℤ (m + 1) with (h' | h') <;> simp [h, h']
155+
<;> obtain ⟨n, (rfl | rfl)⟩ := n.eq_nat_or_neg
156+
<;> simp [fib_neg, Nat.fib_gcd, apply_ite, apply_ite_left]
167157

168158
private theorem fib_natCast_dvd {m : ℕ} {n : ℤ} (h : (m : ℤ) ∣ n) : fib m ∣ fib n := by
169-
rwa [← gcd_eq_left_iff_dvd (by simp), ← fib_gcd, gcd_eq_left_iff_dvd (by simp) |>.mpr]
159+
rwa [← gcd_eq_left_iff_dvd (by simp), gcd_fib, ← fib_natCast, (gcd_eq_left_iff_dvd (by simp)).mpr]
170160

171161
theorem fib_dvd (m n : ℤ) (h : m ∣ n) : fib m ∣ fib n := by
172162
obtain ⟨m, (rfl | rfl)⟩ := m.eq_nat_or_neg

Mathlib/Logic/Basic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,9 @@ either branch to `a`. -/
912912
theorem ite_apply (f g : ∀ a, σ a) (a : α) : (ite P f g) a = ite P (f a) (g a) :=
913913
dite_apply P (fun _ ↦ f) (fun _ ↦ g) a
914914

915+
theorem apply_ite_left {α β γ : Sort*} (f : α → β → γ) (P : Prop) [Decidable P]
916+
(x y : α) (z : β) : f (if P then x else y) z = if P then f x z else f y z := by grind
917+
915918
section
916919
variable [Decidable Q]
917920

0 commit comments

Comments
 (0)