2
0
Эх сурвалжийг харах

big: Switch `choose` over to internal implementations.

Jeroen van Rijn 4 жил өмнө
parent
commit
6298226238

+ 7 - 6
core/math/big/basic.odin

@@ -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 = 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;	
 	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.
 		*/
 		*/

+ 2 - 1
core/math/big/build.bat

@@ -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

+ 7 - 17
core/math/big/example.odin

@@ -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);
-		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() {
 main :: proc() {