示例#1
0
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
示例#2
0
def test_term_to_integer():
    assert term_to_integer([1, 0, 1, 0, 0, 1, 0]) == 82
    assert term_to_integer('0010101000111001') == 10809
示例#3
0
def test_term_to_integer():
    assert term_to_integer([1, 0, 1, 0, 0, 1, 0]) == 82
    assert term_to_integer('0010101000111001') == 10809