From 629822623803b4ccac41b2b3830779ed1b52781a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 6 Aug 2021 22:58:39 +0200 Subject: [PATCH] big: Switch `choose` over to internal implementations. --- core/math/big/basic.odin | 13 +++++++------ core/math/big/build.bat | 3 ++- core/math/big/example.odin | 24 +++++++----------------- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/core/math/big/basic.odin b/core/math/big/basic.odin index b3dd941ac..ecd861001 100644 --- a/core/math/big/basic.odin +++ b/core/math/big/basic.odin @@ -269,7 +269,7 @@ factorial :: proc { int_factorial, }; */ int_choose_digit :: proc(res: ^Int, n, k: int) -> (err: Error) { if res == nil { return .Invalid_Pointer; } - if err = clear_if_uninitialized(res); err != nil { return err; } + if n < 0 || n > _FACTORIAL_MAX_N { return .Invalid_Argument; } if k > n { return zero(res); } @@ -279,12 +279,12 @@ int_choose_digit :: proc(res: ^Int, n, k: int) -> (err: Error) { n_fac, k_fac, n_minus_k_fac := &Int{}, &Int{}, &Int{}; defer destroy(n_fac, k_fac, n_minus_k_fac); - if err = factorial(n_minus_k_fac, n - k); err != nil { return err; } - if err = factorial(k_fac, k); err != nil { return err; } - if err = mul(k_fac, k_fac, n_minus_k_fac); err != nil { return err; } + if err = #force_inline internal_int_factorial(n_minus_k_fac, n - k); err != nil { return err; } + if err = #force_inline internal_int_factorial(k_fac, k); err != nil { return err; } + if err = #force_inline internal_mul(k_fac, k_fac, n_minus_k_fac); err != nil { return err; } - if err = factorial(n_fac, n); err != nil { return err; } - if err = div(res, n_fac, k_fac); err != nil { return err; } + if err = #force_inline internal_int_factorial(n_fac, n); err != nil { return err; } + if err = #force_inline internal_div(res, n_fac, k_fac); err != nil { return err; } return err; } @@ -323,6 +323,7 @@ _int_mul :: proc(dest, a, b: ^Int, digits: int) -> (err: Error) { pb := min(b.used, digits - ix); carry := _WORD(0); iy := 0; + /* Compute the column of the output and propagate the carry. */ diff --git a/core/math/big/build.bat b/core/math/big/build.bat index 891a55b21..1921803b5 100644 --- a/core/math/big/build.bat +++ b/core/math/big/build.bat @@ -1,5 +1,6 @@ @echo off -odin run . -vet -o:size +odin run . -vet +: -o:size :odin build . -build-mode:shared -show-timings -o:minimal -no-bounds-check :odin build . -build-mode:shared -show-timings -o:size -no-bounds-check :odin build . -build-mode:shared -show-timings -o:size diff --git a/core/math/big/example.odin b/core/math/big/example.odin index 60e06837d..73b922993 100644 --- a/core/math/big/example.odin +++ b/core/math/big/example.odin @@ -65,26 +65,16 @@ demo :: proc() { a, b, c, d, e, f := &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{}; defer destroy(a, b, c, d, e, f); - N := 10_000; + n := 50_000; + k := 3; - FACTORIAL_10_000_FIRST_100 :: "46AB3AE48966202D0FDE097BFA88FADC512AE8AFC0EA1D1D376A4109F10105E9E21F1E907151E85F926B8D82737B9030D572"; - - for _ in 0..10 { - SCOPED_TIMING(.factorial); - factorial(a, N); - } - - as, _ := itoa(a, 16); - defer delete(as); - - fmt.printf("factorial(%v): %v (first 50 hex digits)\n", N, as[:50]); - - if as[:100] == FACTORIAL_10_000_FIRST_100 { - fmt.println("\nCorrect!"); - } else { - fmt.printf("\nWrong. Expected: %v\n", FACTORIAL_10_000_FIRST_100); + SCOPED_TIMING(.choose); + choose(a, n, k); } + + fmt.printf("%v choose %v ", n, k); + print("= ", a); } main :: proc() {