-rw-r--r-- 1136 cryptattacktester-20231020/bit_vector_cost.cpp raw
#include <cassert> #include "bit_cost.h" #include "bit_vector_cost.h" bigint bit_vector_iszero_cost(bigint L) { return L; // XXX: can switch to nonzero to save 1 op } bigint bit_vector_compare_cost(bigint n) { if (n <= 0) return 0; return 2*n-1; } bigint bit_queue1_insert_cost(bigint q) { assert(q > 0); if (bit_mux_cost < bit_or_cost+bit_and_cost) return bit_or_cost+bit_mux_cost*(q-1); // q.at(i+1) = b.mux(q.at(i+1), q.at(i)); ... q.at(0) |= v; return bit_or_cost+(bit_or_cost+bit_and_cost)*(q-1); // q.at(i+1) |= b&q.at(i); ... q.at(0) |= v; } bigint bit_vector_integer_compare_cost(bigint n,bigint m) { return n+m; // XXX: can speed up circuit } bigint bit_vector_first_one_cost(bigint N) { bigint splitpos = 0; bigint split = 1; bigint result; while (split*2 < N) { ++splitpos; split *= 2; } for (bigint i = splitpos;i >= 0;--i) { result += split-1; // b |= v.at(j); result += 1; // idx.at(i) = ~b for (bigint j = 0;j < split;++j) if (j+split < N) result += bit_mux_cost; // v.at(j) = b.mux(v.at(j + split), v.at(j)); split >>= 1; } return result; }