Если у меня есть логические переменные a_1, a_2, .., a_n. Как я могу выразить тот факт, что количество логических переменных, для которых установлено значение true, больше некоторого k, используя логическое выражение полиномиального размера? (Экспоненциальное просто - просто напишите выражение newton(n,k)).
Выражение факта в логическом выражении полиномиального размера
Ответы (2)
Сортируйте логические значения с помощью любой сети сортировки. Затем просто возьмите (k+1)-й отсортированный бит, который даст вам результат.
Поскольку каждый из элементов сети сортировки представляет пару логических операций, вы можете интерпретировать эту сеть как логическое выражение. При хорошей сети сортировки это даст вам выражение с операциями O(N*log2(N)).
пусть t[i][j] означает, что из элементов a_1, .., a_i j имеет значение true. Теперь мы ясно видим, что
t[i][j] => (t[i-1][j] or (t[i-1][j-1] and a_i).
(поскольку любая переменная уже была установлена в a_1, .., a_(i-1) или a_i установлена и есть j-1 переменные в a_1, .. , a_(i-1). Это выражение полиномиального размера (около n*k переменных t[i][j], для каждого выражения, подобного тому, что я написал выше). Тогда, если t[n][k] истинно, мы получаем, что наша из n переменных по крайней мере k истинно.
Ссылаясь на ответ Евгения, чтобы получить переменные в отсортированном порядке (сначала истина, затем ложь), мы смотрим на последовательность t[n][1], t[n][2], .. t[n][n ].