@@ -10,21 +10,15 @@ import Mathlib.Data.Rat.Cast.Defs
10
10
# Casts of rational numbers into characteristic zero fields (or division rings).
11
11
-/
12
12
13
+ open Function
13
14
14
15
variable {F ι α β : Type *}
15
16
16
17
namespace Rat
18
+ variable [DivisionRing α] [CharZero α] {p q : ℚ}
17
19
18
- open Rat
19
-
20
- section WithDivRing
21
-
22
- variable [DivisionRing α]
23
-
24
- @[simp, norm_cast]
25
- theorem cast_inj [CharZero α] : ∀ {m n : ℚ}, (m : α) = n ↔ m = n
26
- | ⟨n₁, d₁, d₁0 , c₁⟩, ⟨n₂, d₂, d₂0 , c₂⟩ => by
27
- refine ⟨fun h => ?_, congr_arg _⟩
20
+ lemma cast_injective : Injective ((↑) : ℚ → α)
21
+ | ⟨n₁, d₁, d₁0 , c₁⟩, ⟨n₂, d₂, d₂0 , c₂⟩, h => by
28
22
have d₁a : (d₁ : α) ≠ 0 := Nat.cast_ne_zero.2 d₁0
29
23
have d₂a : (d₂ : α) ≠ 0 := Nat.cast_ne_zero.2 d₂0
30
24
rw [mk'_eq_divInt, mk'_eq_divInt] at h ⊢
@@ -34,30 +28,21 @@ theorem cast_inj [CharZero α] : ∀ {m n : ℚ}, (m : α) = n ↔ m = n
34
28
Int.cast_mul, ← Int.cast_natCast d₂, ← Int.cast_mul, Int.cast_inj, ← mkRat_eq_iff d₁0 d₂0 ]
35
29
at h
36
30
37
- theorem cast_injective [CharZero α] : Function.Injective ((↑) : ℚ → α)
38
- | _, _ => cast_inj.1
31
+ @[simp, norm_cast] lemma cast_inj : (p : α) = q ↔ p = q := cast_injective.eq_iff
39
32
40
- @[simp]
41
- theorem cast_eq_zero [CharZero α] {n : ℚ} : (n : α) = 0 ↔ n = 0 := by rw [← cast_zero, cast_inj]
42
-
43
- theorem cast_ne_zero [CharZero α] {n : ℚ} : (n : α) ≠ 0 ↔ n ≠ 0 :=
44
- not_congr cast_eq_zero
45
-
46
- @[simp, norm_cast]
47
- theorem cast_add [CharZero α] (m n) : ((m + n : ℚ) : α) = m + n :=
48
- cast_add_of_ne_zero (Nat.cast_ne_zero.2 <| ne_of_gt m.pos) (Nat.cast_ne_zero.2 <| ne_of_gt n.pos)
33
+ @[simp, norm_cast] lemma cast_eq_zero : (p : α) = 0 ↔ p = 0 := cast_injective.eq_iff' cast_zero
34
+ lemma cast_ne_zero : (p : α) ≠ 0 ↔ p ≠ 0 := cast_eq_zero.ne
49
35
50
- @[simp, norm_cast]
51
- theorem cast_sub [CharZero α] (m n) : ((m - n : ℚ) : α) = m - n :=
52
- cast_sub_of_ne_zero (Nat.cast_ne_zero.2 <| ne_of_gt m.pos) (Nat.cast_ne_zero.2 <| ne_of_gt n.pos)
36
+ @[simp, norm_cast] lemma cast_add (p q : ℚ) : ↑(p + q) = (p + q : α) :=
37
+ cast_add_of_ne_zero (Nat.cast_ne_zero.2 p.pos.ne') (Nat.cast_ne_zero.2 q.pos.ne')
53
38
54
- @[simp, norm_cast]
55
- theorem cast_mul [CharZero α] (m n) : ((m * n : ℚ) : α) = m * n :=
56
- cast_mul_of_ne_zero (Nat.cast_ne_zero.2 <| ne_of_gt m.pos) (Nat.cast_ne_zero.2 <| ne_of_gt n.pos)
39
+ @[simp, norm_cast] lemma cast_sub (p q : ℚ) : ↑(p - q) = (p - q : α) :=
40
+ cast_sub_of_ne_zero (Nat.cast_ne_zero.2 p.pos.ne') (Nat.cast_ne_zero.2 q.pos.ne')
57
41
58
- variable (α)
59
- variable [CharZero α]
42
+ @[simp, norm_cast] lemma cast_mul (p q : ℚ) : ↑(p * q) = (p * q : α) :=
43
+ cast_mul_of_ne_zero (Nat.cast_ne_zero. 2 p.pos.ne') (Nat.cast_ne_zero. 2 q.pos.ne')
60
44
45
+ variable (α) in
61
46
/-- Coercion `ℚ → α` as a `RingHom`. -/
62
47
def castHom : ℚ →+* α where
63
48
toFun := (↑)
@@ -66,32 +51,67 @@ def castHom : ℚ →+* α where
66
51
map_zero' := cast_zero
67
52
map_add' := cast_add
68
53
69
- variable {α}
70
-
71
- @[simp]
72
- theorem coe_cast_hom : ⇑(castHom α) = ((↑) : ℚ → α) :=
73
- rfl
54
+ @[simp] lemma coe_castHom : ⇑(castHom α) = ((↑) : ℚ → α) := rfl
74
55
75
- @[simp, norm_cast]
76
- theorem cast_inv (n) : ((n⁻¹ : ℚ) : α) = (n : α)⁻¹ :=
77
- map_inv₀ (castHom α) _
56
+ @[deprecated (since := "2024-07-22")] alias coe_cast_hom := coe_castHom
78
57
79
- @[simp, norm_cast]
80
- theorem cast_div (m n) : ((m / n : ℚ) : α) = m / n :=
81
- map_div₀ (castHom α) _ _
58
+ @[simp, norm_cast] lemma cast_inv (p : ℚ) : ↑(p⁻¹) = (p⁻¹ : α) := map_inv₀ (castHom α) _
59
+ @[simp, norm_cast] lemma cast_div (p q : ℚ) : ↑(p / q) = (p / q : α) := map_div₀ (castHom α) ..
82
60
83
61
@[simp, norm_cast]
84
- theorem cast_zpow (q : ℚ) (n : ℤ) : ((q ^ n : ℚ) : α) = (q : α) ^ n :=
85
- map_zpow₀ (castHom α) q n
62
+ lemma cast_zpow (p : ℚ) (n : ℤ) : ↑(p ^ n) = (p ^ n : α) := map_zpow₀ (castHom α) ..
86
63
87
64
@[norm_cast]
88
65
theorem cast_mk (a b : ℤ) : (a /. b : α) = a / b := by
89
66
simp only [divInt_eq_div, cast_div, cast_intCast]
90
67
68
+ end Rat
69
+
70
+ namespace NNRat
71
+ variable [DivisionSemiring α] [CharZero α] {p q : ℚ≥0 }
72
+
73
+ lemma cast_injective : Injective ((↑) : ℚ≥0 → α) := by
74
+ rintro p q hpq
75
+ rw [NNRat.cast_def, NNRat.cast_def, Commute.div_eq_div_iff] at hpq
76
+ rw [← p.num_div_den, ← q.num_div_den, div_eq_div_iff]
77
+ norm_cast at hpq ⊢
78
+ any_goals norm_cast
79
+ any_goals apply den_ne_zero
80
+ exact Nat.cast_commute ..
81
+
82
+ @[simp, norm_cast] lemma cast_inj : (p : α) = q ↔ p = q := cast_injective.eq_iff
83
+
84
+ @[simp, norm_cast] lemma cast_eq_zero : (q : α) = 0 ↔ q = 0 := by rw [← cast_zero, cast_inj]
85
+ lemma cast_ne_zero : (q : α) ≠ 0 ↔ q ≠ 0 := cast_eq_zero.not
86
+
87
+ @[simp, norm_cast] lemma cast_add (p q : ℚ≥0 ) : ↑(p + q) = (p + q : α) :=
88
+ cast_add_of_ne_zero (Nat.cast_ne_zero.2 p.den_pos.ne') (Nat.cast_ne_zero.2 q.den_pos.ne')
89
+
90
+ @[simp, norm_cast] lemma cast_mul (p q) : (p * q : ℚ≥0 ) = (p * q : α) :=
91
+ cast_mul_of_ne_zero (Nat.cast_ne_zero.2 p.den_pos.ne') (Nat.cast_ne_zero.2 q.den_pos.ne')
92
+
93
+ variable (α) in
94
+ /-- Coercion `ℚ≥0 → α` as a `RingHom`. -/
95
+ def castHom : ℚ≥0 →+* α where
96
+ toFun := (↑)
97
+ map_one' := cast_one
98
+ map_mul' := cast_mul
99
+ map_zero' := cast_zero
100
+ map_add' := cast_add
101
+
102
+ @[simp, norm_cast] lemma coe_castHom : ⇑(castHom α) = (↑) := rfl
103
+
104
+ @[simp, norm_cast] lemma cast_inv (p) : (p⁻¹ : ℚ≥0 ) = (p : α)⁻¹ := map_inv₀ (castHom α) _
105
+ @[simp, norm_cast] lemma cast_div (p q) : (p / q : ℚ≥0 ) = (p / q : α) := map_div₀ (castHom α) ..
106
+
91
107
@[simp, norm_cast]
92
- theorem cast_pow (q : ℚ) (k : ℕ) : ↑(q ^ k) = (q : α) ^ k :=
93
- (castHom α).map_pow q k
108
+ lemma cast_zpow (q : ℚ≥0 ) (p : ℤ) : ↑(q ^ p) = ((q : α) ^ p : α) := map_zpow₀ (castHom α) ..
94
109
95
- end WithDivRing
110
+ @[simp]
111
+ lemma cast_divNat (a b : ℕ) : (divNat a b : α) = a / b := by
112
+ rw [← cast_natCast, ← cast_natCast b, ← cast_div]
113
+ congr
114
+ ext
115
+ apply Rat.mkRat_eq_div
96
116
97
- end Rat
117
+ end NNRat
0 commit comments