-rw-r--r-- 1567 cryptattacktester-20230614/subset.h raw
#ifndef SUBSET_H
#define SUBSET_H
#include "bigint.h"
#include "bit_vector.h"
static inline void subset(vector<vector<bit>> &L_sum,
                          vector<vector<vector<bit>>> &L_set,
                          bigint m, bigint n, const bigint idx_bits,
                          const vector<bit> &s, 
                          const vector<vector<bit>> &H, 
                          vector<bigint> prefix = vector<bigint>(0),
                          vector<vector<bit>> precomputed = vector<vector<bit>>(0)) 
{
	if (precomputed.size() == 0)
	{
		precomputed.push_back(H.at(0));
		for (bigint i = 1; i < n; i++)
			precomputed.push_back(bit_vector_xor(H.at(i), precomputed.at(i-1)));
	}
	if (n == 0 || n == m)
	{
		// computing subset set at the LE positions
		vector<bigint> set = prefix;
		vector<bit> s_new = s;
		if (n == m)
		{
			if (n) bit_vector_ixor(s_new, precomputed.at(n-1));
			for (bigint i = n-1; i >= 0; i--)
			{
				set.push_back(i);
//				bit_vector_ixor(s_new, H.at(i));	
			}
		}
		vector<vector<bit>> v_set(0);
		for (bigint i = 0; i < set.size(); i++)
			v_set.push_back(bit_vector_from_integer(set.at(i), idx_bits));
		L_sum.push_back(s_new);
		L_set.push_back(v_set);
		return;
	}
	vector<bit> s_new = s;
	subset(L_sum, L_set, n, n, idx_bits, s_new, H, prefix, precomputed);
	for (bigint i = n; i < m; i++)
	{
		vector<bigint> prefix_new = prefix;
		prefix_new.push_back(i);
		vector<bit> s_new = bit_vector_xor(s, H.at(i));
		subset(L_sum, L_set, i, n-1, idx_bits, s_new, H, prefix_new, precomputed);
	}
}
#endif