% !TeX program = lualatex

\documentclass[14pt]{extarticle}
\usepackage{fontspec}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage[titletoc, title]{appendix}
\usepackage{microtype}
\usepackage{geometry}
\usepackage{setspace}
\usepackage{multirow}
\usepackage{tocloft}
\usepackage{titlesec}
\usepackage{indentfirst}
%\usepackage[autostyle=true,russian=guillemets]{csquotes}
%\usepackage{i-use-arch-btw}
\usepackage{csquotes}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{amssymb}

\setmainfont{Times New Roman}

\geometry{
  a4paper,
  top=2cm,
  bottom=1.5cm,
  left=3cm,
  right=2cm
}

\hypersetup{
    colorlinks=false,
    linkcolor=black,
    filecolor=magenta,      
    urlcolor=blue,
    pdfpagemode=FullScreen,
}

\setlength{\parindent}{1.25cm}

\onehalfspacing

\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}}
\renewcommand*\contentsname{Содержание}
\titleformat{\section}
  {\centering\normalfont\Large\bfseries}
  {ГЛАВА \Roman{section}.}
  {1em}
  {}
\MakeOuterQuote{"}

\title{}
\date{}
\author{}

\begin{document}
  \begin{center}
    Муниципальное бюджетное общеобразовательное учреждение\\
    Энская средняя общеобразовательная школа

% Псевдослучайные числа в информационных технологиях

    \vspace*{\fill}
    \fontsize{16}{18pt}\selectfont \textbf{ИНДИВИДУАЛЬНЫЙ ПРОЕКТ} \\
    \fontsize{14}{1cm}\selectfont Реализация и сравнение генераторов псевдослучайных чисел
    \vspace*{\fill}
  \end{center}

  \vspace*{\fill}
    \begin{flushright}
      \parbox{0.4\textwidth}{
        Выполнил: ученик 10 класса\\
        \texttt{Aleph0x11}\\
        Руководитель:\\
        Учитель Информатики
      }
    \end{flushright}
  \vspace*{\fill}

  \vfill 

  \begin{center}
    2026 год
  \end{center}

  \thispagestyle{empty}
  \newpage
  \tableofcontents
  \newpage\section*{ВВЕДЕНИЕ}
  Случайные числа играют крайне важную роль в информационных технологиях и 
  используются в широком круге задач: от защиты данных до научных исследований. 
  Получение истинно случайных чисел зачастую требует специального оборудования, 
  поэтому в большинстве случаев используются псевдослучайные числа.

  \textbf{Псевдослучайное число} ~--- это число, которое выглядит как случайное, 
  но таковым не являющееся, так как оно детерминировано и было получено в 
  результате работы определённого алгоритма. Такое число не является истинно 
  случайным и может быть воссоздано.
  
  \textbf{Генератор псевдослучайных чисел} (ГПСЧ, англ. \textit{pseudorandom 
  number generator}, \textit{PRNG}) ~--- это алгоритм, 
  создающий последовательность псевдослучайных чисел.

  \textbf{Зерно} ~--- это начальное значение, передаваемое в генератор 
  псевдослучайных чисел.

  Истинной случайности можно достичь, используя источник энтропии (например, 
  тепловой шум) для получения случайного зерна.

  ГПСЧ нашли широкое применение в различных задачах: 
  \begin{itemize}
    \item в криптографии для генерации ключей шифрования; 
    \item в лотереях, как британский ERNIE, используемый NS\&I; 
    \item в изучении случайных процессов методом Монте-Карло; 
    \item для тестирования производительности и надёжности систем; 
    \item в компьютерных играх для реализации процедурных локаций и случайных 
      событий.
  \end{itemize}

  \noindent\textbf{Цель работы:} изучить принцип работы ГПСЧ, области их
  \mbox{применения}.

  \noindent\textbf{Задачи:}
  \begin{itemize}
    \item рассмотреть самые используемые ГПСЧ;
    \item реализовать несколько ГПСЧ и сравнить их;
  \end{itemize}
  \newpage\section{ПРИМЕРЫ РАБОТЫ ГПСЧ}
    Одним из ранних ГПСЧ является \textbf{метод середины квадратов},
    разработанный Джоном фон Нейманом. Суть этого метода заключается в
    следующем: чтобы получить случайное, например, десятизначное число, нужно
    возвести в квадрат десятизначное число, при необходимости дописав несколько
    нулей к началу, взять из середины квадрата десятизначное число, снова
    возвести его в квадрат и так далее. Например, сгенерируем четырёхзначное
    случайное число, начиная с 2815:

    \begin{gather*}
      2815^2 = 07\overline{9242}25\\
      9242^2 = 85\overline{4145}64\\
      4145^2 = 17\overline{1810}25\\
      1810
    \end{gather*}

  Недостатком этого метода является то, что последовательность может 
  зацикливаться:

  \begin{gather*}
    5000^2 = 25\overline{0000}00\\
    0^2 = 00\overline{0000}00\\
    0^2 = 0\\
  \end{gather*}

  Одним из современных алгоритмов является \textbf{линейный конгруэнтный метод} 
  Д.Г. Лемера (англ. \textit{linear congruential generator}, сокращённо 
  \textit{LCG}) задающийся этой формулой: 
  \begin{gather*}
  X_{n+1} = ( aX_n + c ) \mod m
  \end{gather*}
  где $a$, $m$, $c \in \mathbb{Z}$ и $m > 1; m > a > 0; m > c > 0; m > X_0$. 
  Последовательность этого метода тоже может зацикливаться, что является 
  недостатком. Исходный код доступен в приложении А.

  Другим подходом к генерации последовательности случайных чисел является
  \textbf{регистр сдвига с линейной обратной связью} (англ. \textit{linear
    feedback shift register}, сокращённо \textit{LFSR}). LFSR работает по
    следующему принципу: существует \textbf{регистр}, состоящий из
    \textbf{ячеек памяти} (например, битов) с изначально заданным ненулевым
    значением; следующий бит генерируется определённой логической функцией,
    затем регистр сдвигается на один бит, и старшему биту присваивается
    значение сгенерированного бита. Например, следующая логическая функция
    \cite{koopman} даёт максимальный \textbf{период} (количество
    неповторяющихся членов последовательности) в 65535 чисел 16-битному LFSR:
  \begin{gather*}
    a = X_{16} \oplus X_{14} \oplus X_{13} \oplus X_{11},\\
  \end{gather*}
  где $X_n$ --- это $n$-ая ячейка памяти, a $a$ --- это новый старший бит 
  регистра. Исходный код доступен в приложении А.

  \newpage\section{ТЕСТИРОВАНИЕ}

  Протестируем и сравним ГПСЧ на основе линейного конгруэнтного метода и
  регистра сдвига с линейной обратной связью, реализованные мной (см.
  приложение А). Воспользовавшись утилитой ENT \cite{ent}, получаем следующиe
  результаты:

  \begin{center}
    \begin{tabular}{c|c|c|c|c}
      & $\chi^2$ & корреляция & энтропия на байт & метод Монте-Карло\\
      \hline
      LFSR & $0,07$ & $-0,000048$ & 8 & $3,131870773$\\
      \hline
      LCG & $123,15$ & $0.002521$ & $7,999831$ & $3,140316545$\\
    \end{tabular}
  \end{center}
  {\small Примечание: $\chi^2$ --- тест хи-квадрат, идеал $\chi^2$ $\approx 255$, 
  идеальная корреляция $= 0$, идеальная энтропия $= 8$, идеал метода 
  Монте-Карло $= \pi \approx 3,14159$.}

  Рассмотрим результаты. LFSR показал хорошую корреляцию, энтропию и значение
  метода Монте-Карло, но очень низкую статистику $\chi^2$. Это значит, что
  созданная им последовательность слишком равномерная и предопределённая. В то
  же время у LCG результаты тоже хороши, некоторые даже лучше чем у LFSR,
  например значение $\chi^2$, которое гораздо ближе к идеалу и меньшее
  отклонение от $\pi$ по методу Монте-Карло.

  Для дальнейшего исследования LFSR и LCG была использована утилита STS
  (\textit{the Statistical Test Suite for Random and Pseudorandom Number
  Generators}) \cite{nist} от Национального института стандартов и технологий
  США (NIST). LFSR прошёл 176 из 188 проверок и провалил 12. Из проваленных:

  \begin{itemize}
    \item Тест на ранг бинарной матрицы (англ. \textit{Binary Matrix Rank 
      Test}), т.к. это регистр с линейной обратной связью;
    \item Дискретное преобразование Фурье (англ. \textit{Discrete Fourier 
      Transform}), т.к. в файле размером 1МиБ, который сканировала утилита, 
      последовательность повторилась 8 раз из-за низкого периода (65535 чисел);
    \item Тест на линейную сложность (англ. \textit{Linear Complexity Test}), 
      т.к. период LFSR оказался слишком коротким.
  \end{itemize}

  LCG прошел 183 теста из 188, не пройдя лишь 5. Не пройдены:
  \begin{itemize}
    \item Дискретное преобразование Фурье (англ. \textit{Discrete Fourier
      Transform});
    \item Тест на неперекрывающиеся шаблоны (англ. \textit{Non-overlapping
      Template Matching});
    \item Универсальный статистический тест Маурера (англ. \textit{Maurer's
      Universal Statistical Test});
  \end{itemize}

  Из вышеперечисленного можно сделать вывод, что случайность реализованных ГПСЧ
  приемлема для задач, которые \textbf{не требуют криптографической стойкости}.

  \newpage\section*{ЗАКЛЮЧЕНИЕ}
 
  В ходе работы были достигнуты следующие результаты: 

  \begin{itemize}
    \item\textbf{Рассмотрен принцип работы нескольких ГПСЧ:}
    \begin{itemize}
      \item метод середины квадратов;
      \item линейный конгруэнтный метод (LCG);
      \item регистр сдвига с линейной обратной связью (LFSR).
    \end{itemize}
    \item\textbf{Реализованы LCG и LFSR на языке C}.
      Исходный код представлен в приложении А. Генераторы используют типичные 
      для своих типов параметры и ведут себя ожидаемым образом.
    \item\textbf{Проведено статистическое тестирование} с помощью утилиты ENT 
      \cite{ent}. Результаты показали, что:
      \begin{itemize}
        \item LFSR показывает такие хорошие качества, как высокая энтропия и 
          нулевая корреляция, но низкое значение $\chi^2$ свидетельствует об 
          избыточной равномерности последовательности, вызванной малым 
          периодом;
        \item LCG показывает сопоставимые с LFSR результаты, а его статистика
          $\chi^2$ даже превосходит $\chi^2$ LFSR;
      \end{itemize}
    \item\textbf{Проведено углублённое тестирование} набором NIST STS 
      \cite{nist}:
      \begin{itemize}
        \item LFSR прошёл 176 тестов из 188, непройденные проверки 
          свидетельствуют о линейной структуре и малом периоде реализации;
        \item LCG прошёл 183 тестов из 188;
      \end{itemize}
  \end{itemize}

  Таким образом, поставленные в введении цели и задачи выполнены в полной мере.

  \newpage\begin{appendices}
  \renewcommand{\thesection}{\Alph{section}} 
  \titleformat{\section}
  {\centering\normalfont\Large\bfseries}
  {Приложение \thesection.}
  {1em}
  {}
  \section{Исходный Код}

  Представленные реализации ГПСЧ написаны на языке программирования C, и их 
  работа протестирована в среде GNU/Linux.

  \subsection{Реализация LCG}

  Структура \texttt{lcg\_t} хранит значения нужных для работы генератора 
  коэффициентов, функция \texttt{init\_lcg} задаёт им изначальные значения (в 
  т.ч. зерно), функция \texttt{lcg} считает следующее число последовательности 
  и возвращает его, записывая его в ранее созданную и инициализированную 
  структуру.

  Изначально эта реализация выдавала результат гораздо хуже из-за того, что
  максимально генератор генерирует 32-битные число, но возвращал и в тестовой
  программе шла запись в файл 64-битного числа --- в итоге половина файла
  состояла из нулей.

  \lstinputlisting[language=C,basicstyle=\ttfamily\small]{src/lcg.c}

  \subsection{Реализация LFSR}

  Реализация 16-битного регистра с линейной обратной связью, объяснение 
  принципа работы представлено в первой главе. Функция \texttt{lfsr} принимает 
  указатель на регистр (16-битовое беззнаковое целое число), возвращает 
  следующее число из последовательности и обновляет состояние регистра.

  \lstinputlisting[language=C,basicstyle=\ttfamily\small]{src/lfsr.c}

  \subsection{Вспомогательная функция}

  Вспомогательная функция, которая использовалась при отладке LFSR. Принимает 
  16-битное беззнаковое целое число и возвращает его двоичное представление в 
  виде строки.

  \lstinputlisting[language=C,basicstyle=\ttfamily\small]{src/auxprng.c}

  \subsection{Программа для тестирования}

  Программа, написанная, чтобы создать 2 файла размером 1МиБ каждый, состоящие 
  из последовательностей двух реализованных ГПСЧ.

  \lstinputlisting[language=C,basicstyle=\ttfamily\small]{test.c}

  \end{appendices}
  
  \newpage\begin{thebibliography}{1}
  
    \bibitem{nist}
    Rukhin A., Soto J., Nechvatal J. et al. A Statistical Test Suite for Random
    and Pseudorandom Number Generators for Cryptographic Applications
    [Электронный ресурс]. -- URL:
    \url{https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-22r1a.pdf}
    (дата обращения 18.03.2026).

    \bibitem{ent}
    Walker J. A Pseudorandom Number Sequence Test Program [Электронный ресурс].
    -- URL: \url{https://www.fourmilab.ch/random/} (дата обращения 17.03.2026).

    \bibitem{koopman}
    Koopman P. Maximal Length LFSR Feedback Terms [Электронный ресурс]. --
    URL: \url{https://users.ece.cmu.edu/~koopman/lfsr/index.html} (дата 
    обращения 18.03.2026).

  \end{thebibliography}
\end{document}

%this is FRAUD
