mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 20:10:17 +00:00
...
This commit is contained in:
parent
e34c4d98af
commit
94bdfaa949
@ -59,6 +59,17 @@ def ulong_add(a: list, b: list) -> list:
|
|||||||
res.append(carry)
|
res.append(carry)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def ulong_inc_(a: list):
|
||||||
|
a[0] += 1
|
||||||
|
for i in range(len(a)):
|
||||||
|
if a[i] < PyLong_BASE: break
|
||||||
|
a[i] -= PyLong_BASE
|
||||||
|
if i+1 == len(a):
|
||||||
|
a.append(1)
|
||||||
|
else:
|
||||||
|
a[i+1] += 1
|
||||||
|
|
||||||
|
|
||||||
def ulong_sub(a: list, b: list) -> list:
|
def ulong_sub(a: list, b: list) -> list:
|
||||||
# a >= b
|
# a >= b
|
||||||
res = []
|
res = []
|
||||||
@ -95,6 +106,13 @@ def ulong_divmodi(a: list, b: int):
|
|||||||
ulong_unpad_(res)
|
ulong_unpad_(res)
|
||||||
return res, carry
|
return res, carry
|
||||||
|
|
||||||
|
def ulong_divmod(a: list, b: list):
|
||||||
|
q = [0]
|
||||||
|
while ulong_cmp(a, b) >= 0:
|
||||||
|
ulong_inc_(q)
|
||||||
|
a = ulong_sub(a, b)
|
||||||
|
return q, a
|
||||||
|
|
||||||
def ulong_floordivi(a: list, b: int):
|
def ulong_floordivi(a: list, b: int):
|
||||||
# b > 0
|
# b > 0
|
||||||
return ulong_divmodi(a, b)[0]
|
return ulong_divmodi(a, b)[0]
|
||||||
@ -178,6 +196,9 @@ class long:
|
|||||||
self.digits, self.sign = x.digits.copy(), x.sign
|
self.digits, self.sign = x.digits.copy(), x.sign
|
||||||
else:
|
else:
|
||||||
raise TypeError('expected int or str')
|
raise TypeError('expected int or str')
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.digits)
|
||||||
|
|
||||||
def __add__(self, other):
|
def __add__(self, other):
|
||||||
if type(other) is int:
|
if type(other) is int:
|
||||||
@ -239,16 +260,20 @@ class long:
|
|||||||
#######################################################
|
#######################################################
|
||||||
def __divmod__(self, other):
|
def __divmod__(self, other):
|
||||||
if type(other) is int:
|
if type(other) is int:
|
||||||
assert type(other) is int and other > 0
|
assert self.sign == 1 and other > 0
|
||||||
assert self.sign == 1
|
|
||||||
q, r = ulong_divmodi(self.digits, other)
|
q, r = ulong_divmodi(self.digits, other)
|
||||||
return long((q, 1)), r
|
return long((q, 1)), r
|
||||||
|
if type(other) is long:
|
||||||
|
assert self.sign == 1 and other.sign == 1
|
||||||
|
q, r = ulong_divmod(self.digits, other.digits)
|
||||||
|
assert len(other)>1 or other.digits[0]>0
|
||||||
|
return long((q, 1)), long((r, 1))
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
def __floordiv__(self, other: int):
|
def __floordiv__(self, other):
|
||||||
return self.__divmod__(other)[0]
|
return self.__divmod__(other)[0]
|
||||||
|
|
||||||
def __mod__(self, other: int):
|
def __mod__(self, other):
|
||||||
return self.__divmod__(other)[1]
|
return self.__divmod__(other)[1]
|
||||||
|
|
||||||
def __pow__(self, other: int):
|
def __pow__(self, other: int):
|
||||||
|
@ -23,4 +23,12 @@ for i in range(29):
|
|||||||
for i in range(29):
|
for i in range(29):
|
||||||
assert 2L ** i >> i == 1L
|
assert 2L ** i >> i == 1L
|
||||||
|
|
||||||
assert 12L >> 100 == 0
|
assert 12L >> 100 == 0
|
||||||
|
|
||||||
|
a = 32764L
|
||||||
|
s = []
|
||||||
|
while a != 0:
|
||||||
|
a, r = divmod(a, 10L)
|
||||||
|
s.append(r)
|
||||||
|
|
||||||
|
assert s == [4, 6, 7, 2, 3]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user