Skip to content
Merged
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,18 @@ Additions to existing modules
map : P ⊆ Q → All P xs → All Q xs
```

* In `Data.Nat.Logarithm`
```agda
2^⌊log₂n⌋≤n : ∀ n .{{ _ : NonZero n }} → 2 ^ ⌊log₂ n ⌋ ≤ n
n≤2^⌈log₂n⌉ : ∀ n → n ≤ 2 ^ ⌈log₂ n ⌉
```

* In `Data.Nat.Logarithm.Core`
```agda
2^⌊log2n⌋≤n : ∀ n .{{_ : NonZero n}} → (acc : Acc _<_ n) → 2 ^ (⌊log2⌋ n acc) ≤ n
n≤2^⌈log2n⌉ : ∀ n → (acc : Acc _<_ n) → n ≤ 2 ^ (⌈log2⌉ n acc)
```

* In `Data.Nat.ListAction.Properties`
```agda
*-distribˡ-sum : ∀ m ns → m * sum ns ≡ sum (map (m *_) ns)
Expand All @@ -248,6 +260,7 @@ Additions to existing modules
≟-≢ : (m≢n : m ≢ n) → (m ≟ n) ≡ no m≢n
∸-suc : m ≤ n → suc n ∸ m ≡ suc (n ∸ m)
^-distribʳ-* : ∀ m n o → (n * o) ^ m ≡ n ^ m * o ^ m
2*suc[n]≡2+n+n : ∀ n → 2 * (suc n) ≡ 2 + (n + n)
```

* In `Data.Product.Properties`:
Expand Down
6 changes: 6 additions & 0 deletions src/Data/Nat/Logarithm.agda
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ open import Relation.Binary.PropositionalEquality.Core using (_≡_)
⌊log₂[2^n]⌋≡n : ∀ n → ⌊log₂ (2 ^ n) ⌋ ≡ n
⌊log₂[2^n]⌋≡n n = ⌊log2⌋2^n≡n n

2^⌊log₂n⌋≤n : ∀ n .{{ _ : NonZero n }} → 2 ^ ⌊log₂ n ⌋ ≤ n
2^⌊log₂n⌋≤n n = 2^⌊log2n⌋≤n n (<-wellFounded n)

------------------------------------------------------------------------
-- Properties of ⌈log₂_⌉

Expand All @@ -55,3 +58,6 @@ open import Relation.Binary.PropositionalEquality.Core using (_≡_)

⌈log₂2^n⌉≡n : ∀ n → ⌈log₂ (2 ^ n) ⌉ ≡ n
⌈log₂2^n⌉≡n n = ⌈log2⌉2^n≡n n

n≤2^⌈log₂n⌉ : ∀ n → n ≤ 2 ^ ⌈log₂ n ⌉
n≤2^⌈log₂n⌉ n = n≤2^⌈log2n⌉ n (<-wellFounded n)
26 changes: 26 additions & 0 deletions src/Data/Nat/Logarithm/Core.agda
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,18 @@ open import Relation.Binary.PropositionalEquality.Properties
suc n ∎
where open ≡-Reasoning

2^⌊log2n⌋≤n : ∀ n .{{_ : NonZero n}} → (acc : Acc _<_ n) → 2 ^ (⌊log2⌋ n acc) ≤ n
2^⌊log2n⌋≤n (suc zero) _ = ≤-refl
2^⌊log2n⌋≤n (suc (suc n)) (acc rs) = begin
2 ^ (⌊log2⌋ (suc (suc n)) (acc rs)) ≡⟨⟩
2 * 2 ^ (⌊log2⌋ (suc ⌊ n /2⌋) _) ≤⟨ *-monoʳ-≤ 2 (2^⌊log2n⌋≤n _ _) ⟩
2 * (suc ⌊ n /2⌋) ≡⟨ 2*suc[n]≡2+n+n _ ⟩
2 + (⌊ n /2⌋ + ⌊ n /2⌋) ≤⟨ +-monoʳ-≤ (2 + ⌊ n /2⌋) (⌊n/2⌋≤⌈n/2⌉ _) ⟩
2 + (⌊ n /2⌋ + ⌈ n /2⌉) ≡⟨ cong (2 +_) (⌊n/2⌋+⌈n/2⌉≡n _) ⟩
2 + n
where open ≤-Reasoning

------------------------------------------------------------------------
-- Properties of ⌈log2⌉

Expand Down Expand Up @@ -124,3 +136,17 @@ open import Relation.Binary.PropositionalEquality.Properties
1 + ⌈log2⌉ (2 ^ n) (<-wellFounded _) ≡⟨ cong suc (⌈log2⌉2^n≡n n) ⟩
suc n ∎
where open ≡-Reasoning

n≤2^⌈log2n⌉ : ∀ n → (acc : Acc _<_ n) → n ≤ 2 ^ (⌈log2⌉ n acc)
n≤2^⌈log2n⌉ zero _ = z≤n
n≤2^⌈log2n⌉ (suc zero) _ = s≤s z≤n
n≤2^⌈log2n⌉ (suc (suc n)) (acc rs) =
begin
2 + n ≡⟨ cong (2 +_) (⌊n/2⌋+⌈n/2⌉≡n _) ⟨
2 + (⌊ n /2⌋ + ⌈ n /2⌉) ≤⟨ +-monoʳ-≤ 2 (+-monoˡ-≤ _ (⌊n/2⌋≤⌈n/2⌉ n)) ⟩
2 + (⌈ n /2⌉ + ⌈ n /2⌉) ≡⟨ 2*suc[n]≡2+n+n _ ⟨
2 * (suc ⌊ suc n /2⌋) ≤⟨ *-monoʳ-≤ 2 (n≤2^⌈log2n⌉ (suc ⌊ suc n /2⌋) _) ⟩
2 * 2 ^ (⌈log2⌉ (suc ⌊ suc n /2⌋) _) ≡⟨⟩
2 ^ (⌈log2⌉ (2 + n) (acc rs))
where open ≤-Reasoning
6 changes: 6 additions & 0 deletions src/Data/Nat/Properties.agda
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,12 @@ m+n≮m m n = subst (_≮ m) (+-comm n m) (m+n≮n n m)
suc (m + (n + m * n)) ≡⟨⟩
suc m + suc m * n ∎

2*suc[n]≡2+n+n : ∀ n → 2 * (suc n) ≡ 2 + (n + n)
2*suc[n]≡2+n+n n = begin-equality
2 * (suc n) ≡⟨ cong (suc n +_) (+-identityʳ _) ⟩
suc n + suc n ≡⟨ +-suc (suc n) n ⟩
2 + (n + n) ∎

------------------------------------------------------------------------
-- Algebraic properties of _*_

Expand Down