Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 99b2d40

Browse files
committed
feat(algebra/floor): Floor and ceil of -a (#9715)
This proves `floor_neg : ⌊-a⌋ = -⌈a⌉` and `ceil_neg : ⌈-a⌉ = -⌊a⌋` and uses them to remove explicit dependency on the definition of `int.ceil` in prevision of #9591. This also proves `⌊a + 1⌋ = ⌊a⌋ + 1` and variants.
1 parent 9ac2aa2 commit 99b2d40

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

src/algebra/archimedean.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ end
333333
floor_eq_iff.2 (by exact_mod_cast floor_eq_iff.1 (eq.refl ⌊x⌋))
334334

335335
@[simp, norm_cast] theorem rat.cast_ceil (x : ℚ) : ⌈(x:α)⌉ = ⌈x⌉ :=
336-
by rw [ceil, ← rat.cast_neg, rat.cast_floor, ← ceil]
336+
by rw [←neg_inj, ←floor_neg, ←floor_neg, ← rat.cast_neg, rat.cast_floor]
337337

338338
@[simp, norm_cast] theorem rat.cast_round (x : ℚ) : round (x:α) = round x :=
339339
have ((x + 1 / 2 : ℚ) : α) = x + 1 / 2, by simp,

src/algebra/floor.lean

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ lemma floor_pos : 0 < ⌊a⌋ ↔ 1 ≤ a :=
103103
eq_of_forall_le_iff $ λ a, by rw [le_floor,
104104
← sub_le_iff_le_add, ← sub_le_iff_le_add, le_floor, int.cast_sub]
105105

106+
lemma floor_add_one (a : α) : ⌊a + 1⌋ = ⌊a⌋ + 1 :=
107+
by { convert floor_add_int a 1, exact cast_one.symm }
108+
106109
@[simp] lemma floor_int_add (z : ℤ) (a : α) : ⌊↑z + a⌋ = z + ⌊a⌋ :=
107110
by simpa only [add_comm] using floor_add_int a z
108111

@@ -199,6 +202,12 @@ end
199202
lemma ceil_le {z : ℤ} {a : α} : ⌈a⌉ ≤ z ↔ a ≤ z :=
200203
by rw [ceil, neg_le, le_floor, int.cast_neg, neg_le_neg_iff]
201204

205+
lemma floor_neg {a : α} : ⌊-a⌋ = -⌈a⌉ :=
206+
eq_of_forall_le_iff (λ z, by rw [le_neg, ceil_le, le_floor, int.cast_neg, le_neg])
207+
208+
lemma ceil_neg {a : α} : ⌈-a⌉ = -⌊a⌋ :=
209+
eq_of_forall_ge_iff (λ z, by rw [neg_le, ceil_le, le_floor, int.cast_neg, neg_le])
210+
202211
lemma lt_ceil {a : α} {z : ℤ} : z < ⌈a⌉ ↔ (z : α) < a := lt_iff_lt_of_le_iff_le ceil_le
203212

204213
lemma ceil_le_floor_add_one (a : α) : ⌈a⌉ ≤ ⌊a⌋ + 1 :=
@@ -212,7 +221,10 @@ eq_of_forall_ge_iff $ λ a, by rw [ceil_le, int.cast_le]
212221
lemma ceil_mono {a b : α} (h : a ≤ b) : ⌈a⌉ ≤ ⌈b⌉ := ceil_le.2 (h.trans (le_ceil _))
213222

214223
@[simp] lemma ceil_add_int (a : α) (z : ℤ) : ⌈a + z⌉ = ⌈a⌉ + z :=
215-
by rw [ceil, neg_add', floor_sub_int, neg_sub, sub_eq_neg_add]; refl
224+
by rw [←neg_inj, neg_add', ←floor_neg, ←floor_neg, neg_add', floor_sub_int]
225+
226+
lemma ceil_add_one (a : α) : ⌈a + 1⌉ = ⌈a⌉ + 1 :=
227+
by { convert ceil_add_int a (1 : ℤ), exact cast_one.symm }
216228

217229
lemma ceil_sub_int (a : α) (z : ℤ) : ⌈a - z⌉ = ⌈a⌉ - z :=
218230
eq.trans (by rw [int.cast_neg, sub_eq_add_neg]) (ceil_add_int _ _)
@@ -356,6 +368,9 @@ begin
356368
rw [int.floor_add_int, int.to_nat_add_nat (int.le_floor.2 ha)],
357369
end
358370

371+
lemma floor_add_one {a : α} (ha : 0 ≤ a) : ⌊a + 1⌋₊ = ⌊a⌋₊ + 1 :=
372+
by { convert floor_add_nat ha 1, exact cast_one.symm }
373+
359374
lemma lt_floor_add_one (a : α) : a < ⌊a⌋₊ + 1 :=
360375
begin
361376
refine (int.lt_floor_add_one a).trans_le (add_le_add_right _ 1),
@@ -400,10 +415,11 @@ begin
400415
refl
401416
end
402417

403-
theorem ceil_lt_add_one {a : α} (a_nonneg : 0 ≤ a) : (⌈a⌉₊ : α) < a + 1 :=
404-
lt_ceil.1 $ by rw (
405-
show ⌈a + 1⌉₊ = ⌈a⌉₊ + 1, by exact_mod_cast (ceil_add_nat a_nonneg 1));
406-
apply nat.lt_succ_self
418+
lemma ceil_add_one {a : α} (ha : 0 ≤ a) : ⌈a + 1⌉₊ = ⌈a⌉₊ + 1 :=
419+
by { convert ceil_add_nat ha 1, exact cast_one.symm }
420+
421+
lemma ceil_lt_add_one {a : α} (ha : 0 ≤ a) : (⌈a⌉₊ : α) < a + 1 :=
422+
lt_ceil.1 $ (nat.lt_succ_self _).trans_le (ceil_add_one ha).ge
407423

408424
lemma lt_of_ceil_lt {a : α} {n : ℕ} (h : ⌈a⌉₊ < n) : a < n := (le_ceil a).trans_lt (nat.cast_lt.2 h)
409425

0 commit comments

Comments
 (0)