В математике и информатике предикат BIT , иногда записываемый как , является предикатом , который проверяет, равен ли th бит числа (начиная с младшей значащей цифры ) 1, когда записан как двоичное число . Его математические приложения включают моделирование отношения принадлежности наследственно конечных множеств и определение отношения смежности графа Радо . В информатике он используется для эффективного представления структур данных множеств с использованием битовых векторов , при определении проблемы поиска частной информации из коммуникационной сложности и в дескриптивной теории сложности для формулирования логических описаний классов сложности .
Предикат BIT был впервые введен в 1937 году Вильгельмом Аккерманом для определения кодировки Аккермана , которая кодирует наследственно конечные множества как натуральные числа . [1] [2] Предикат BIT может использоваться для выполнения тестов на принадлежность для закодированных множеств: является истинным тогда и только тогда, когда множество, закодированное , является членом множества, закодированного . [ 1]
Аккерман обозначил предикат как , используя шрифт Fraktur , чтобы отличить его от обозначения , которое он использовал для членства во множестве (сокращение от « является элементом » на немецком языке). [1] Обозначение и название «предикат BIT » пришли из работы Рональда Фейгина и Нила Иммермана , которые применили этот предикат в теории вычислительной сложности как способ кодирования и декодирования информации в конце 1980-х и начале 1990-х годов. [a]
Двоичное представление числа — это выражение для в виде суммы различных степеней двойки , где каждый бит в этом выражении равен либо 0, либо 1. Обычно его записывают в двоичной нотации как просто последовательность этих битов, . Учитывая это расширение для , предикат BIT определяется как равный . Его можно вычислить по формуле , где — функция пола , а mod — функция по модулю . [6] Предикат BIT — это примитивная рекурсивная функция . [2] [7] Как бинарное отношение (производящее истинные и ложные значения, а не 1 и 0 соответственно), предикат BIT асимметричен : не существует двух чисел и , для которых оба и являются истинными. [b]
В таких языках программирования, как C , C++ , Java или Python , которые предоставляют оператор сдвига вправо >>
и побитовый логический оператор &
и , предикат BIT может быть реализован выражением . Подвыражение сдвигает биты в двоичном представлении так, что бит сдвигается в позицию 0, а подвыражение маскирует оставшиеся биты, оставляя только бит в позиции 0. Как и в формуле модульной арифметики выше, значение выражения равно 1 или 0, соответственно, поскольку значение является истинным или ложным. [9](i>>j)&1
i>>j
&1
Для набора, представленного как битовый массив , предикат BIT может использоваться для проверки принадлежности к набору. Например, подмножества неотрицательных целых чисел могут быть представлены битовым массивом с единицей в позиции , когда является членом подмножества, и нулем в этой позиции, когда он не является членом. Когда такой битовый массив интерпретируется как двоичное число, набор для distinct представляется как двоичное число . Если является набором, представленным таким образом, и является числом, которое может быть или не быть элементом , то возвращает ненулевое значение, когда является членом, и ноль, когда он им не является. [c]
Тот же метод может быть использован для проверки членства в подмножествах любой последовательности различных значений, закодированных с использованием степеней двойки, экспоненты которых являются позициями элементов в этой последовательности, а не их значениями. Например, в фреймворке коллекций Java этот метод используется для реализации структуры данных набора для перечислимых типов . [11] Кодирование наследственно конечных множеств Аккермана является примером этого метода для рекурсивно сгенерированной последовательности наследственно конечных множеств. [d]java.util.EnumSet
В математическом исследовании компьютерной безопасности проблема поиска частной информации может быть смоделирована как та, в которой клиент, взаимодействующий с набором серверов, которые хранят двоичное число , желает определить результат предиката BIT, не разглашая значение серверам . Чор и др. (1998) описывают метод репликации между двумя серверами таким образом, что клиент может решить проблему поиска частной информации, используя существенно меньший объем коммуникации, чем это было бы необходимо для восстановления полного значения . [ 13]
Предикат BIT часто рассматривается в контексте логики первого порядка , где системы логики возникают в результате добавления предиката BIT к логике первого порядка. В описательной сложности класс сложности FO описывает класс формальных языков , которые могут быть описаны формулой в логике первого порядка с операцией сравнения на полностью упорядоченных переменных (интерпретируемых как индексы символов в строке ) и с предикатами, которые проверяют, содержит ли эта строка заданный символ в заданном числовом индексе. Формула в этой логике определяет язык, состоящий из его конечных моделей . [e] Однако с помощью этих операций можно описать только очень ограниченный класс языков, регулярные языки без звезд . [15] Добавление предиката BIT к репертуару операций, используемых в этих логических формулах, приводит к более надежному классу сложности, FO[BIT] , что означает, что он менее чувствителен к незначительным изменениям в его определении. [f]
Класс FO[BIT] совпадает с классом FO[+,×] , логики первого порядка с предикатами сложения и умножения. [14] Он также совпадает с классом сложности схемы DLOGTIME - однородный AC 0 . Здесь AC 0 описывает задачи, которые могут быть вычислены схемами вентилей И и вентилей ИЛИ с полиномиальным размером, ограниченной высотой и неограниченным разветвлением. «Однородный» означает, что схемы всех размеров задач должны быть описаны одним алгоритмом. Более конкретно, должна быть возможность индексировать вентили каждой схемы числами таким образом, чтобы тип каждого вентиля и смежность между любыми двумя вентилями могли быть вычислены детерминированным алгоритмом, время которого логарифмически зависит от размера схемы (DLOGTIME). [6] [16]
В 1964 году немецко-британский математик Ричард Радо использовал предикат BIT для построения бесконечного графа Радо . Конструкция Радо является просто симметризацией конструкции наследственных конечных множеств Аккермана 1937 года из предиката BIT: две вершины пронумерованы и являются смежными в графе Радо, когда либо или не равно нулю. [17]
Полученный граф обладает многими важными свойствами: он содержит каждый конечный неориентированный граф как индуцированный подграф , и любой изоморфизм его индуцированных подграфов может быть расширен до симметрии всего графа. [8]
S&(1<<i)
а не (S>>i)&1
, но результат равен нулю или ненулю в равной степени для обеих реализаций. [10]inSet
в разделе «Вывод операций над множествами») сводится к проверке того, является ли , S&(1<<i) == 1<<i
а не (S>>i)&1
, аналогично тому, как это было у Арндта (2011). [12]{{cite conference}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )