From e8fe33439614a0041aaa967e2435724a195eec8c Mon Sep 17 00:00:00 2001 From: Mike <45243121+tankf33der@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:13:07 +0300 Subject: [PATCH] math.big: speed up ~10x integer_from_radix() (#24674) --- vlib/math/big/integer.v | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/vlib/math/big/integer.v b/vlib/math/big/integer.v index 908f82f337..733a318fd0 100644 --- a/vlib/math/big/integer.v +++ b/vlib/math/big/integer.v @@ -1,5 +1,6 @@ module big +import math import math.bits import strings import strconv @@ -272,13 +273,17 @@ fn integer_from_regular_string(characters string, radix u32) Integer { mut result := zero_int radix_int := integer_from_u32(radix) - - for index := start_index; index < characters.len; index++ { - digit := characters[index] - value := digit_array.index(digit) - - result *= radix_int - result += integer_from_int(value) + pow := radix_options[int(radix)] + radix_pow := radix_int.pow(u32(pow)) + for i := start_index; i < characters.len; i += pow { + end := math.min(i + pow, characters.len) + num_str := characters[i..end] + if num_str.len == pow { + result *= radix_pow + } else { + result *= radix_int.pow(u32(num_str.len)) + } + result += integer_from_u32(regular_string_to_radix(num_str, radix)) } return Integer{ @@ -287,6 +292,15 @@ fn integer_from_regular_string(characters string, radix u32) Integer { } } +fn regular_string_to_radix(characters string, radix u32) u32 { + mut result := u32(0) + + for c in characters { + result = result * radix + u32(digit_array.index(c)) + } + return result +} + // abs returns the absolute value of the integer `a`. pub fn (a Integer) abs() Integer { return if a.signum == 0 {