@@ -17,54 +17,27 @@ Return the segment index for `n`.
17
17
- `n` starts from 0.
18
18
- segment index starts from 1.
19
19
-/
20
- partial
21
20
def segment (n : ℕ) : ℕ := match n with
22
21
| 0 => 1
23
22
| n =>
24
- if _h : n = 2 ^ ((n + 2 ).size - 1 ) - 2
25
- then 2 ^ ((n + 2 ).size - 2 )
23
+ if h : n = 2 ^ ((n + 2 ).size - 1 ) - 2
24
+ then 2 ^ ((n + 2 ).size - 2 )
26
25
else
27
- /-
28
- have order : 2 * n' - 2 < n := by
29
- simp [ n'_def ]
30
- by_cases n_le_1 : n ≤ 1
31
- · have cases : n = 0 ∨ n = 1 := by exact le_one_iff_eq_zero_or_eq_one.mp n_le_1
32
- rcases cases with n_eq_0|n_eq_1
33
- · simp [n_eq_0, size] at *
34
- simp [ n'_def ] at h
35
- · simp [n_eq_1, size] at *
36
- · have n_ge_2 : n ≥ 2 := by
37
- have : n > 1 := by exact Nat.lt_of_not_le n_le_1
38
- exact this
39
- have nsize2 : n.size ≥ 2 := by
40
- have t1 : n.size ≥ (2 : ℕ).size := by
41
- exact size_le_size n_ge_2
42
- have t2 : (2 : ℕ).size = 2 := by simp [size, binaryRec]
43
- simp [ t2 ] at t1
44
- exact t1
45
- have : 2 * 2 ^ (n.size - 2) = 2 ^ (n.size - 1) := by
46
- have : 2 * 2 ^ (n.size - 2) = 2 ^ (n.size - 2 + 1) := by
47
- exact Eq.symm Nat.pow_succ'
48
- simp [ this ]
49
- rw [ add_comm ]
50
- refine Eq.symm ((fun {b a c} h ↦ (Nat.sub_eq_iff_eq_add' h).mp) ?_ rfl)
51
- · exact le_sub_one_of_lt nsize2
52
- simp [ this ]
53
- refine Nat.sub_lt_right_of_lt_add ?_ ?_
54
- · exact le_pow (zero_lt_sub_of_lt nsize2)
55
- · have t1 : 2 ^ (n.size - 1) ≤ n := by
56
- exact n_ge_subenvelope (one_le_of_lt n_ge_2)
57
- have t2 : 2 ^ (n.size - 1) < n + 1 := by exact Order.lt_add_one_iff.mpr t1
58
- exact lt_succ_of_lt t2
59
- have decreasing : n - (2 * n' - 2) - 1 < n := by
60
- have : 2 * n' - 2 ≥ 0 := by exact Nat.zero_le (2 * n' - 2)
61
- replace : n - (2 * n' - 2) ≤ n := by exact sub_le n (2 * n' - 2)
62
- by_cases x : n - (2 * n' - 2) ≥ 1
63
- · exact sub_one_lt_of_le x this
64
- · exact sub_one_lt_of_le (zero_lt_sub_of_lt order) this
65
- -/
66
- 2 ^ ((n + 2 ).size - 2 ) +
67
- segment (n - (2 ^ ((n + 2 ).size - 1 ) - 1 ))
26
+ have n2size : (n + 2 ).size ≥ 2 := by
27
+ have s1 : (n + 2 ).size ≥ (0 + 2 ).size := by
28
+ exact size_le_size (Nat.le_add_left (0 + 2 ) n)
29
+ have s2 : (0 + 2 ).size = 2 := by simp [size, binaryRec]
30
+ simp [s2] at s1
31
+ exact s1
32
+ have order : n - (2 ^ ((n + 2 ).size - 1 ) - 1 ) < n := by
33
+ have s1 : 0 < 2 ^ ((n + 2 ).size - 1 ) - 1 := by
34
+ refine zero_lt_sub_of_lt ?_
35
+ · exact Nat.one_lt_two_pow (Nat.sub_ne_zero_iff_lt.mpr n2size)
36
+ refine sub_lt ?_ s1
37
+ · by_contra n_eq_0
38
+ simp at n_eq_0
39
+ simp [n_eq_0, size, binaryRec] at h
40
+ 2 ^ ((n + 2 ).size - 2 ) + segment (n - (2 ^ ((n + 2 ).size - 1 ) - 1 ))
68
41
69
42
#eval ! List.range 32 |>.map (fun n ↦ (n, LubySegment.segment n))
70
43
#eval ! List.range 8 |>.map (2 ^ ·.succ - 2 ) |>.map (fun n ↦ (n, LubySegment.segment n))
0 commit comments