def linear(f, n): if n <= 10: # пробегаемся по всем наборам аргументов функции, начиная с тройки for x in range(3, 2**n): term = integer_to_term(x, n) ones = term.count(1) # набор только с одной единицей не интересует, # так как соответствующее слагаемое полинома # Жегалкина будет состоять из одной переменной if ones == 1: continue coef = 0 # коэффициент при соотвестующем слагаемом полинома Жегалкина for i in range(1, ones + 1): # находим все возможные сочетания индексов единиц по i combs = combinations(compress(range(0, n), term), i) for comb in combs: # формируем сравнимый с рассматриваемым x # набор аргументов, в котором единицы, # стоящие на индексах из текущего сочетания, заменяются нулями comp_set = [ 0 if ind in comb else bit for ind, bit in enumerate(term) ] coef ^= int(calc(f, term_to_integer(comp_set), n) == True) coef ^= int(calc(f, x, n) == True) # если в полиноме Жегалкина присутствует слагаемое # с более чем одним множителем, функция является нелинейной if coef == 1: return False return True else: a_0 = int(calc(f, 0, n) == True) attempts = 5 * n for i in range(0, attempts): random_number = random.getrandbits(n) tmp = random_number f_x = int(calc(f, random_number, n) == True) random_number = random.getrandbits(n) f_y = int(calc(f, random_number, n) == True) f_x_y = int(calc(f, tmp ^ random_number, n) == True) if a_0 ^ f_x ^ f_y != f_x_y: return False return True
def test_term_to_integer(): assert term_to_integer([1, 0, 1, 0, 0, 1, 0]) == 82 assert term_to_integer('0010101000111001') == 10809
def test_term_to_integer(): assert term_to_integer([1, 0, 1, 0, 0, 1, 0]) == 82 assert term_to_integer('0010101000111001') == 10809