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

Commit a8cedf9

Browse files
committed
feat(data/nat/digits): a number is bigger than base^(digits length - 1) (#3498)
1 parent acc2802 commit a8cedf9

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/data/nat/digits.lean

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,3 +444,35 @@ end
444444

445445
lemma le_digits_len_le (b n m : ℕ) (h : n ≤ m) : (digits b n).length ≤ (digits b m).length :=
446446
monotone_of_monotone_nat (digits_len_le_digits_len_succ b) h
447+
448+
-- future refactor to proof using lists (see lt_base_pow_length_digits)
449+
lemma base_pow_length_digits_le' (b m : ℕ) : m ≠ 0 → (b + 2) ^ ((digits (b + 2) m).length) ≤ (b + 2) * m :=
450+
begin
451+
apply nat.strong_induction_on m,
452+
clear m,
453+
intros n IH npos,
454+
cases n,
455+
{ contradiction },
456+
{ unfold digits at IH ⊢,
457+
rw [digits_aux_def (b+2) (by simp) n.succ nat.succ_pos', list.length_cons],
458+
specialize IH ((n.succ) / (b+2)) (nat.div_lt_self' n b),
459+
rw [nat.pow_add, nat.pow_one, nat.mul_comm],
460+
cases nat.lt_or_ge n.succ (b+2),
461+
{ rw [nat.div_eq_of_lt h, digits_aux_zero, list.length, nat.pow_zero],
462+
apply nat.mul_le_mul_left,
463+
exact nat.succ_pos n },
464+
{ have geb : (n.succ / (b + 2)) ≥ 1 := nat.div_pos h (by linarith),
465+
specialize IH (by linarith [geb]),
466+
replace IH := nat.mul_le_mul_left (b + 2) IH,
467+
have IH' : (b + 2) * ((b + 2) * (n.succ / (b + 2))) ≤ (b + 2) * n.succ,
468+
{ apply nat.mul_le_mul_left,
469+
rw nat.mul_comm,
470+
exact nat.div_mul_le_self n.succ (b + 2) },
471+
exact le_trans IH IH' } }
472+
end
473+
474+
lemma base_pow_length_digits_le (b m : ℕ) (hb : 2 ≤ b): m ≠ 0 → b ^ ((digits b m).length) ≤ b * m :=
475+
begin
476+
rcases b with _ | _ | b; try { linarith },
477+
exact base_pow_length_digits_le' b m,
478+
end

0 commit comments

Comments
 (0)