\documentclass[a4paper,oneside]{article} \usepackage[utf8]{inputenc} \usepackage[T2A]{fontenc} \usepackage[english,russian]{babel} \usepackage{amsmath} \usepackage{mathtools} \usepackage{amsfonts} \usepackage{enumitem} \usepackage{amsthm} \usepackage{minted} \setminted{fontsize=\small, breaklines=true, style=emacs, linenos} \usepackage{graphicx} \graphicspath{ {./images/} } \usepackage{float} \newtheorem{theorem}{Теорема}[subsection] \newtheorem*{theorem*}{Теорема} % --- Определение --- % \theoremstyle{definition} \newtheorem{definition}{Определение}[subsection] \newtheorem*{definition*}{Определение} % ------------------- % \title{{Алгоритмы алгебры и теории чисел}\\{Лабораторная работа №8}} \author{Гущин Андрей, 431 группа, 1 подгруппа} \date{\the\year{} г.} \begin{document} \maketitle \section{Задача} Осуществить проверку чисел на простоту с помощью полиномиального теста распознавания простоты. \section{Алгоритм} Тест Агравала — Каяла — Саксены (тест AKS) — единственный известный на данный момент универсальный (то есть применимый ко всем числам) полиномиальный, детерминированный и безусловный (то есть не зависящий от недоказанных гипотез) тест простоты чисел, основанный на обобщении малой теоремы Ферма на многочлены. Если существует ${\displaystyle r\in \mathbb {Z}}$ такое, что ${\displaystyle o_{r}(n)>\log ^{2}n}$ и для любого ${\displaystyle a}$ от 1 до ${\displaystyle \left\lfloor {\sqrt {\varphi (r) }} \log(n) \right \rfloor }$ выполняется сравнение ${\displaystyle (x+a)^{n}\equiv (x^{n}+a){\pmod {x^{r}-1,\;n}}}$, то ${\displaystyle n}$ — либо простое число, либо степень простого числа. Здесь и далее ${\displaystyle o_{r}(n)}$ обозначает показатель числа ${\displaystyle n}$ по модулю ${\displaystyle r}$, $\log$ — двоичный логарифм и $\varphi (\cdot )$ — функция Эйлера. Сравнение по двум модулям вида \[{\displaystyle a(x)\equiv b(x){\pmod {h(x),\;n}}}\] для многочленов ${\displaystyle a(x),\;b(x)\in \mathbb {Z} [x]}$ означает, что существует ${\displaystyle g(x)\in \mathbb {Z} [x]}$ такой, что все коэффициенты многочлена ${\displaystyle a(x) - b(x) - g(x)h(x)}$ кратны $n$, где $\mathbb {Z} [x]$ — кольцо многочленов от $x$ над целыми числами. \textbf{Показателем}, или \textbf{мультипликативным порядком}, целого числа $a$ по модулю $m$ называется наименьшее положительное целое число $\ell$, такое, что ${\displaystyle a^{\ell }\equiv 1{\pmod {m}}.}$ В общем виде алгоритм можно представить следующим образом: \begin{enumerate} \item Подается на проверку число $n$. \item Проверить, является ли $n$ степенью числа: если $n = a^b$ для целых чисел $a > 1$, $b > 1$. Если да, вернуть ''составное''. \item Найти такое наименьшее $r$ (взаимнопростое с $n$), что $o_{r}(n) > (log_2 \; n)^2$. \item Если $1 < $НОД$(a,\;n) < n$ для некоторого $a \leq r$, вернуть ''составное''. \item Если $n\leq r$, вернуть ''простое''. \item Если для всех $a$ от $1$ до $\left\lfloor {\sqrt {\varphi (r)}}\log(n)\right\rfloor$ верно, что $(x+a)^{n}\equiv x^{n}+a{\pmod {x^{r}-1,\;n}}$, вернуть ''простое''. \item Иначе вернуть ''составное''. \end{enumerate} Для вычисления коэффициентов многочлена, полученного из $(x+a)^{n}\equiv x^{n}+a{\pmod {x^{r}-1,\;n}}$, с целью проверки их делимости на исследуемое число $n$ использовался треугольник Паскаля. \section{Реализация} \inputminted{python}{../../lab8/lab8.py} \section{Тестирование} \begin{figure}[H] \centering \includegraphics[width=0.8\textwidth]{test8.png} \end{figure} \end{document}