From fce366dd702be5ed333363ab6a4808363871c41e Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sat, 27 Jul 2024 20:13:12 +0200 Subject: Improved division by several magnitudes --- std/Number/Ternary.bruijn | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'std/Number/Ternary.bruijn') diff --git a/std/Number/Ternary.bruijn b/std/Number/Ternary.bruijn index 2ad5059..fcc6ca6 100644 --- a/std/Number/Ternary.bruijn +++ b/std/Number/Ternary.bruijn @@ -102,6 +102,7 @@ lst [0 t⁰ [t⁻] [t⁺] [t⁰]] ⧗ Number → Trit :test (lst (+42)) (t⁰) # extracts most significant trit from a balanced ternary number +# does not ignore leading 0s mst* [B.get t⁰ (0 z a⁻ a⁺ a⁰)] ⧗ Number → Trit z B.empty a⁻ \B.store! t⁻ @@ -306,6 +307,14 @@ number→trits [0 z a⁻ a⁺ a⁰] ⧗ Number → (List Trit) :test (number→trits (+0)) ([[0]]) :test (number→trits (+5)) (t⁻ : (t⁻ : (t⁺ : [[0]]))) +# extracts nth trit from balanced ternary number (lst = index 0) +nth-trit \(index ∘ number→trits) ⧗ Number → Number → (List Trit) + index z [[[1 [[[=?3 2 (5 1 --3)]]] t⁰]]] ⧗ (List Trit) → Number → Trit + +:test (nth-trit (+0) (-42)) (t⁰) +:test (nth-trit (+4) (-42)) (t⁻) +:test (nth-trit (+5) (-42)) (t⁰) + # strips leading 0s from a balanced ternary number strip [^(0 z a⁻ a⁺ a⁰)] ⧗ Number → Number z (+0) : true @@ -411,21 +420,21 @@ ternary-search z [[[[rec]]]] ⧗ (Number → Number) → Number → Number → N pad y [[[(log₃* 0) ? 3 ←0 0] + left trim ((nth-trit --2 0) ↑ 1) + right trim ↑⁰0 # "efficient" quotient/remainder implementation for balanced ternary # technique by Douglas W. Jones -# algorithm originally intended for fixed-width numbers (=> ugly hacks with force+log₃) +# algorithm originally intended for fixed-width numbers (=> ugly hacks) # TODO: remove the final `huh` correction step (probably some off-by-one bug?) -# TODO: not actually that efficient right now quot-rem [[[[[z [[[[rec]]]] 1 (+0) 4]]] ?1 ⋀? 6) ⋁? (