diff --git a/text.tex b/text.tex new file mode 100644 index 0000000..bab80f8 --- /dev/null +++ b/text.tex @@ -0,0 +1,204 @@ +\documentclass[11pt,a4paper]{scrartcl} +\usepackage[affil-it]{authblk} % для указания ВУЗа +\usepackage{fontspec} +\usepackage{minted} % для включения исходников +\defaultfontfeatures{Mapping=tex-text} +\usepackage{xunicode} +\usepackage{xltxtra} + +\setsansfont{CMU Sans Serif} +\setmainfont{CMU Serif} +\setmonofont{Ubuntu Mono} +\newfontfamily{\cyrillicfonttt}{Ubuntu Mono} + +\defaultfontfeatures{Scale=MatchLowercase,Mapping=tex-text} +\usepackage{polyglossia} +\setdefaultlanguage{russian} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{yfonts} +\usepackage{theoremref} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{algorithm} +\usepackage{algpseudocode} + +\newtheorem{stm}{Утверждение} + +\author{Алексей Лобанов, 318 группа% + \thanks{E-mail: \texttt{i@likemath.ru}}} +\affil{МГУ им. М.В.Ломоносова} + +\author{Научный руководитель \\ доцент, д.ф.-м.н. С.Н.Селезнёва% + \thanks{E-mail: \texttt{selezn@cs.msu.ru}}} +\affil{ } % хак, чтобы не печатать ВУЗ дважды + +\date{Москва, 2018} +\title{Нахождение минимальных клонов двухзначных и трёхзначных логик} +\addto\captionsrussian{\def\refname{Список используемых источников}} + +\makeindex +\begin{document} +\maketitle +\newpage + +\section{Введение} +По данной теме, для случая трёхзначной логики уже есть результаты \cite{csakany} и \cite{machida}. Для случаё четырёхзначной логики есть работа \cite{scholzel}, однако в данной курсовой работе проверяются только два условия: +отсутствие функции большинства и полупроекции. + +\section{Постановка задачи} +В рамках данной курсовой работы рассмотриваются следующие задачи: +\begin{enumerate} +\item Написать программу, +которая строит все минимальные клоны, +порождаемые какой-то идемпотентной двухместной функцией +$f$ трёхзначной логики. +Получить экспериментальный результат +в виде списка функций от двух переменных, +содержащихся в каждом таком клоне. + +\item Написать программу, +которая строит все клоны, +порождаемые какой-то идемпотентной двухместной функцией +$f$ четырехзначной логики, не содержащие функций большинства и полупроекций. Получить экспериментальный результат +в виде списка функций двух переменных, +содержащихся в каждом таком клоне. +\end{enumerate} + +\section{Основная часть} +Введём некоторые обозначения: $I_k^2$ -- все идемпотентные функции k-значной логики, $f_k^x$, $f_k^y$ -- функции k-значной логики, тождественно равные своему первому и второму аргументу соответсвенно + +Простейшая реализация алгоритма решения данной задачи может не приветси к успеху: для $k=4$ количество функций в $I_4^2 = 4^{4\cdot4 - 4} = 4^{12} = 16777216$. Построение класса по каждой из них слишком трудоёмко, если знать, что некоторая часть этих классов по размеру сопоставимы с самим $I_4^2$. Таким образом, уже для $k=4$ необходим более быстрый алгоритм. + +Для написания алгоритма решения поставленной задачи, воспользуемся следующими утверждениями. +\begin{stm} +Любая функция из $I_k^2$, кроме, быть может, $f_k^x$ и $f_k^y$ встречается не более, чем в одном минимальном классе +\end{stm} + +Алгоритм представим в виде трёх частей: +\begin{enumerate} +\item \textbf{Генерация функций для перебора} В этой части мы должны оставить для рассмотрения только те функции $f\left( x, y\right)$ из $I_k^2$, которые удовлетворяют следующим свойствам: +\begin{enumerate} +\item $f\left( x, y\right) = f_k^x$ или $f\left( x, y\right) = f_k^y$ +\item Из $f\left( x, y\right)$ можно получить $h(x, y, z)$, существенно зависящую от 3-х переменных, для которой $h(x, x, y) = h(x, y, x) = h(y, x, x) = x$ +%\item Из $f\left( x, y\right)$ можно получить $h(x, y, z) = x - y + z$, +%где $+$ операция коммутативной группы на $\mathbb{E}_k$ +\item Из $f\left( x, y\right)$ можно получить $h(x_1, \ldots, x_k)$, $k \ge 3$, не равную $x_1, ..., x_k$, +для которой верно: существует такое $i$, $1 \le i \le k$, +что если среди элементов $x_1, \ldots, x_k$ хотя бы два совпадающих, +то $f(x_1, \ldots, x_k) =x_i$. Такая функция называется \emph{полупроекцией}. +\end{enumerate} +Проверка каждого из этих свойств тривиальна, в том числе и вычислительно, относительно других частей. + +Полученные функции мы кладём в очередь $d$. +\item \textbf{Расширение множеств функций} В этой части мы берём один элемент из очереди, производим "расширение" класса функций \ref{alg:extending} и кладём в конец очереди. Причём расширение происходит таким образом, что на каждом расширении для одного и того же множества, $\frac{\texttt{max}_{n+1}}{\texttt{max}_n} = \lambda$, где $1 < \lambda < 2$, а $n$ -- номер расширения. Это необходимого для экономного расхода памяти ЭВМ. + +\item \textbf{Обработка множеств функций после расширения} В этой части мы должны рассмотреть все обработанные множества функций и обработать их, псевдокод ниже \ref{alg:queue}. Это самая концептуально сложная часть алгоритма. +\end{enumerate} + +При такой декомпозиции возможно использовать многоядерность современных ЭВМ для распараллеливания расширения множеств функций, что позволяет почти линейно уменьшить время работы. + +Опишем работу некоторых ключевых процедур. +Главной такой является "расширение" множества функций \ref{alg:extending}. +\begin{algorithm} +\caption{Расширение множества функций}\label{alg:extending} +\begin{algorithmic} +\Function{ExtendFunctionClass}{class, max} +\If {size(class) $\geq$ max} + + \Return (class, False) +\EndIf +\State is\_finished $\gets$ False +\State last\_size $\gets$ 0 +\While{True} + \State new\_funcs $\gets \{\}$ + \Comment{Пустое множество} + \ForAll{$f_1 \in$ class} + \State new\_funcs.add(reversed($f_1$)) + \Comment{Для всех $f_1(x,y)$ добавим $f_1'(y,x)$} + + \ForAll{$f_2 \in$ class} + \State new\_funcs.add($f_1\left(f_2, y \right)$) + \EndFor + \EndFor + \State new\_funcs.remove($f_k^x$) + \State new\_funcs.remove($f_k^y$) + \Comment{Могли добавиться тождественные функции, их нужно убрать} + \If {size(new\_funcs) $=$ last\_size} + \State is\_finished $\gets$ True + \State \textbf{break} + \Comment{Мы закончили построение этого класса функций} + \EndIf + + \State class $\gets$ class $\cup$ new\_funcs + \State last\_size $\gets$ size(new\_funcs) + + \If {size(class) $>$ max} + \State \textbf{break} + \Comment{Класс стал достаточно большим -- нужно выходить} + \EndIf +\EndWhile + +\Return (class, is\_finished) + +\EndFunction +\end{algorithmic} +\end{algorithm} + +Также важной функцией является обработка новых \ref{alg:queue} +\begin{algorithm} +\caption{Обработка расширенных множеств}\label{alg:queue} +\begin{algorithmic} +\Function{ProcessSets}{class, max} +\State заглушка + +\Return (42) +\EndFunction +\end{algorithmic} +\end{algorithm} +Для реализации полученных алгоритмов для выполнения на ЭВМ был выбран язык программирования C++14. + +\section{Полученные результаты} +С помощью написанных программ для ЭВМ на языке программирования C++14 удалось получить решения поставленных задач. + +Опишем кодирование решения. Пусть исходная функция имеет значения +$$ +f\left( x, y \right) = \left( 0ab \: c1d \: et2 \right) +$$ +тогда число $\overline{abcdet}$ +рассмотрим в десятичной системе и назовём \emph{номером функции}. + +Для трехзначной логике список номеров порождающих функций ниже: + +0, 8, 10, 11, 16, +17, 20, 26, 33, 35, +36, 37, 38, 40, 41, +42, 43, 47, 53, 68, +71, 80, 116,122, 125, +178, 179, 188, 206, 215, +280, 281, 286, 287, 290, +296, 364, 368, 448, 449, +458, 528, 530, 557, 624, +692, 728. Всего 42 функции. + +Для случая четырёхзначной логики таких функций 2279. + +\section*{Приложение. Исходный код программы на C++14} +\subsection*{main.cpp} +\inputminted{C++}{main.cpp} +\subsection*{al\_utility.hpp} +\inputminted{C++}{al_utility.hpp} +\subsection*{al\_utility.cpp} +\inputminted{C++}{al_utility.cpp} +\subsection*{finite\_function.hpp} +\inputminted{C++}{finite_function.hpp} + +\begin{thebibliography}{} + \bibitem{csakany} B.Csakany -- All minimal clones on three-element set + \bibitem{machida} Hajime Machida, Michael Pinsker -- Polynomials as Generators of Minimal Clones + \bibitem{scholzel} Karsten Schölzel -- The minimal clones generated by semiprojections on a four-element set +\end{thebibliography} + +\end{document} \ No newline at end of file