From 3b6da19781db32ad406eca6b8c37f7d6057f21e8 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Fri, 16 Jun 2023 00:51:42 +0800 Subject: [PATCH] ... --- src/pocketpy.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/pocketpy.h b/src/pocketpy.h index a307f25e..2fc59c04 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -100,15 +100,26 @@ inline void init_builtins(VM* _vm) { return VAR(MappingProxy(mod)); }); + static const auto _mul = [](i64 a, i64 b, i64 c){ + if(c < 16384) return (a%c) * (b%c) % c; + i64 res = 0; + while(b > 0){ + if(b & 1) res = (res + a) % c; + a = (a << 1) % c; + b >>= 1; + } + return res; + }; + _vm->bind_builtin_func<3>("pow", [](VM* vm, ArgsView args) { i64 lhs = CAST(i64, args[0]); // assume lhs>=0 i64 rhs = CAST(i64, args[1]); // assume rhs>=0 i64 mod = CAST(i64, args[2]); // assume mod>0, mod*mod should not overflow i64 res = 1; + lhs %= mod; while(rhs){ - i64 lhs_mod = lhs % mod; - if(rhs & 1) res = ((res % mod) * lhs_mod) % mod; - lhs = (lhs_mod * lhs_mod) % mod; + if(rhs & 1) res = _mul(res, lhs, mod); + lhs = _mul(lhs, lhs, mod); rhs >>= 1; } return VAR(res);