|
|
Строка 1: |
Строка 1: |
− | {| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;"
| |
− | |+
| |
− | |-align="center"
| |
− | |'''НЕТ ВОЙНЕ'''
| |
− | |-style="font-size: 16px;"
| |
− | |
| |
− | 24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.
| |
− |
| |
− | Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.
| |
− |
| |
− | Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.
| |
− |
| |
− | Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.
| |
− |
| |
− | ''Антивоенный комитет России''
| |
− | |-style="font-size: 16px;"
| |
− | |Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
| |
− | |-style="font-size: 16px;"
| |
− | |[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].
| |
− | |}
| |
− |
| |
| = Линейные программы = | | = Линейные программы = |
| Определения и основные понятия, связанные с булевыми функциями описаны в статье [[Определение булевой функции|"определение булевой функции"]].<br> | | Определения и основные понятия, связанные с булевыми функциями описаны в статье [[Определение булевой функции|"определение булевой функции"]].<br> |
Текущая версия на 19:17, 4 сентября 2022
Линейные программы
Определения и основные понятия, связанные с булевыми функциями описаны в статье "определение булевой функции".
Определение: |
Линейная программа — последовательность строк вида [math]{\{s_i\}}_{i=n}^t[/math], в которой [math]s_i[/math] имеет вид [math]x_i = F(x_{a_1}, x_{a_2}, \ldots , x_{a_m})[/math], где [math]x_i, x_{a_1}, \dots , x_{a_m}[/math] — переменные, каждое из чисел [math]a_j[/math] меньше [math]i[/math], а [math]F[/math] — [math]m[/math]-местная базисная функция. Такая линейная программа имеет [math]n[/math] входных переменных, которые не выражаются через операции вычисления. |
Пример
Для базиса [math]B_0 = \{\vee, \wedge, \neg \}[/math] линейная программа может выглядеть следующим образом:
- [math]A_2 = A_0 \wedge A_1[/math];
- [math]A_2 = A_0 \vee A_1[/math];
- [math]A_1 = \neg A_0[/math].
Линейная программа [math]P[/math] с выделенными переменными [math]x_1,\dots , x_n[/math] порождает для каждого набора [math]\sigma_1, \dots , \sigma_n[/math] значений входных переменных естественный процесс вычисления:
- Переменным [math]x_1, \dots , x_n[/math] присваиваются значения [math]\sigma_1, \dots , \sigma_n[/math], соответственно, а каждой из остальных переменных присваивается значение [math]0[/math];
- Последовательно выполняются присваивания программы [math]P[/math], в результате чего каждая из переменных [math]x_i[/math] программы получит итоговое значение [math]P_i(\sigma_1, \dots , \sigma_n)[/math].
Определение: |
Программа [math]P[/math] со входными переменными [math]x_1,\dots , x_n[/math] вычисляет в выходной переменной [math]x_m[/math] функцию [math]F(x_1, \dots , x_n)[/math], если для любого набора значений входов [math]\sigma_1, \dots , \sigma_n[/math] после завершения работы [math]P_m(\sigma_1, \dots , \sigma_n) = F(\sigma_1, \dots , \sigma_n)[/math]. |
Связь между схемами и линейными программами
Как известно, булевы функции представимы в виде схем из функциональных элементов. В данном пункте мы определим связь между такими схемами и линейными программами.
Теорема: |
- По каждой логической схеме [math]S[/math] со входами [math]x_1, \dots , x_n[/math] и функциональными элементами [math]v_1, \dots , v_m[/math] можно эффективно построить линейную программу [math]P_S[/math] со входными переменными [math]x_1, \dots , x_n[/math] и рабочими переменными [math]x_{n + 1}, \dots , x_{n + m}[/math], которая в любой переменной [math]x_i, i \in [1 + n, m + n][/math] вычисляет функцию [math]f_{x_i}(x_1, \ldots , x_n)[/math];
- По каждой линейной программе [math]P[/math] со входными переменными [math]x_1, \dots , x_n[/math], вычисляющей в выходной переменной [math]x_m[/math] некоторую функцию [math]F(x_1, \dots , x_n)[/math] можно эффективно построить логическую схему [math]S_P[/math] со входами [math]x_1,\dots , x_n[/math], в которой имеется вершина [math]v[/math] такая, что [math]f_v(x_1, \dots , x_n) = F(x_1, \dots , x_n)[/math].
|
Доказательство: |
[math]\triangleright[/math] |
(1)
Пусть [math]S[/math] — схема со входами [math]x_1, \dots , x_n[/math] и функциональными элементами [math]v_1, \dots , v_m[/math]. Построим по ней линейную программу [math]P_S[/math] со входными переменными [math]x_1, \dots , x_n[/math] следующим образом. Топологически отсортируем все входные и функциональные вершины [math]S[/math]: [math]u_1, \dots , u_{n + m}[/math]. Программа [math]P_S[/math] будет последовательностью [math]m[/math] присваиваний.
- Пусть вершина [math]u_{i + n}[/math] помечена [math]\neg[/math], и в нее входит ребро из [math]u_j[/math]. Тогда в качестве [math]i[/math]-ой команды поместим в [math]P_S[/math] присваивание [math]x_{i + n}= \neg x_j[/math];
- Пусть вершина [math]u_{i + n}[/math] помечена [math]\circ \in \{ \wedge , \vee \}[/math], и в нее входят ребра из [math]u_j[/math] и [math]u_k[/math]. Тогда в качестве [math]i[/math]-ой команды поместим в [math]P_S[/math] присваивание [math]x_{i + n} = x_j \circ x_k[/math].
Топологическая сортировка вершин гарантирует, что [math]j \lt n + i \wedge k \lt n + i[/math]. Поэтому при вычислении [math]x_{n + i}[/math] значения аргументов уже получены и индукцией по глубине легко показать, что для любого [math]i \in [1, m][/math] программа [math]P_S[/math] вычисляет в переменной [math]x_i[/math] функцию [math]f_{x_i}(x_1, \dots, x_n)[/math]. |
[math]\triangleleft[/math] |
Пример
Воспользуемся только что доказанной теоремой, и построим на основании этой схемы линейную программу.
Установим соответствие между вершинами схемы и переменными: [math]x \; — \; x_0, \; y \; — \; x_1, \; z \; — \; x_2, \; a \; — \; x_3, \; b \; — \; x_4, \; c \; — \; x_5, \; d \; — \; x_6, \; e \; — \; x_7, \; f \; — \; x_8[/math].
Результатом топологической сортировки данного графа может стать последовательность вершин: [math]x, y, z, a, b, c, d, e, f[/math]. Тогда программа [math]P_S[/math] будет иметь следующий вид:
[math]x_3 = x_0 \wedge x_1[/math]
[math]x_4 = \neg x_2[/math]
[math]x_5 = \neg x_3[/math]
[math]x_6 = x_5 \wedge x_2[/math]
[math]x_7 = x_3 \wedge x_4[/math]
[math]x_8 = x_6 \vee x_7[/math]
Утверждение: |
Число команд в линейной программе [math]P_S[/math], т.е. время ее выполнения, совпадает со сложностью [math]L(S)[/math] схемы [math]S[/math]. Глубина схемы [math]D(S)[/math] также имеет смысл с точки зрения времени вычисления. Именно, [math]D(S)[/math] — это время выполнения [math]P_S[/math] на многопроцессорной системе. Действительно, все команды, соответствующие вершинам одинаковой глубины, можно выполнять параллельно на разных процессорах, так как результаты любой из них не используются в качестве аргументов другой. |
См. также
Литература
- Дехтярь М.И. Реализация булевых функций с помощью логических схем // Введение в схемы, автоматы и алгоритмы, 2007. URL: https://www.intuit.ru/studies/courses/1030/205/lecture/5306