diff --git a/.gitignore b/.gitignore index 8b550e8..92f578c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ **/render.html **/render.html.lock + +build/ diff --git a/linear_nt/Makefile b/linear_nt/Makefile deleted file mode 100644 index 0a6bd46..0000000 --- a/linear_nt/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# Default makefile for algorithmica-like pages - -.PHONY: all clean - -all: render.html - -render.html: main.md - pandoc $< --to html --mathjax --output $@ - -clean: - test -f render.html && rm render.html || echo "Nothing to clean" diff --git a/linear_nt/config.json b/linear_nt/config.json deleted file mode 100644 index 13a68bf..0000000 --- a/linear_nt/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "linear_nt", - "standalone": false, - "title": "Линейные алгоритмы в теории чисел", - "template": "basic_template.html", - "credits": [ - "Никифор Кузнецов" - ] -} diff --git a/linear_nt/main.md b/linear_nt/main.md deleted file mode 100644 index b6ec735..0000000 --- a/linear_nt/main.md +++ /dev/null @@ -1,201 +0,0 @@ -# Линейные алгоритмы в теории чисел - -Зачастую в теории чисел сложно сказать что-то про одно число, а про несколько значительно проще. -Так, например, до [недавнего времени](https://en.wikipedia.org/wiki/AKS_primality_test) человечеству не было -известно, как определить, является ли число простым за полиномиальное время, а найти все простые числа от $1$ до $N$ -можно решетом Эратосфена, и даже за линейное время. - -**Важное замечание:** далее во всех асимптотиках алгоритмов мы считаем количество арифметических операций. Иначе говоря, мы не берем во внимание, сколько выполняется операция умножения или деления, взятия по модулю. - -## Результаты аналитической теории чисел - -Которые, мы, однако, доказывать не будем, но будем активно использовать(здесь $\log$ -- натуральный логарифм) - -**Вторая теорема Мертенса**. $$\sum\limits_{p \leqslant n, p \text{ -- простое}} \frac{1}{p} = \log \log n + C + o(1)$$ -Доказательство более слабого утверждения можно найти -[здесь](https://math.stackexchange.com/questions/2678885/easy-proof-of-a-weak-form-of-mertenss-second-theorem) - -Некоторые из её следствий, которыми мы будем пользоваться: - -* $\sum\limits_{x \leqslant n} \omega(x) = n \log \log n + C_1n + o(n)$, где $\omega(n)$ -- количество различных простых делителей -* $\sum\limits_{x \leqslant n} \Omega(x) = n \log \log n + C_2n + o(n)$, где $\Omega(n)$ -- количество простых делителей в разложении - -На сумму количества делителей известна следующая оценка: $\sum\limits_{x \leqslant n} \sigma_0(x) = n \log n + Cn + O\left(\sqrt{n}\right)$. - -## Решето Эратосфена - -Самый простой вариант решета Эратосфена заключается в том, что мы берём каждое число от $2$ до $N$, и "просеиваем" им, то есть помечаем -все числа, которые на него делятся как составные. Его псевдо-реализация: -``` {.c} -for (int i = 2; i <= N; i++) { - for (int k = 2; i * k <= N; k++) { - primes[i * k] = false; - } -} -``` - -Нетрудно оценить его время работы. Когда мы просеваем числом $i$, мы делаем $\frac{N}{i}$ операций, то есть суммарно -$\frac{N}{1} + \frac{N}{2} + \ldots + \frac{N}{N} = N \left(1 + \frac{1}{2} + \ldots + \frac{1}{N}\right)$, -что легко оценивается сверху как $O(N \log N)$ суммой гармонического ряда. - -Перед нами встаёт вопрос, как улучшить наш алгоритм. Первое, что приходит в голову, просеивать только числами до $\sqrt{N}$, потому что -если число $x \leqslant N$ делится на $k \geqslant \sqrt{N}$, то оно делится на $\frac{d}{k} \leqslant \sqrt{N}$. - -Однако, это никак не улучшает асимптотику, поскольку $\log \left(\sqrt{N}\right) = \frac{1}{2} \log N$. - -Ещё одна идея -- просеивать только простыми числами, то есть теми, которыми алгоритм ещё не пометил. И, оказывается, что эта идея -улучшает асимптотику до $O(N \log \log N)$. Действительно, теперь мы делаем -$\sum\limits_{p \leqslant N} \frac{N}{p}$ операций, где $p$ -- простые -числа. Из второй теоремы Мертенса это и есть $O(N \log \log N)$. - -### Линейное решето Эратосфена - -Решим более общую задачу. Найдём для каждого числа от $1$ до $N$ его наименьший делитель, а также будем поддерживать список -уже найденных простых чисел. - -Рассмотрим следующий алгоритм, на $i$-ом шаге которого мы: - -1. Если наименьший делитель числа $i$ не был найден до этого, добавляем $i$ в список простых. -2. Для всех простых чисел $p$, не больших $q$, наименьшего делителя $i$, объявляем наименьшим делителем числа $pi$ число $p$. - -Его псевдо-реализация: -``` {.c} -for (int i = 2; i <= N; i++) { - if (lowest_divisor[i] == 0) { - primes.push_back(i); - lowest_divisor[i] = i; - } - for (int prime : primes) { - if (prime * i > N || prime > lowest_divisor[i]) { - break; - } - lowest_divisor[i * prime] = prime; - } -} -``` - -Докажем корректность алгоритма, а именно, что на $i$-ом шаге корректно посчитаны все наименьшие делители чисел, не превосходящих $i$ -, а также найдены все простые числа не превосходящие $i$ по индукции. - -База очевидна. - -Переход. Пусть до числа $i$ утверждение выполнено. - -Если число $i$ -- простое, то ни на каком прошлом шаге $j$ не нашлось бы число $p$, что $jp = i$, -значит мы добавим его в список простых, и объявим его наименьшим делителем $i$, что и требовалось. - -Если число $i$ -- составное, тогда его наименьшим делителем является простое число, обозначим его за $p$. - -Наименьший делитель числа $\frac{i}{p}$ не меньше $p$ из выбора $p$. Значит, на шаге с номером $\frac{i}{p}$ мы объявили наименьшим делителем -$i$ число $p$. - -Пусть наименьший делитель $i$ обновлялся ещё и на шаге $j \neq \frac{i}{p}$. Тогда $jq = i$, причём $q \neq p$ -- простое. Пусть - -* $q < p$. Тогда у числа $i$ есть делитель, меньший $p$, а именно $q$. Противоречие. -* $q > p$. Тогда у числа $j = \frac{i}{q}$ наименьший делитель равен $p < q$, а значит мы бы не обновляли ответ для $i$ на шаге $j$. Противоречие. - - -Значит, алгоритм корректно находит наименьший общий делитель всех чисел от $1$ до $N$, причём в процессе каждому числу присваивался -наименьший делитель ровно один раз. -Значит, наш алгоритм работает за линейное время. - -## Вычисление значений мультипликативной функции $f$ для всех чисел от $1$ до $N$ за $O(N)$ - -Будем считать, что наименьшие делители всех чисел уже посчитаны до этого за $O(N)$. - -Единственное требование к функции $f$ -- умение по простому числу $p$ и числу $k$ -вычислять $f(p^k)$ за $O(k)$. - -Так, например при $f = \varphi$, функции Эйлера, $f(p^k) = p^{k - 1} \cdot (p - 1)$. - -Заметим, что $f(n) = f(\frac{n}{p^k}) \cdot f(p^k)$, где $p$ -- наименьший делитель $n$, а $d(n) = k$ -- его степень -вхождения - -Из мультипликативности $f(ab) = f(a) \cdot f(b)$ если $\gcd(a, b) = 1$, а $\gcd(p^k, \frac{n}{p^k}) = 1$ из опредения $p^k$. - -Откуда вытекает следующий алгоритм, на $i$-ом шаге которого мы: - -1. Считаем для данного $i$ его $p^k$ за $O(d(i))$: делим на наименьший делитель, пока он не меняется. -2. Если $p^k = i$, считаем $f(p^k)$ за $O(d(i))$ или за $O(1)$, что и будет ответом для числа $i$. -3. Иначе объявляем $f(i)$ равным $f(p^k) \cdot f(\frac{n}{p^k})$, вычисляя это выражение за $O(1)$, поскольку оно -использует только значения $f$ для аргументов меньших $i$, для которых всё уже посчитано. - -Итоговая сложность алгоритма составляет $O\left( \sum\limits_{i \leqslant N} d(i) \right)$ времени и $O(N)$ памяти. - -**Основная лемма.** $\sum\limits_{i \leqslant N} d(i) = \Theta(N)$. - -Пусть $n = p_1^{\alpha_1} \cdot \ldots p_k^{\alpha_k}$. Тогда -$d(n) \leqslant 1 + (\alpha_1 - 1) + \ldots + (\alpha_k - 1) = 1 + \Omega(n) - \omega(n)$. - -Откуда из теорем в начале для исходной суммы выполнена оценка: - -$$N + \sum\limits_{x \leqslant N} \Omega(x) - \sum\limits_{x \leqslant N} \omega(x) = N + (C_2 - C_1)N + o(N) = O(N)$$ - -Что и требовалось. То есть на самом деле наш алгоритм линейный, и даже с очень неплохой константой. Также -он требует всего $2N$ памяти, не считая списка простых(его можно не хранить после вычисления наименьших делителей). - -Его можно применять для нахождения функции Мёбиуса, Эйлера, количества делителей, суммы делителей, и так далее. - -Также стоит отметить, что можно было просто предподсчитать $d(i)$ для всех чисел за $O(N)$ -потратив ещё $N$ памяти. - -Ценность данной техники в том, что она позволяет сэкономить память, а также решать задачу почти в общем случае, даже -когда считать $f$ для степени простого очень сложно. - -### Реализация - -Ниже приведена реализация на языке C++ - -``` {.c} -// ld -- наименьший делитель числа, предпосчитан линейным решетом -// fs -- список значений функции f для чисел от $1$ до $N$ - -// Также можно возвращать, например не $k$, а $p^k$ или пару $(k, p^k)$, чтобы не считать дважды -int d(int n) { - if (n == 1) { - return 1; - } - int p = ld[n]; - int ans = 1; - while (ld[n / p] == p) { - ans += 1; - n /= p; - } - return ans; -} - -int f(int p, int k) { - // Результат функции для p^k - // В качестве примера возьмём функцию Эйлера - int ans = (p - 1); - for (int i = 0; i < k - 1; i++) { - ans *= p; - } -} - -void calculate(int N) { - fs[1] = 1; - for (int i = 2; i <= N; i++) { - int k = d(i), p = ld[i]; - int pk = 1; // $p^k$ - for (int j = 0; j < k; j++) { - pk *= p; - } - if (pk == i) { - fs[i] = f(p, k); - } else { - fs[i] = fs[i / pk] * fs[pk] - } - } -} - -``` - -## Полезные ссылки и источники - -* [Оригинальное доказательство основной леммы](https://math.stackexchange.com/questions/3886140/upper-bound-of-sum-of-powers-of-lowest-divisors) -* [Hardy-Wright: An introduction to the theory of numbers pdf](https://blngcc.files.wordpress.com/2008/11/hardy-wright-theory_of_numbers.pdf) -, книга со всеми доказательствами. -* [Шаблоны алгоритмики](https://github.com/algorithmica-org/algorithmica), то, откуда были взяты css-файлы и шрифты для отображения этой - статьи - diff --git a/quadratic_forms/Makefile b/quadratic_forms/Makefile deleted file mode 100644 index 0a6bd46..0000000 --- a/quadratic_forms/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# Default makefile for algorithmica-like pages - -.PHONY: all clean - -all: render.html - -render.html: main.md - pandoc $< --to html --mathjax --output $@ - -clean: - test -f render.html && rm render.html || echo "Nothing to clean" diff --git a/quadratic_forms/config.json b/quadratic_forms/config.json deleted file mode 100644 index 7ae2727..0000000 --- a/quadratic_forms/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "quadratic_forms", - "standalone": false, - "title": "Квадратичные вычеты и корни по простому модулю", - "template": "basic_template.html", - "credits": [ - "Никифор Кузнецов" - ] -} diff --git a/quadratic_forms/main.md b/quadratic_forms/main.md deleted file mode 100644 index f0628db..0000000 --- a/quadratic_forms/main.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -header-includes: | - \newcommand{\legendre}[2]{\begin{pmatrix} #1\cr \hdashline #2\cr \end{pmatrix}} - \newcommand{\Zp}{\mathbb{Z}_p} -... - - -# Квадратичные вычеты и корни по простому модулю - -На данный момент статья находится в разработке. - -В этой статье вы узнаете всё о квадратичных вычетах по простому модулю и разложении числа в сумму двух квадратов. - -Будем считать, что арифметические операции в $\Zp$ работают за константое время или что то же самое, мерять все в арифметических -операциях(сложение, умножение, вычитание). - - -## Вычеты, символ Лежандра - -Здесь и далее $p$ -- простое число. - -**Определение**. $p \nmid a \leftarrow \Zp$ называется _квадратичным вычетом_ если существует такое $z$, что $z^2 \equiv a \pmod{p}$, а -иначе _невычетом_. - -**Определение**. Символом Лежандра числа $a$ называется величина $\legendre{a}{p}$, равная единице, если $a$ является квадратичным -вычетом по модулю $p$, нулю если $a \equiv 0$, и $-1$ иначе. - -**Лемма**. В $\Zp$ поровну квадратичных вычетов и невычетов, а именно $\frac{p - 1}{2}$. - -**Доказательство**. Посмотрим на числа $1^2, 2^2, \ldots, (p - 1)^2$. Заметим, что $a^2 \equiv b^2$ равносильно тому что $p \mid (a - b)(a + b)$, то есть -либо $a \equiv b$, либо $a \equiv -b$. А это значит, что среди первых $\frac{p - 1}{2}$ квадратов нет повторяющихся, а поскольку $a^2 -\equiv (p - a)^2$, то это все квадраты, что и требовалось. - -**Лемма**. $\legendre{ab}{p} = \legendre{a}{p} \legendre{b}{p}$. - -**Доказательство**. Посмотрим что означает данное утверждение. Оно значит, что произведение двух вычетов является вычетом, произведение двух невычетов также -является вычетом, а вот произведение вычета и невычета является невычетом. - -Очевидно, что произведение двух вычетов является вычетом. $a \equiv x^2, b \equiv y^2$, значит $ab \equiv (xy)^2$. - -Также понятно про произведение вычета и невычета. Если $a \equiv x^2, ab \equiv y^2$, то $b \equiv \left( \frac{y}{x} \right)^2$, где -$\frac{y}{x} = yx^{-1}$, а $x^{-1}$ обратный остаток к $x$. - -Осталось доказать, что произведение двух невычетов является вычетом. Предположим противное. Пусть $c \equiv ab$. Для -каждого $x$ существует единственный $y$ такой, что $xy \equiv c$. Поскольку $c$ не является вычетом все числа можно так разбить на пары. -Но в каждой паре есть хотя бы один невычет из первого пункта доказательства, но в одной из пар два невычета, значит их больше половины, противоречие. - -Мы доказали очень важное свойство, которое называется _мультипликативностью_. - -**Лемма**. $\legendre{a}{p} = a^{\frac{p - 1}{2}}$. - -**Доказательство**. Заметим, что если $a \equiv x^2$, то $a^{\frac{p - 1}{2}} \equiv x^{p - 1} \equiv 1$ по малой теореме Ферма, то есть -для вычетов утверждение верно. - -Можно было бы сказать, что многочлен $x^{\frac{p - 1}{2}} - 1$ имеет не более $\frac{p - 1}{2}$ корней, потому что $\Zp$ -- поле, но у -этого факта есть более элементарное доказательство. - -Проделаем тот же трюк, что и в доказательстве мультипликативности для двух невычетов. Тогда произведение всех чисел в парах с одной -стороны равно $(p - 1)!$, так как каждое число встречается ровно один раз, а с другой стороны $a^{\frac{p - 1}{2}}$, но по теореме -Вильсона $(p - 1)! \equiv -1 \pmod{p}$. - -Это знание, например, позволит нам определить когда $-1$ является вычетом, и, даже, если очень постараться, понять то же самое про $2$. - -**Лемма**. $-1$ является вычетом тогда и только тогда, когда $p = 4k + 1$. - -**Доказательство**. Примените формулу для символа Лежандра. - -**Лемма**. $\legendre{2}{p} = (-1)^{\frac{p^2 - 1}{8}}$. - -**Доказательство**. Пусть $P = 2 \cdot 4 \cdot \ldots \cdot (p - 1)$. Тогда $P \equiv 2^{\frac{p - 1}{2}} \left(\frac{p - 1}{2}\right)! -\equiv \legendre{2}{p} \left(\frac{p - 1}{2} \right)!$ - -Сократим общие множители в сравнении и рассмотрим случаи. - -__Первый случай__. $p = 4k + 1$. Получаем сравнение -\begin{equation*} - (2k + 2) \cdot \ldots \cdot 4k \equiv \legendre{2}{p} \cdot 1 \cdot 3 \cdot \ldots (2k - 1) -\end{equation*} - -Заметим, что -\begin{equation*} - (2k + 2) \cdot \ldots \cdot 4k \equiv (-1)^k \cdot 1 \cdot 4 \cdot \ldots \cdot (2k - 1) -\end{equation*} -Откуда $(-1)^k \equiv \legendre{2}{p}$. Нетрудно проверить, что $k$ и $\frac{p^2 - 1}{8}$ имеют одинаковую четность, что и требовалось. - -__Второй случай__. $p = 4k + 3$. Второй случай аналогичен и достается читателю в качестве простого и приятного упражнения. - -### Нахождение квадратного корня по модулю - -Символ Лежандра числа $a$ можно найти за $O(\log p)$, возведя его в степень $\frac{p - 1}{2}$. А можно ли найти квадратный корень числа -по модулю? - -Для начала попробуем найти квадратный корень $-1$, если $p = 4k + 1$. Пусть $a$ -- невычет по модулю $p$, то $a^{\frac{p - 1}{2}} \equiv -1$, а -значит $a^{\frac{p - 1}{4}} \equiv a^k$ это искомый корень. Перед нами встаёт задача о нахождении невычета по модулю $p$. - -**Лемма**. Существует алгоритм, который находит невычет по модулю $p$ за ожидаемое время $O(\log p)$. - -**Доказательство**. Будем брать случайное число от $1$ до $p - 1$ включительно и проверять является ли оно невычетом, вычисляя символ -Лежандра за $O(\log p)$. -Поскольку невычетов ровно половина, вероятность того, что очередное число окажется невычетом равна $\frac{1}{2}$, а значит -ожидаемое число шагов равно $2$. - -Существование полиномиального, детерминированного и безусловного(не опирающегося на недоказанные факты) алгоритма является открытой проблемой. -В предположении гипотезы Римана среди первых $O(\log^2 p)$ чисел есть невычет. - -**Лемма**. Если $n$ является вычетом, то существует алгоритм, который за ожидаемое время $O(\log p)$ находит такое $a$, что $a^2 - n$ -является невычетом. - -**Доказательство**. Если $n$ вычет, то $n = x^2$, а тогда $a^2 - n = a^2 - x^2 = (a - x)(a + x)$. Воспользуемся мультипликативностью -символа Лежандра, в предположении, что $a + x$ не равно нулю по модулю $p$. - -\begin{equation*} -\legendre{a^2 - n}{p} = \legendre{(a - x)(a + x)}{p} = \legendre{a - x}{p} \legendre{a + x}{p} = \frac{\legendre{a - x}{p}}{\legendre{a + -x}{p}} = \legendre{\dfrac{a - x}{a + x}}{p} -\end{equation*} - -Обозначим $f(a) = \dfrac{a - x}{a + x}$. Пусть $f(a) \equiv f(b)$. Тогда -\begin{equation*} -\dfrac{a - x}{a + x} \equiv \dfrac{b - x}{b + x} -\end{equation*} -\begin{equation*} -(a - x)(b + x) \equiv (a + x)(b - x) -\end{equation*} -\begin{equation*} -ab - bx + ax - x^2 \equiv ab + bx - ax - x^2 -\end{equation*} -\begin{equation*} -(a - b)x \equiv (b - a)x -\end{equation*} - -То есть $f(a) \equiv f(b) \Longrightarrow a \equiv b$. - -Поскольку $\legendre{a^2 - n}{p} = \legendre{f(a)}{p}$, то вероятность того, что случайно выбранное $a$ окажется подходящим равна -вероятности того, что $f(a)$ является невычетом. Но как было показано ранее, для разных аргументов $f$ возвращает разные значения, а -значит $f$ равновероятно распределена между какими-то $p - 1$ значениями. - -Среди любых $p - 1$ остатков хотя бы $\frac{p - 1}{2} - 1$ невычетов. Можно понять это так, мы берем все остатки, и исключаем из них -один, а изначально невычетов $\frac{p - 1}{2}$. Таким образом вероятность того, что $f(a)$ невычет не меньше $\frac{p - 3}{2p - 2}$. - -То есть если мы будем выбирать $a$ случайно от 0 до $p$ невключительно, то ожидаемое количество шагов при $p > 3$ ограничено константой. -Можно убедиться, что при $p = 3$ мы сможем найти такое $a$. Действительно, единственный вычет это $1$, то есть $n = 1$. Тогда подходящее $a = 0$. - -**Лемма**. Существует алгоритм, который для вычета $n$ ищет такой $z$, что $z^2 \equiv n \pmod{p}$ за ожидаемое время $O(\log p)$. - -**Доказательство**. Найдём такое $a$, что $a^2 - n$ является невычетом за ожидаемое время $O(\log p)$. Обозначим за $\omega = \sqrt{a^2 - n}$. -Строго говоря, посмотрим на все многочлены в $\Zp$ от $\omega$. и посмотрим на них по модулю $\omega^2 - (a^2 - n)$. Получившееся -множество $\{ a + bw \mid a, b \leftarrow \Zp \}$ будем обозначать $T = \Zp[w]/(w^2 - (a^2 - n))$. - -Заметим, что числа из $T$ можно складывать и умножать: $$(a + bw) + (c + dw) = (a + c) + (b + d)w, (a + bw)(c + dw) = (ac + bd(a^2 - n)) + -(ad + bc)w$$ - -Понятно, что сложение и умножение обладает всеми необходимыми свойствами(коммутативность, дистрибутивность, ассоциативность) - -В качестве упражнения читателю остается проверить, что $T$ -- поле. Из содержательных свойств надо проверить обратимость умножения. - -**Лемма**. $(a + w)^{\frac{p + 1}{2}}$ является искомым $z$, что в частности значит, что оно не имеет компоненту с $w$. - -**Доказательство**. Посмотрим на $(a + w)^{p + 1}$. Заметим, что $(a + w)^p = a^p + w^p$. Действительно, если раскрыть скобки по биному -Ньютона, то все остальные члены будут делиться на $p$. Также $w^p = -w$, поскольку $w^{p - 1} = (a^2 - n)^\frac{p - 1}{2} = -1$, в силу -того, что $a^2 - n$ невычет. Тогда - -\begin{equation*} -(a + w)^{p + 1} = (a^p + w^p)(a + w) = (a - w)(a + w) = a^2 - w^2 = a^2 - (a^2 - n) = n -\end{equation*} - -Поскольку читатель проверил, что $T$ является полем, многочлен $x^2 - n$ имеет в нем не более двух корней. Но мы знаем, что $z$ и $-z$ -являются его корнями. В то же время $\left((a + w)^\frac{p + 1}{2}\right)^2 - n = 0$, значит оно и есть искомое $z$. - -Итого мы доказали очень простой алгоритм для нахождения квадратного корня по модулю. - -1. Найти такое $a$, что $a^2 - n$ является невычетом методом проб и ошибок -2. Возвести $(a + w)$ в степень $\frac{p + 1}{2}$ быстрым возведением в степень, где $w = \sqrt{a^2 - n}$, это и будет результатом. - - -## Разложение в сумму двух квадратов - -Наша цель, понять, для каких $n$ существуют $a, b$, такие, что $a^2 + b^2 = n$, и как их оптимально искать. - -Для начала попробуем решить задачу для простого $p$. Сразу понятно, что если $p = 4k + 3$, то разложить в сумму двух квадратов не -удастся, можно даже доказать более сильное утверждение. - -**Лемма Жирара**. Если $a^2 + b^2 \equiv 0 \pmod{p}$, где $p$ простое число вида $4k + 3$, то $p \mid a, b$. - -**Доказательство**. $a^2 \equiv -b^2 \pmod{p}$. Возьмём символ лежандра от обоих частей и воспользуемся мультипликативностью. - -\begin{equation*} -\legendre{a^2}{p} = \left[\legendre{a^2}{p} = \legendre{-b^2}{p}\right] = \legendre{-1}{p} \legendre{b^2}{p} = -1 \legendre{b^2}{p} -\end{equation*} - -Последнее равенство в силу того, что $p = 4k + 3$. Но тогда $\legendre{a^2}{p} = \legendre{b^2}{p} = 0$, что и требовалось. - -**Лемма**. Любое простое $p$ вида $4k + 1$ представляется в виде суммы двух квадратов. - -Попробуем конструктивно научиться искать разложение для $p = 4k + 1$. Для начала поймем как "перемножать" квадратичные формы, -это также поможет нам далее, когда мы перейдем в составному $n$. - -Пусть $a^2 + b^2 = x, c^2 + d^2 = y$. Тогда -\begin{equation*} -a^2c^2 + a^2d^2 + b^2c^2 + b^2d^2 = xy -\end{equation*} -\begin{equation*} -(ac)^2 + (ad)^2 + (bc)^2 + (bd)^2 = xy -\end{equation*} -\begin{equation*} -(ac)^2 + (bd)^2 + 2abcd + (ad)^2 + (bc)^2 - 2abcd = xy -\end{equation*} -\begin{equation*} -(ac + bd)^2 + (ad - bc)^2 = xy -\end{equation*} - -То есть мы доказали, что если $x, y$ представимы в виде суммы двух квадратов, то $xy$ тоже представимо в виде суммы двух квадратов. - -Попробуем представить число $p$, пользуясь предыдущим знанием. Пусть для начала у нас есть разбиение числа $mp$ для какого-то $m$, то -есть $a^2 + b^2 = mp$. - -**Определение**. _Абсолютно наименьшим вычетом_ числа $a$ по модулю $m$ называется наименьшее по абсолютному значению $b$ такое, что -$a \equiv b \pmod{m}$. - -Пусть $c, d$ _абсолютно наименьшие вычеты_ чисел $a, b$ по модулю $m$. Тогда $c^2 + d^2 = mk$ и $k \leqslant \frac{m}{2}$. - -Тогда мы можем представить $m^2pk = (ac + bd)^2 + (ad - bc)^2$. Остается только заметить, что $ad - bc$ и $ac + bd$ делятся на $m$. -Действительно, $ad - bc \equiv ab - ab \equiv 0 \pmod{m}$ и $ac + bd \equiv a^2 + b^2 \equiv 0 \pmod{m}$. -\begin{equation*} - pk = \left( \dfrac{ad - bc}{m} \right)^2 + \left( \dfrac{ac + bd}{m} \right)^2 -\end{equation*} - -Если мы будем повторять эту процедуру, то на каждом шаге $m$ будет уменьшаться хотя бы в два раза, а значит когда-то станет единицей, и -мы получим требуемое разбиение. - -Тем самым мы не только доказали лемму, но и нашли эффективный алгоритм нахождения такого разложения. - -### Анализ алгоритма - -В качестве начального разбиения можно взять $a = 1, b = z$, где $z^2 \equiv -1 \pmod{p}$. Найти $z$ можно за $O(\log p)$. -Далее мы делаем $O(\log p)$ шагов, так как начальное $m$ не превосходит $p$, на каждом шаге делаем константное число операций. - -Итого за $O(\log p)$ времени и $O(1)$ дополнительной памяти мы умеем искать разложение $p$ в сумму двух квадратов. - -### Составное $n$ - -Самое интересное происходит в случае составного $n$. Оказывается верно следующее. - -**Рождественская теорема Ферма**. Число $n$ можно представить в виде суммы двух квадратов тогда и только тогда, когда каждое простое $p$ -вида $4k + 3$ входит в разложение $n$ в четной степени. - -В одну сторону мы уже умеем доказывать и находить разбиение. Действительно $2 = 1^2 + 1^2, p^2 = 0^2 + p^2$. Для простых вида $4k + 1$ -мы умеем находить разбиение, а ещё мы умеем перемножать два существующих. - -**Лемма**. Для любого простого $p$ вида $4k + 3$ его степень вхождения в $a^2 + b^2$ чётна. - -**Доказательство**. Если $a^2 + b^2$ не делится на $p$, то утверждение очевидно. Иначе воспользуемся леммой Жирара, получим что $p \mid -a, b$. Тода $p^2 \mid a^2 + b^2$ и $\left( \frac{a}{p} \right)^2 + \left( \frac{b}{p} \right)^2 = \frac{a^2 + b^2}{p^2}$. Применяя то же -самое рассуждение получаем требуемое. -