blueloveTH 2 lat temu
rodzic
commit
5ee3779a6b
1 zmienionych plików z 21 dodań i 0 usunięć
  1. 21 0
      src/pocketpy.h

+ 21 - 0
src/pocketpy.h

@@ -100,6 +100,19 @@ inline void init_builtins(VM* _vm) {
         return VAR(MappingProxy(mod));
     });
 
+    _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
+        i64 res = 1;
+        while(rhs){
+            if(rhs & 1) res = res*lhs % mod;
+            lhs = lhs*lhs % mod;
+            rhs >>= 1;
+        }
+        return VAR(res);
+    });
+
     _vm->bind_builtin_func<1>("id", [](VM* vm, ArgsView args) {
         PyObject* obj = args[0];
         if(is_tagged(obj)) return vm->None;
@@ -301,6 +314,14 @@ inline void init_builtins(VM* _vm) {
         return vm->None;
     });
 
+    _vm->bind_method<0>("int", "bit_length", [](VM* vm, ArgsView args) {
+        i64 x = _CAST(i64, args[0]);
+        if(x < 0) x = -x;
+        int bits = 0;
+        while(x){ x >>= 1; bits++; }
+        return VAR(bits);
+    });
+
     _vm->bind__floordiv__(_vm->tp_int, [](VM* vm, PyObject* lhs_, PyObject* rhs_) {
         i64 rhs = CAST(i64, rhs_);
         return VAR(_CAST(i64, lhs_) / rhs);