From cad52ec9b82015c352e39fbe6cf72234d097ca2b Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Thu, 1 Sep 2022 23:06:51 +0200 Subject: More work on division --- std/Number.bruijn | 67 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/std/Number.bruijn b/std/Number.bruijn index a67d206..3049dad 100644 --- a/std/Number.bruijn +++ b/std/Number.bruijn @@ -107,11 +107,15 @@ lst [0 t⁰ [t⁻] [t⁺] [t⁰]] :test (lst (+42)) (t⁰) # extracts most significant trit from balanced ternary numbers -# TODO: Find a more elegant way to do this (and resolve list import loop?) +# TODO: Find a more elegant/fast way to do this (and resolve list import loop?) +# mst z [[[rec]]] (+0) +# rec =?0 case-end case-mst +# case-mst 2 0 /³0 +# case-end lst 1 mst [fix (last (list! %0))] - last z [[<>?0 [false] [<>?(~1) ^1 (2 ~1)] i]] + last z [[<>?0 [false] (<>?(~0) ^0 (1 ~0))]] <>?‣ [0 [[[false]]] true] - fix [((t⁻? 0) ⋁? ((t⁺? 0) ⋁? (t⁰? 0))) 0 t⁰] + fix [((t⁻? 0) ⋁? (t⁺? 0) ⋁? (t⁰? 0)) 0 t⁰] :test (mst (-1)) (t⁻) :test (mst (+0)) (t⁰) @@ -327,6 +331,15 @@ geq? \leq? :test ((+2) ≥? (+2)) (true) :test ((+3) ≥? (+2)) (true) +# negates a balanced ternary number if <0 +abs [?(^0) case-gre (?(~1))) (0 : (~1 + 4)) 1] - case-les huh (^0 + 1) - huh [((-0 >? ^1) ⋁? ((-0 =? ^1) ⋀? ? 0) case-end case-count + case-count 4 ++3 (2 + 1) 1 0 case-end 3 -mod ^‣ ∘∘ remquo +…/!… brute-div -…%… mod +:test ((+4) /! (+2)) ((+2)) +:test ((+4) /! (+4)) ((+1)) +:test ((+4) /! (+5)) ((+0)) + +# TODO: fix for negative numbers +brute-mod \[z [[[[[rec]]]]] (+0) 0 0] + rec (2 >? 0) case-end case-count + case-count 4 ++3 (2 + 1) 1 0 + case-end 0 - (3 * 1) + +…%!… brute-mod + +# finds quotient and remainder using long division +# WARNING: don't use; incorrect and slow +quot-rem [[z [[[[rec]]]] ((+1) : (+0)) 1 0]] + rec (1 =? 0) case-eq ((1