-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;
}