From 30f6ad314d12f07835eb97df4c331c691883883d Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 15 Jul 2022 08:30:22 +0900 Subject: [PATCH] bigint.c (mpz_get_str): stringify multiple digits at once. Instead of dividing by 10, 10000 (32 bit) or 100000000 (64 bit), for example (Karatsuba method?). --- mrbgems/mruby-bigint/core/bigint.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index 05b743a6a..f61d8d694 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -684,9 +684,15 @@ mpz_get_str(mrb_state *mrb, char *s, mrb_int sz, mrb_int base, mpz_t *x) } char *ps = s; + char *se = s+sz; int xlen = digits(x); mp_limb *t = (mp_limb*)mrb_malloc(mrb, xlen*sizeof(mp_limb)); memcpy(t, x->p, xlen*sizeof(mp_limb)); + mp_limb b2 = base; + const int blim = (sizeof(mp_limb)==sizeof(int))?(base<=10?4:3):(base<=10?9:5); + for (int i=1; i= t) { mp_limb d0 = *d, d1; a = (a<