def __mul__(self, other): if isinstance(other, sbits): return self.from_vec(other * x for x in self.v) matrix = [] for i, b in enumerate(util.bit_decompose(other)): matrix.append([x * b for x in self.v[:len(self.v) - i]]) v = sbitint.wallace_tree_from_matrix(matrix) return self.from_vec(v[:len(self.v)])
def xor_int(self, other): if other == 0: return self self_bits = self.bit_decompose() other_bits = util.bit_decompose(other, max(self.n, util.int_len(other))) extra_bits = [self.new(b, n=1) for b in other_bits[self.n:]] return self.bit_compose([~x if y else x \ for x,y in zip(self_bits, other_bits)] \ + extra_bits)
def xor_int(self, other): if other == 0: return self self_bits = self.bit_decompose() other_bits = util.bit_decompose(other, max(self.n, util.int_len(other))) extra_bits = [self.new(b, n=1) for b in other_bits[self.n:]] return self.bit_compose([~x if y else x \ for x,y in zip(self_bits, other_bits)] \ + extra_bits)
def mul_int(self, other): if other == 0: return 0 elif other == 1: return self elif self.n == 1: bits = util.bit_decompose(other, util.int_len(other)) zero = sbit(0) mul_bits = [self if b else zero for b in bits] return self.bit_compose(mul_bits) else: print self.n, other return NotImplemented
def mul_int(self, other): if other == 0: return 0 elif other == 1: return self elif self.n == 1: bits = util.bit_decompose(other, util.int_len(other)) zero = sbit(0) mul_bits = [self if b else zero for b in bits] return self.bit_compose(mul_bits) else: print self.n, other return NotImplemented
def __init__(self, value, start, lengths, entries_per_block): oram.Block.__init__(self, value, lengths) length = sum(self.lengths) used_bits = entries_per_block * length self.value_bits = self.value.bit_decompose(used_bits) start_length = util.log2(entries_per_block) self.start_bits = util.bit_decompose(start, start_length) self.start_demux = oram.demux_list(self.start_bits) self.entries = [sbits.bit_compose(self.value_bits[i*length:][:length]) \ for i in range(entries_per_block)] self.mul_entries = list(map(operator.mul, self.start_demux, self.entries)) self.bits = sum(self.mul_entries).bit_decompose() self.mul_value = sbits.compose(self.mul_entries, sum(self.lengths)) self.anti_value = self.mul_value + self.value
def __init__(self, value, start, lengths, entries_per_block): oram.Block.__init__(self, value, lengths) length = sum(self.lengths) used_bits = entries_per_block * length self.value_bits = self.value.bit_decompose(used_bits) start_length = util.log2(entries_per_block) self.start_bits = util.bit_decompose(start, start_length) self.start_demux = oram.demux_list(self.start_bits) self.entries = [sbits.bit_compose(self.value_bits[i*length:][:length]) \ for i in range(entries_per_block)] self.mul_entries = map(operator.mul, self.start_demux, self.entries) self.bits = sum(self.mul_entries).bit_decompose() self.mul_value = sbits.compose(self.mul_entries, sum(self.lengths)) self.anti_value = self.mul_value + self.value
def compose(cls, items, bit_length=1): return cls.bit_compose(sum([util.bit_decompose(item, bit_length) for item in items], []))
def coerce(self, other): if util.is_constant(other): return self.from_vec(util.bit_decompose(other, n)) else: return super(sbitvecn, self).coerce(other)
def compose(cls, items, bit_length=1): return cls.bit_compose(sum([util.bit_decompose(item, bit_length) for item in items], []))