Add own bitarray and Miller-Rabin primality test.
This commit is contained in:
39
python/lib_bitarray.py
Normal file
39
python/lib_bitarray.py
Normal file
@@ -0,0 +1,39 @@
|
||||
class Bitarray:
|
||||
def __init__(self, num_bits):
|
||||
self.word_size = 32
|
||||
self.word_mask = 2**self.word_size - 1
|
||||
num_words = num_bits // self.word_size
|
||||
if num_bits % self.word_size != 0:
|
||||
num_words += 1
|
||||
self.num_bits = num_bits
|
||||
self.num_words = num_words
|
||||
self.array = [0] * num_words
|
||||
|
||||
def setall(self, target: bool):
|
||||
if target:
|
||||
self.array = [self.word_mask] * self.num_words
|
||||
else:
|
||||
self.array = [0] * self.num_words
|
||||
|
||||
def set(self, bit, target: bool):
|
||||
assert(bit < self.num_bits)
|
||||
word_index = bit // self.word_size
|
||||
bit_index = bit % self.word_size
|
||||
value = self.array[word_index]
|
||||
if target:
|
||||
value = (value | (1 << bit_index))
|
||||
else:
|
||||
value = (value & (~(1 << bit_index)))
|
||||
self.array[word_index] = value
|
||||
|
||||
def get(self, bit) -> bool:
|
||||
assert(bit < self.num_bits)
|
||||
word_index = bit // self.word_size
|
||||
bit_index = bit % self.word_size
|
||||
return bool(self.array[word_index] & (1 << bit_index))
|
||||
|
||||
def __getitem__(self, bit: int) -> bool:
|
||||
return self.get(bit)
|
||||
|
||||
def __setitem__(self, bit: int, value: bool):
|
||||
self.set(bit, value)
|
||||
Reference in New Issue
Block a user