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