mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 23:58:50 +00:00
big: Switch choose over to internal implementations.
This commit is contained in:
@@ -269,7 +269,7 @@ factorial :: proc { int_factorial, };
|
|||||||
*/
|
*/
|
||||||
int_choose_digit :: proc(res: ^Int, n, k: int) -> (err: Error) {
|
int_choose_digit :: proc(res: ^Int, n, k: int) -> (err: Error) {
|
||||||
if res == nil { return .Invalid_Pointer; }
|
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); }
|
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{};
|
n_fac, k_fac, n_minus_k_fac := &Int{}, &Int{}, &Int{};
|
||||||
defer destroy(n_fac, k_fac, n_minus_k_fac);
|
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 = #force_inline internal_int_factorial(n_minus_k_fac, n - k); err != nil { return err; }
|
||||||
if err = factorial(k_fac, k); err != nil { return err; }
|
if err = #force_inline internal_int_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_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 = #force_inline internal_int_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_div(res, n_fac, k_fac); err != nil { return err; }
|
||||||
|
|
||||||
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);
|
pb := min(b.used, digits - ix);
|
||||||
carry := _WORD(0);
|
carry := _WORD(0);
|
||||||
iy := 0;
|
iy := 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compute the column of the output and propagate the carry.
|
Compute the column of the output and propagate the carry.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
@echo off
|
@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: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 -no-bounds-check
|
||||||
:odin build . -build-mode:shared -show-timings -o:size
|
:odin build . -build-mode:shared -show-timings -o:size
|
||||||
|
|||||||
@@ -65,26 +65,16 @@ demo :: proc() {
|
|||||||
a, b, c, d, e, f := &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{};
|
a, b, c, d, e, f := &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{};
|
||||||
defer destroy(a, b, c, d, e, f);
|
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);
|
SCOPED_TIMING(.choose);
|
||||||
factorial(a, N);
|
choose(a, n, k);
|
||||||
}
|
}
|
||||||
|
|
||||||
as, _ := itoa(a, 16);
|
fmt.printf("%v choose %v ", n, k);
|
||||||
defer delete(as);
|
print("= ", a);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
main :: proc() {
|
main :: proc() {
|
||||||
|
|||||||
Reference in New Issue
Block a user