-rw-r--r-- 1853 cryptattacktester-20231020/index_cost.cpp raw
#include <cassert> #include "sorting_cost.h" #include "bit_vector_cost.h" #include "index_cost.h" bigint bit_vector_add_cost(bigint xbits,bigint ybits) { if (ybits > xbits) return bit_vector_add_cost(ybits,xbits); bigint result = 0; result += ybits*5; // full adder result += (xbits-ybits)*2; // half adder return result; } bigint bit_vector_hamming_weight_cost(bigint n) { if (n <= 1) return 0; bigint x = 1; x <<= nbits(n)-1; x -= 1; bigint y = n-x-1; bigint result = 0; result += bit_vector_hamming_weight_cost(x); // bit_vector_hamming_weight(bit_vector_extract(v, 0, x)); result += bit_vector_hamming_weight_cost(y); // bit_vector_hamming_weight(bit_vector_extract(v, x, x + y)); result += bit_vector_add_cost(x ? nbits(x) : bigint(0),y ? nbits(y) : bigint(0)); return result; } bigint bit_vector_hamming_weight_isnot_cost(bigint bits,bigint target) { bigint wbits = nbits(bits); bigint targetbits = nbits(target); assert(targetbits <= wbits); return bit_vector_hamming_weight_cost(bits)+wbits; } bigint set_size_cost(bigint indices,bigint idx_bits) { if (indices <= 0) return 0; bigint result = 0; result += sorting_cost(indices,idx_bits); result += indices-1; // v.at(i+0) & v.at(i+1); result += (indices-1)*bit_vector_compare_cost(idx_bits); // bit_vector_compare(set.at(i+0), set.at(i+1)) result += indices-1; // b.andn result += 2*(indices-1); // v.at(i+0) ^= b; v.at(i+1) ^= b; result += bit_vector_hamming_weight_cost(indices); // bit_vector_hamming_weight(v); return result; } bigint set_size_check_cost(bigint indices,bigint idx_bits,bigint target) { bigint result = set_size_cost(indices,idx_bits); result += 1+bit_vector_integer_compare_cost(nbits(indices),nbits(target)); // ~bit_vector_integer_compare(w_set, w_vec); // XXX: can speed up circuit return result; }