<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Математика on kenji.blog</title><link>http://kenji.blog/ru/tags/%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0/</link><description>Recent content in Математика on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ru</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 06 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ru/tags/%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>【Полное понимание через формулы】 Почему сильнейший классический «GNFS» проигрывает квантовым алгоритмам? Смена парадигмы в факторизации</title><link>http://kenji.blog/ru/p/gnfs-to-shors-algorithm-math-deepdive/</link><pubDate>Sun, 06 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/ru/p/gnfs-to-shors-algorithm-math-deepdive/</guid><description>&lt;img src="http://kenji.blog/p/gnfs-to-shors-algorithm-math-deepdive/quantum_vs_gnfs_eyecatch_1788616101508.jpg" alt="Featured image of post 【Полное понимание через формулы】 Почему сильнейший классический «GNFS» проигрывает квантовым алгоритмам? Смена парадигмы в факторизации" />&lt;p>Информационная безопасность в современном интернет-обществе защищена криптографией с открытым ключом, такой как RSA. Основа безопасности RSA опирается на тот факт, что &lt;strong>&amp;ldquo;факторизация огромных составных чисел вычислительно крайне сложна&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>В этой статье мы раскроем математический механизм &lt;strong>&amp;ldquo;Общего метода решета числового поля&amp;rdquo;&lt;/strong> (GNFS) — самого мощного алгоритма факторизации для классических компьютеров, и подробно разберем, почему он полностью побежден &lt;strong>&amp;ldquo;Алгоритмом Шора&amp;rdquo;&lt;/strong> , открытым Питером Шором. Мы глубоко исследуем эту смену парадигмы с помощью математических формул и концептуальных схем.&lt;/p>
&lt;hr>
&lt;h2 id="1-подход-к-факторизации-в-классических-вычислениях-развитие-метода-факторизации-ферма">1. Подход к факторизации в классических вычислениях: развитие метода факторизации Ферма
&lt;/h2>&lt;p>Задача факторизации — это задача поиска простых чисел $p, q$, таких что $N = p \times q$ для заданного составного числа $N$.&lt;/p>
&lt;p>Основная идея сводится к поиску нетривиальных $x, y$, удовлетворяющих следующему сравнению:&lt;/p>
$$ x^2 \equiv y^2 \pmod N $$
&lt;p>Если мы преобразуем это, то получим:&lt;/p>
$$ x^2 - y^2 \equiv 0 \pmod N $$
$$ (x - y)(x + y) \equiv 0 \pmod N $$
&lt;p>Здесь, если $x \not\equiv \pm y \pmod N$, мы можем получить нетривиальный делитель $N$, вычислив $\gcd(x-y, N)$ или $\gcd(x+y, N)$. Этот факт лежит в основе современных алгоритмов факторизации, таких как GNFS.&lt;/p>
&lt;hr>
&lt;h2 id="2-сильнейший-классический-алгоритм-глубины-общего-метода-решета-числового-поля-gnfs">2. Сильнейший классический алгоритм: Глубины &amp;ldquo;Общего метода решета числового поля&amp;rdquo; (GNFS)
&lt;/h2>&lt;p>&lt;strong>&amp;ldquo;GNFS&amp;rdquo;&lt;/strong> — это самый быстрый алгоритм факторизации для классических компьютеров из известных на сегодняшний день. Его временная сложность требует субэкспоненциального (Sub-exponential) времени.&lt;/p>
&lt;h3 id="сложность-gnfs">Сложность GNFS
&lt;/h3>&lt;p>Если предположить, что количество цифр $N$ равно $b = \log_2 N$, сложность GNFS может быть выражена следующим образом:&lt;/p>
$$ O\left( \exp \left( \left(\frac{64}{9} b\right)^{1/3} (\log b)^{2/3} \right) \right) $$
&lt;p>Как видно из этой формулы, сложность представляет собой не полиномиальное время, а &lt;strong>&amp;ldquo;субэкспоненциальное время&amp;rdquo;&lt;/strong> , что лишь немного медленнее экспоненциального. Тем не менее, с увеличением количества цифр время вычислений возрастает астрономически.&lt;/p>
&lt;h3 id="математический-механизм-gnfs">Математический механизм GNFS
&lt;/h3>&lt;p>GNFS можно условно разделить на 4 этапа:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Выбор многочленов (Polynomial Selection)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Просеивание (Sieving)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Редукция матрицы (Matrix Reduction)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Вычисление квадратного корня (Square Root)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;h4 id="21-выбор-многочленов-и-алгебраическое-числовое-поле">2.1. Выбор многочленов и алгебраическое числовое поле
&lt;/h4>&lt;p>Сначала выбираются неприводимые многочлены $f(x)$ и $g(x)$ с целыми коэффициентами. Они задаются так, чтобы иметь общий корень $m$ по модулю $N$. То есть:&lt;/p>
$$ f(m) \equiv 0 \pmod N $$
$$ g(m) \equiv 0 \pmod N $$
&lt;p>Обычно $g(x)$ выбирается как многочлен первой степени $g(x) = x - m$. Если корень $f(x)$ обозначить как $\alpha$, образуется &lt;strong>&amp;ldquo;алгебраическое числовое поле&amp;rdquo;&lt;/strong> (Number Field) $\mathbb{Q}(\alpha)$. Мы сравниваем операции в кольце $\mathbb{Q}(\alpha)$ и операции в обычном кольце целых чисел $\mathbb{Z}$ посредством гомоморфизма $\phi: \alpha \mapsto m$.&lt;/p>
&lt;h4 id="22-просеивание-sieving">2.2. Просеивание (Sieving)
&lt;/h4>&lt;p>Далее мы ищем большое количество пар взаимно простых целых чисел $(a, b)$. Цель — найти такие пары, чтобы оба следующих значения были &lt;strong>&amp;ldquo;B-гладкими&amp;rdquo;&lt;/strong> (B-smooth, то есть состоящими только из относительно малых простых множителей):&lt;/p>
&lt;ol>
&lt;li>$a - bm$ (значение в кольце целых чисел)&lt;/li>
&lt;li>$b^d f(a/b)$ (соответствует норме $N(a - b\alpha)$ в алгебраическом поле)&lt;/li>
&lt;/ol>
&lt;p>Здесь используется метод быстрого поиска, называемый &lt;strong>&amp;ldquo;Решето&amp;rdquo;&lt;/strong> (Sieve). Это позволяет эффективно извлекать пары $(a, b)$, удовлетворяющие условиям, из огромного числа кандидатов.&lt;/p>
&lt;h4 id="23-редукция-матрицы-linear-algebra-over-gf2">2.3. Редукция матрицы (Linear Algebra over GF(2))
&lt;/h4>&lt;p>Из собранных пар $(a, b)$ мы формируем векторы показателей степени и находим левое нуль-пространство огромной разреженной матрицы над $\mathbb{F}_2$ (поле, содержащее только 0 и 1).&lt;/p>
&lt;p>Мы находим вектор решения $v$ так, чтобы соотношения $ \prod (a_i - b_i m) $ и $ \prod (a_i - b_i \alpha) $ становились полными квадратами. Это не что иное, как решение системы линейных уравнений:&lt;/p>
$$ M \mathbf{x} \equiv \mathbf{0} \pmod 2 $$
&lt;p>Здесь используются продвинутые алгоритмы численных вычислений, такие как алгоритм блочного Ланцоша (Block Lanczos) или блочного Видемана (Block Wiedemann).&lt;/p>
&lt;h4 id="24-вычисление-квадратного-корня">2.4. Вычисление квадратного корня
&lt;/h4>&lt;p>Наконец, мы извлекаем квадратный корень как в алгебраическом числовом поле, так и в кольце целых чисел, что приводит к соотношению $x^2 \equiv y^2 \pmod N$. Затем мы вычисляем $\gcd(x-y, N)$ и получаем делитель.&lt;/p>
&lt;hr>
&lt;h2 id="3-прорыв-квантовых-вычислений-алгоритм-шора">3. Прорыв квантовых вычислений: &amp;ldquo;Алгоритм Шора&amp;rdquo;
&lt;/h2>&lt;p>В то время как GNFS требует субэкспоненциального времени, &lt;strong>&amp;ldquo;Алгоритм Шора&amp;rdquo;&lt;/strong> , опубликованный Питером Шором в 1994 году, может решить эту задачу за &lt;strong>&amp;ldquo;полиномиальное время&amp;rdquo;&lt;/strong> с использованием квантового компьютера.&lt;/p>
&lt;h3 id="сложность-алгоритма-шора">Сложность Алгоритма Шора
&lt;/h3>&lt;p>Если предположить, что количество кубитов равно $O(\log N)$, то временная сложность составит:&lt;/p>
$$ O((\log N)^3) $$
&lt;p>Это означает, что экспоненциального взрыва относительно количества битов не происходит. Это поразительный результат, когда факторизация огромных составных чисел, время вычисления которых в &lt;strong>&amp;ldquo;классических вычислениях&amp;rdquo;&lt;/strong> превышает возраст Вселенной, может быть решена от нескольких часов до нескольких дней с помощью &lt;strong>&amp;ldquo;квантовых вычислений&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;h3 id="обзор-алгоритма-шора-сведение-к-задаче-поиска-периода">Обзор Алгоритма Шора: Сведение к задаче поиска периода
&lt;/h3>&lt;p>Алгоритм Шора искусно сводит задачу факторизации к &lt;strong>&amp;ldquo;задаче поиска периода&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;ol>
&lt;li>Выберите случайное целое число $a$, взаимно простое с $N$ ($1 &lt; a &lt; N$).&lt;/li>
&lt;li>Определите функцию $f(x) = a^x \bmod N$.&lt;/li>
&lt;li>Найдите период $r$ функции $f(x)$, то есть наименьшее положительное целое число $r$ такое, что $a^r \equiv 1 \pmod N$.&lt;/li>
&lt;li>Если $r$ четное, проверьте, не выполняется ли $a^{r/2} \not\equiv -1 \pmod N$, и вычислите $\gcd(a^{r/2} \pm 1, N)$ для получения простого делителя.&lt;/li>
&lt;/ol>
&lt;p>Этот шаг 3, то есть &lt;strong>&amp;ldquo;нахождение периода $r$&amp;rdquo;&lt;/strong> , является узким местом, требующим экспоненциального времени на классическом компьютере. Однако квантовый компьютер решает это мгновенно, используя &lt;strong>&amp;ldquo;квантовую суперпозицию&amp;rdquo;&lt;/strong> и &lt;strong>&amp;ldquo;Квантовое преобразование Фурье&amp;rdquo;&lt;/strong> (QFT).&lt;/p>
&lt;hr>
&lt;h2 id="4-квантовое-преобразование-фурье-qft-и-извлечение-периода">4. Квантовое преобразование Фурье (QFT) и извлечение периода
&lt;/h2>&lt;p>Давайте подробнее рассмотрим математические операции над квантовыми состояниями, которые лежат в основе Алгоритма Шора.&lt;/p>
&lt;h3 id="41-генерация-квантовой-суперпозиции">4.1. Генерация квантовой суперпозиции
&lt;/h3>&lt;p>Сначала подготовьте 2 квантовых регистра. Регистр 1 хранит состояние суперпозиции входных данных $x$, а регистр 2 хранит результат вычисления функции $f(x)$. Примените преобразование Адамара (Hadamard Transform) к начальному состоянию $|0\rangle |0\rangle$, чтобы создать суперпозицию всех возможных значений $x$.&lt;/p>
$$ |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle |0\rangle $$
&lt;p>
(где $Q$ — это степень двойки, удовлетворяющая $N^2 \le Q &lt; 2N^2$)&lt;/p>
&lt;p>Далее используйте квантовый оракул $U_f$ для вычисления $f(x) = a^x \bmod N$ и сохраните результат в регистре 2.&lt;/p>
$$ |\psi_2\rangle = U_f |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle |a^x \bmod N\rangle $$
&lt;p>Предположим теперь, что регистр 2 измеряется (теоретически, даже если он не измеряется, математическая структура та же). Если наблюдается некоторое значение $y = a^{x_0} \bmod N$, состояние регистра 1 коллапсирует в суперпозицию всех $x$, удовлетворяющих $f(x) = y$. Если предположить, что период равен $r$, такие $x$ будут иметь вид $x_0, x_0 + r, x_0 + 2r, \dots$&lt;/p>
$$ |\psi_3\rangle = \frac{1}{\sqrt{M}} \sum_{k=0}^{M-1} |x_0 + kr\rangle $$
&lt;p>
(где $M \approx Q/r$ — количество членов)&lt;/p>
&lt;p>Это состояние содержит информацию о периоде $r$, но прямое измерение даст лишь случайное $x_0 + kr$, и период $r$ останется неизвестным. Здесь вступает в дело QFT.&lt;/p>
&lt;h3 id="42-применение-квантового-преобразования-фурье-qft">4.2. Применение Квантового преобразования Фурье (QFT)
&lt;/h3>&lt;p>QFT — это операция, применяющая дискретное преобразование Фурье к амплитудам квантового состояния. Действие QFT на состояние $|x\rangle$ определяется следующим образом:&lt;/p>
$$ \text{QFT} |x\rangle = \frac{1}{\sqrt{Q}} \sum_{y=0}^{Q-1} e^{2\pi i \frac{xy}{Q}} |y\rangle $$
&lt;p>Когда это применяется к $|\psi_3\rangle$, возникает фазовая интерференция (квантовая интерференция).&lt;/p>
$$ |\psi_4\rangle = \text{QFT} |\psi_3\rangle = \frac{1}{\sqrt{MQ}} \sum_{y=0}^{Q-1} \sum_{k=0}^{M-1} e^{2\pi i \frac{(x_0 + kr)y}{Q}} |y\rangle $$
&lt;p>Если мы раскроем сумму в этой формуле, появится следующая часть:&lt;/p>
$$ \sum_{k=0}^{M-1} e^{2\pi i \frac{kry}{Q}} $$
&lt;p>Сумма этой геометрической прогрессии взаимно усиливается (Конструктивная интерференция, Constructive Interference) только когда $ry/Q$ близко к целому числу, и взаимно уничтожается (Деструктивная интерференция, Destructive Interference) в других случаях.&lt;/p>
&lt;p>Следовательно, состояние $|y\rangle$, измеряемое с высокой вероятностью, будет целым числом $y$, удовлетворяющим условию:&lt;/p>
$$ \frac{y}{Q} \approx \frac{c}{r} $$
&lt;p>(где $c$ — некоторое целое число).&lt;/p>
&lt;h3 id="43-определение-периода-через-разложение-в-цепную-дробь">4.3. Определение периода через разложение в цепную дробь
&lt;/h3>&lt;p>После получения $y$ в результате измерения используйте классический компьютер для выполнения &lt;strong>&amp;ldquo;разложения в цепную дробь&amp;rdquo;&lt;/strong> (Continued Fraction Expansion) $y/Q$. Это позволяет вычислить подходящую дробь $c/r$ для $y/Q$ и с высокой эффективностью извлечь кандидата на период $r$ из знаменателя.&lt;/p>
&lt;hr>
&lt;h2 id="5-сравнение-концептуальных-моделей-и-смена-парадигмы">5. Сравнение концептуальных моделей и смена парадигмы
&lt;/h2>&lt;p>Чтобы интуитивно понять разницу между GNFS и Алгоритмом Шора, приводится концептуальная схема с использованием нотации Mermaid.&lt;/p>
&lt;h3 id="концептуальная-схема-алгоритма-шора-с-использованием-квантовой-схемы">Концептуальная схема Алгоритма Шора с использованием квантовой схемы
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">graph TD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> A[Начальное состояние: 0...0] --&amp;gt; B[Суперпозиция всех состояний через преобразование Адамара]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> B --&amp;gt; C[Операция модульного возведения в степень a^x mod N]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> C --&amp;gt;|Квантовая запутанность| D[Коллапс в состояние с периодичностью]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> D --&amp;gt; E[Квантовое преобразование Фурье QFT]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> E --&amp;gt;|Усиление вероятности через интерференцию| F[Измерение: Получение y]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> F --&amp;gt; G[Классическая обработка: Цепная дробь]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> G --&amp;gt; H[Обнаружение периода r]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> H --&amp;gt; I[Вычисление простых множителей N]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style A fill:#f9f,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style E fill:#bbf,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style I fill:#bfb,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="суть-смены-парадигмы">Суть смены парадигмы
&lt;/h3>&lt;p>GNFS использует подход &lt;strong>&amp;ldquo;поиска соотношений внутри математического пространства (алгебраического поля)&amp;rdquo;&lt;/strong> . Однако, поскольку пространство поиска расширяется экспоненциально относительно количества цифр, расшифровка становится практически невозможной при длине ключа свыше 2048 бит с использованием классических вычислительных мощностей (даже с учетом распараллеливания).&lt;/p>
&lt;p>С другой стороны, алгоритм Шора использует &lt;strong>&amp;ldquo;волновую природу квантовой интерференции&amp;rdquo;&lt;/strong> . Он оценивает все пути вычислений в состоянии суперпозиции одновременно, подавляет (ослабляет) ненужные ответы с помощью QFT и усиливает только амплитуду вероятности для правильного периода. При этом подход заключается не в поиске в пространстве, а в переходе в совершенно другое измерение: &lt;strong>&amp;ldquo;позволить правильному ответу проявиться самому&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;h2 id="6-заключение">6. Заключение
&lt;/h2>&lt;p>В этой статье мы глубоко сравнили математическую основу и структуру алгоритмов между &lt;strong>&amp;ldquo;GNFS&amp;rdquo;&lt;/strong> , который является пределом классических вычислений, и &lt;strong>&amp;ldquo;Алгоритмом Шора&amp;rdquo;&lt;/strong> , который демонстрирует мощь квантовых вычислений.&lt;/p>
&lt;p>В то время как GNFS использует математические ухищрения, такие как выбор многочленов и вычисления с огромными матрицами, чтобы снизить сложность до субэкспоненциального времени, Алгоритм Шора достигает прямого прорыва до полиномиального времени, объединяя базовые принципы квантовой механики (суперпозицию и интерференцию) с математическим инструментом (QFT).&lt;/p>
&lt;p>В настоящее время не существует отказоустойчивого квантового компьютера (FTQC) практического масштаба (тысячи кубитов), способного запустить Алгоритм Шора. Однако именно наличие этой теоретической и математической смены парадигмы является главной причиной ускорения глобального перехода к постквантовой криптографии (PQC: Post-Quantum Cryptography) во всем мире уже сегодня.&lt;/p></description></item><item><title>"Полная анатомия" понимания сильнейшего алгоритма криптоанализа "GNFS" путем его реализации на C++</title><link>http://kenji.blog/ru/p/gnfs-cpp-implementation/</link><pubDate>Sat, 05 Sep 2026 13:04:59 +0900</pubDate><guid>http://kenji.blog/ru/p/gnfs-cpp-implementation/</guid><description>&lt;img src="http://kenji.blog/p/gnfs-cpp-implementation/gnfs_cpp_blog_eyecatch_1788580949217.jpg" alt="Featured image of post "Полная анатомия" понимания сильнейшего алгоритма криптоанализа "GNFS" путем его реализации на C++" />&lt;h1 id="полная-анатомия-понимания-сильнейшего-алгоритма-криптоанализа-gnfs-путем-его-реализации-на-c">&amp;ldquo;Полная анатомия&amp;rdquo; понимания сильнейшего алгоритма криптоанализа &amp;ldquo;GNFS&amp;rdquo; путем его реализации на C++
&lt;/h1>&lt;p>«Шифрование RSA» фундаментально поддерживает современный Интернет. Его надежность опирается на математическое убеждение, что «факторизация огромного составного числа практически невозможна для современных компьютеров».&lt;/p>
&lt;p>Однако человечество никогда не сдается. В настоящее время существует ** самый сильный и передовой алгоритм ** человечества для гигантской факторизации на классических компьютерах (обычных, а не квантовых). Он называется ** &amp;ldquo;Общий метод решета числового поля&amp;rdquo; (GNFS: General Number Field Sieve) **.&lt;/p>
&lt;p>В этой статье мы полностью публикуем код реализации на C++ (с использованием целых чисел произвольной точности &lt;code>boost::multiprecision&lt;/code> библиотеки Boost), который строго моделирует эту передовую логику вычислений GNFS, и подробно объясняем стоящую за ней «алгебраическую теорию чисел».&lt;/p>
&lt;p>Пожалуйста, насладитесь тайнами математики и мощью информатики, которая их покоряет, вместе с исходным кодом.&lt;/p>
&lt;hr>
&lt;h2 id="1-логический-фреймворк-gnfs-полный-исходный-код">1. Логический фреймворк GNFS (полный исходный код)
&lt;/h2>&lt;p>Сначала представим всю картину реализации GNFS на C++, которая будет здесь объясняться. Фактический метод решета числового поля (например, CADO-NFS) — это гигантская распределенная система из сотен тысяч строк кода. Однако этот код извлекает ** «5 основных конвейеров (фаз)» **, составляющих GNFS, проектирует их как классы и строго моделирует в минимальной конфигурации без потери математического смысла.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;span class="lnt">124
&lt;/span>&lt;span class="lnt">125
&lt;/span>&lt;span class="lnt">126
&lt;/span>&lt;span class="lnt">127
&lt;/span>&lt;span class="lnt">128
&lt;/span>&lt;span class="lnt">129
&lt;/span>&lt;span class="lnt">130
&lt;/span>&lt;span class="lnt">131
&lt;/span>&lt;span class="lnt">132
&lt;/span>&lt;span class="lnt">133
&lt;/span>&lt;span class="lnt">134
&lt;/span>&lt;span class="lnt">135
&lt;/span>&lt;span class="lnt">136
&lt;/span>&lt;span class="lnt">137
&lt;/span>&lt;span class="lnt">138
&lt;/span>&lt;span class="lnt">139
&lt;/span>&lt;span class="lnt">140
&lt;/span>&lt;span class="lnt">141
&lt;/span>&lt;span class="lnt">142
&lt;/span>&lt;span class="lnt">143
&lt;/span>&lt;span class="lnt">144
&lt;/span>&lt;span class="lnt">145
&lt;/span>&lt;span class="lnt">146
&lt;/span>&lt;span class="lnt">147
&lt;/span>&lt;span class="lnt">148
&lt;/span>&lt;span class="lnt">149
&lt;/span>&lt;span class="lnt">150
&lt;/span>&lt;span class="lnt">151
&lt;/span>&lt;span class="lnt">152
&lt;/span>&lt;span class="lnt">153
&lt;/span>&lt;span class="lnt">154
&lt;/span>&lt;span class="lnt">155
&lt;/span>&lt;span class="lnt">156
&lt;/span>&lt;span class="lnt">157
&lt;/span>&lt;span class="lnt">158
&lt;/span>&lt;span class="lnt">159
&lt;/span>&lt;span class="lnt">160
&lt;/span>&lt;span class="lnt">161
&lt;/span>&lt;span class="lnt">162
&lt;/span>&lt;span class="lnt">163
&lt;/span>&lt;span class="lnt">164
&lt;/span>&lt;span class="lnt">165
&lt;/span>&lt;span class="lnt">166
&lt;/span>&lt;span class="lnt">167
&lt;/span>&lt;span class="lnt">168
&lt;/span>&lt;span class="lnt">169
&lt;/span>&lt;span class="lnt">170
&lt;/span>&lt;span class="lnt">171
&lt;/span>&lt;span class="lnt">172
&lt;/span>&lt;span class="lnt">173
&lt;/span>&lt;span class="lnt">174
&lt;/span>&lt;span class="lnt">175
&lt;/span>&lt;span class="lnt">176
&lt;/span>&lt;span class="lnt">177
&lt;/span>&lt;span class="lnt">178
&lt;/span>&lt;span class="lnt">179
&lt;/span>&lt;span class="lnt">180
&lt;/span>&lt;span class="lnt">181
&lt;/span>&lt;span class="lnt">182
&lt;/span>&lt;span class="lnt">183
&lt;/span>&lt;span class="lnt">184
&lt;/span>&lt;span class="lnt">185
&lt;/span>&lt;span class="lnt">186
&lt;/span>&lt;span class="lnt">187
&lt;/span>&lt;span class="lnt">188
&lt;/span>&lt;span class="lnt">189
&lt;/span>&lt;span class="lnt">190
&lt;/span>&lt;span class="lnt">191
&lt;/span>&lt;span class="lnt">192
&lt;/span>&lt;span class="lnt">193
&lt;/span>&lt;span class="lnt">194
&lt;/span>&lt;span class="lnt">195
&lt;/span>&lt;span class="lnt">196
&lt;/span>&lt;span class="lnt">197
&lt;/span>&lt;span class="lnt">198
&lt;/span>&lt;span class="lnt">199
&lt;/span>&lt;span class="lnt">200
&lt;/span>&lt;span class="lnt">201
&lt;/span>&lt;span class="lnt">202
&lt;/span>&lt;span class="lnt">203
&lt;/span>&lt;span class="lnt">204
&lt;/span>&lt;span class="lnt">205
&lt;/span>&lt;span class="lnt">206
&lt;/span>&lt;span class="lnt">207
&lt;/span>&lt;span class="lnt">208
&lt;/span>&lt;span class="lnt">209
&lt;/span>&lt;span class="lnt">210
&lt;/span>&lt;span class="lnt">211
&lt;/span>&lt;span class="lnt">212
&lt;/span>&lt;span class="lnt">213
&lt;/span>&lt;span class="lnt">214
&lt;/span>&lt;span class="lnt">215
&lt;/span>&lt;span class="lnt">216
&lt;/span>&lt;span class="lnt">217
&lt;/span>&lt;span class="lnt">218
&lt;/span>&lt;span class="lnt">219
&lt;/span>&lt;span class="lnt">220
&lt;/span>&lt;span class="lnt">221
&lt;/span>&lt;span class="lnt">222
&lt;/span>&lt;span class="lnt">223
&lt;/span>&lt;span class="lnt">224
&lt;/span>&lt;span class="lnt">225
&lt;/span>&lt;span class="lnt">226
&lt;/span>&lt;span class="lnt">227
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;cmath&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;map&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;set&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;chrono&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;boost/multiprecision/cpp_int.hpp&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Использование чисел произвольной точности Boost.Multiprecision
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">boost&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">multiprecision&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// [SOTA GNFS] General Number Field Sieve Передовой логический фреймворк
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Этот код строго моделирует 5 конвейеров современного GNFS,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// используемого в CADO-NFS и др., как классы на C++ (Boost).
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Relation&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">rational_primes&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">algebraic_primes&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Фаза 1: Выбор полинома (алгоритм КлейнЮнга)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">PolynomialSelector&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Алгебраический полином f(x)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">g&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Рациональный полином g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Генерация начального полинома на основе m-расширения (в реальности используется более сложное сокращение базиса решетки LLL)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 1] Выбор полинома (Степень &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">degree&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;) начинается...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Простое m-расширение (степени d)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// m = N^(1/d)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">N_copy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Простая аппроксимация m (без использования функций Boost)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">high&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">low&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">high&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">high&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">low&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*=&lt;/span> &lt;span class="n">mid&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">high&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">resize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">degree&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; m = &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; f(x) = &amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;x^&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="s">&amp;#34; + &amp;#34;&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">[Фаза 1] Завершено.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Фаза 2: Решето на решетках (Lattice Sieving)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// В современных GNFS вместо Line Sieve используется Special-q Lattice Sieving,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// разработанное Франке и КлейнЮнгом, которое стало де-факто стандартом.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">LatticeSieve&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">rational_bound&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">algebraic_bound&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">rational_fb&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">algebraic_fb&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LatticeSieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">ab&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">rational_bound&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rb&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">algebraic_bound&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ab&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">generate_factor_bases&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 2] Генерация факторных баз (Рациональная граница: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">rational_bound&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;, Алгебраическая граница: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">algebraic_bound&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;)&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// (Опущено) На самом деле выполняется генерация простых чисел и фильтрация с помощью символов Лежандра и т.д.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">poly&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 2] Special-q Lattice Sieving активен...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Макетная реализация: реальное решето на решетках сканирует сотни ГБ памяти блоками.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Пары (a, b) проецируются на решетку (a = i*q + j*...) для каждого особого простого q,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// и выполняется просеивание с экстремальной эффективностью кэширования.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Добавлено фиктивное отношение для демонстрации
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Relation&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">17&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">rational_primes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">algebraic_primes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relations&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 2] Найдено &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; отношений.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Фаза 3: Фильтрация (удаление синглтонов и слияние клик)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">Filter&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 3] Фильтрация отношений...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Удаление синглтонов (удаление отношений с простыми числами, появляющимися только раз)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 2. Слияние клик (объединение отношений для превращения разреженной матрицы в плотную)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// В реальности алгоритмы вроде Union-Find сжимают матрицу из сотен миллионов строк до нескольких миллионов.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 3] Размер матрицы оптимально уменьшен.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Фаза 4: Линейная алгебра над GF(2) (метод Блока Видемана)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearAlgebraGF2&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// В современных суперкомпьютерных средах вместо метода Block Lanczos
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// передовым является метод Block Wiedemann (реализация Coppersmith), удобный для распределенных вычислений.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 4] Алгоритм Блока Видемана над GF(2) начинается...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Итеративное вычисление произведения разреженной матрицы и вектора,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// поиск нескольких векторов решений (ядер), где M * x = 0 mod 2.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Список зависимостей
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Фиктивные данные
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 4] Найдено &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; линейных зависимостей (полных квадратов).&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Фаза 5: Алгебраический квадратный корень (Algebraic Square Root)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">AlgebraicSquareRoot&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">dep&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 5] Вычисление алгебраического квадратного корня...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Вычисление рационального корня V
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">V&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// V = sqrt( prod(a - bm) ) mod N
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Вычисление алгебраического корня gamma (методом Монтгомери и др.)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Нахождение элемент gamma в огромном алгебраическом поле O_K и его отображение в реальный мир гомоморфизмом phi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Y = phi(gamma) mod N
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">Y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Предполагается, что в Фазах 2 и 4 были добавлены столбцы квадратичных характеров (Quadratic Characters)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// во избежание препятствий группы классов идеалов и группы единиц.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; Гомоморфизм phi применен.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Фаза 5] Вычисление НОД(V - Y, N)...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">V&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// НОД(X-Y, N)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[УСПЕХ] Найден нетривиальный множитель: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; Другой множитель: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">N&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[НЕУДАЧА] Тривиальное решение. Пробуем следующую зависимость...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Основной конвейер выполнения
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; [SOTA GNFS] Движок General Number Field Sieve (Boost C++) &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Гигантское составное число N (например, RSA-270)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;233108530344407544527637656910680524145619812480305449042948611968495918245135782867888369318577116418213919268572658314913060672626911354027609793166341626693946596196427744273886601876896313468704059066746903123910748277606548649151920812699309766587514735456594993207&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Степень полинома (для &amp;gt; 130 цифр обычно выбирают 5-6)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">degree&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Инициализация конвейера
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span> &lt;span class="n">poly_select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">degree&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LatticeSieve&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10000000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20000000&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Реальные границы составляют миллионы
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Filter&lt;/span> &lt;span class="n">filter&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LinearAlgebraGF2&lt;/span> &lt;span class="n">linalg&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AlgebraicSquareRoot&lt;/span> &lt;span class="n">sqrt_step&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">start_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">high_resolution_clock&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Выбор полинома
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">poly_select&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Просеивание (sieve)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">generate_factor_bases&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">relations&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">poly_select&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 3. Фильтрация (сжатие матрицы)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">filter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 4. Линейная алгебра (Поиск нуль-пространства над GF(2))
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">dependencies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">linalg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 5. Вычисление алгебраического квадратного корня и НОД
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="k">auto&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="nl">dep&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sqrt_step&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dep&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">end_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">high_resolution_clock&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">duration&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">double&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">elapsed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">end_time&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start_time&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">[Система] Конвейер SOTA GNFS завершен за &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">elapsed&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; секунд.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Итак, как этот код разрушает криптографические стены? Давайте разберем тщательный алгоритм и высшую математику каждой из 5 фаз.&lt;/p>
&lt;hr>
&lt;h2 id="2-конечная-цель-gnfs-x2-equiv-y2-pmod-n">2. Конечная цель GNFS: $X^2 \equiv Y^2 \pmod N$
&lt;/h2>&lt;p>Как и в случае GNFS, большинство современных алгоритмов факторизации гигантских чисел стремятся найти нетривиальную пару $(X, Y)$, удовлетворяющую следующему сравнению:&lt;/p>
$$X^2 \equiv Y^2 \pmod N$$
&lt;p>Это означает, что «остаток от деления $X^2$ и $Y^2$ на $N$ одинаков». Преобразовав это, получим:
$X^2 - Y^2 \equiv 0 \pmod N$
Другими словами, $(X-Y)(X+Y)$ кратно $N$.&lt;/p>
&lt;p>Если $X \not\equiv \pm Y \pmod N$ (нетривиальное решение), это означает, что между $(X-Y)$ и $N$ есть «общий делитель больше 1 и меньше $N$».
Если мы воспользуемся алгоритмом Евклида для вычисления ** $\gcd(X-Y, N)$ **, то легко найдем простой множитель $N$.&lt;/p>
&lt;p>Однако поиск этих $X$ и $Y$ сродни поиску иголки в пустыне. Поэтому GNFS применяет гениальный подход: создает ** два мира ** — «мир реальных целых чисел» и «мир алгебраических числовых полей полиномов» — для распределения вычислений.&lt;/p>
&lt;hr>
&lt;h2 id="3-фаза-1-выбор-полинома-polynomial-selection">3. Фаза 1: Выбор полинома (Polynomial Selection)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">PolynomialSelector&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// вычисление m = N^(1/d) и m-расширение
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Первый шаг GNFS — создание «магического полинома», связывающего оба мира.
Для гигантского числа $N$ выбираем целое $m$. Обычно так, чтобы $m \approx N^{1/d}$ (в коде предполагается полином степени $d=6$).&lt;/p>
&lt;p>Затем мы разлагаем $N$ по основанию $m$ и используем его коэффициенты для построения полинома $f(x)$:
&lt;/p>
$$N = c_d m^d + c_{d-1} m^{d-1} + \dots + c_1 m + c_0$$
$$f(x) = c_d x^d + c_{d-1} x^{d-1} + \dots + c_1 x + c_0$$
&lt;p>Этот полином $f(x)$ обладает крайне важным свойством: ** «если подставить $m$ в переменную $x$, получится ровно $N$ ($f(m) = N$)» **. То есть $f(m) \equiv 0 \pmod N$.
Рациональный полином определяется как $g(x) = x - m$.&lt;/p>
&lt;p>В результате ** «мир алгебраического поля $\mathbb{Z}[\alpha]$» **, управляемый корнем $\alpha$ из $f(x)=0$, и обычный ** «мир рациональных чисел (целых) $\mathbb{Z}$» ** прочно связываются «гомоморфизмом колец» $x \to m$.&lt;/p>
&lt;p>В современных CADO-NFS и других реализациях используются алгоритмы КлейнЮнга и алгоритм LLL-редукции базиса решетки для поиска «самого удобного полинома $f(x)$», при котором коэффициенты не становятся чрезмерно большими, а простые числа легче появляются на следующих этапах. Этот поиск может занимать месяцы.&lt;/p>
&lt;hr>
&lt;h2 id="4-фаза-2-решето-на-специальной-q-решетке-special-q-lattice-sieving">4. Фаза 2: Решето на специальной q-решетке (Special-q Lattice Sieving)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LatticeSieve&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">poly&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Пары (a, b) проецируются на решетку для каждого особого простого q,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// и выполняется просеивание, максимизирующее эффективность кэширования.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Подготовив оба мира, мы переходим к поиску «гладких чисел (состоящих только из маленьких простых множителей)» в обоих мирах.
Генерируются бесчисленные пары целых чисел $(a, b)$ и вычисляются два значения:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Рациональное значение&lt;/strong> : $a - bm$&lt;/li>
&lt;li>&lt;strong>Алгебраическая норма&lt;/strong> : $b^d f(a/b)$&lt;/li>
&lt;/ol>
&lt;p>Цель GNFS состоит в том, чтобы собрать от десятков до сотен миллионов ** «пар (отношений), в которых и рациональное, и алгебраическое значения могут быть полностью факторизованы только малыми простыми множителями» **.&lt;/p>
&lt;p>В раннем GNFS использовалось «Линейное решето (Line Sieve)», где $(a, b)$ располагались на плоскости $xy$ и делились на простые числа. Но это было крайне медленно из-за промахов кэша при частом обращении к памяти.&lt;/p>
&lt;p>Поэтому современные коды используют метод, называемый ** &amp;ldquo;Special-q Lattice Sieve&amp;rdquo; **.
Фиксируется достаточно большое простое число $q$, и вычисляются только пары $(a, b)$, где «алгебраическое значение гарантированно делится на $q$». Пары, удовлетворяющие этому условию, образуют «решетку (Lattice)» на плоскости, делая скачки адресов в памяти постоянными, что идеально вписывается в кэш L1/L2 процессора.
Введение решета на решетках резко повысило скорость вычислений GNFS.&lt;/p>
&lt;hr>
&lt;h2 id="5-фаза-3-фильтрация-filtering">5. Фаза 3: Фильтрация (Filtering)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Filter&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Удаление синглтонов (удаление отношений с простыми числами, появляющимися только 1 раз)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 2. Слияние клик (объединение отношений для уплотнения разреженной матрицы)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Сотни миллионов отношений, собранных компьютерами по всему миру за несколько месяцев на Фазе 2. Однако, если их сразу передать на следующий этап «вычисления матрицы», память суперкомпьютера переполнится.&lt;/p>
&lt;p>Следовательно, происходит экстремальный процесс сжатия матрицы, называемый ** Фильтрацией (Filtering) **.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Удаление синглтонов (Singleton removal)&lt;/strong>
Предположим, гигантское простое число $p$ встречается только «1 раз» во всех миллионах отношений. Наша цель — «сделать показатели всех простых чисел четными (кратными 2)», так что простое число, появляющееся лишь однажды, не может стать четным.
Поэтому отношения, содержащие такое простое число, немедленно удаляются как «бесполезный мусор». Это вызывает цепную реакцию, убирая миллионы строк данных.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Слияние клик (Clique merging)&lt;/strong>
Далее, путем сложения отношений, разделяющих определенные простые числа, разреженная матрица сжимается и становится более плотной (используя метод, подобный поиску клик в теории графов).&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Благодаря этой оптимизации, гигантская разреженная матрица радикально сжимается до вычислимых размеров.&lt;/p>
&lt;hr>
&lt;h2 id="6-фаза-4-линейная-алгебра-над-gf2-метод-блока-видемана">6. Фаза 4: Линейная алгебра над GF(2) (метод Блока Видемана)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearAlgebraGF2&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Итеративное вычисление произведения разреженной матрицы и вектора,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// поиск решений (ядер), где M * x = 0 mod 2.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Теперь мы подходим к сути головоломки.
Мы объединяем собранные отношения для поиска ** «комбинаций, в которых степени всех простых множителей становятся четными» **.&lt;/p>
&lt;p>Математически, используя гигантскую матрицу $M$, элементы которой представляют собой «четность или нечетность (т.е. 0 или 1)» степени каждого простого числа, и вектор $x$, показывающий, какие отношения используются, мы решаем уравнение (поиск нуль-пространства):
&lt;strong>$M \cdot x \equiv 0 \pmod 2$&lt;/strong>&lt;/p>
&lt;p>Нам нужно решить систему уравнений матрицы размером миллионы на миллионы строк и столбцов. При обычном методе Гаусса сложность составляет $O(N^3)$, и вычисления не закончатся до конца Вселенной.&lt;/p>
&lt;p>Поэтому современные реализации применяют ** «Метод Блока Видемана (Block Wiedemann)» **.
Это вид метода подпространства Крылова, который находит решение путем итеративного умножения матрицы на вектор, эксплуатируя то, что матрица $M$ «очень разреженная (почти все 0)».
В отличие от старого метода Block Lanczos, метод Block Wiedemann полностью разделяет вычислительный процесс на кластеры, демонстрируя огромную мощь в современных распределенных облачных вычислениях и на суперкомпьютерах.&lt;/p>
&lt;hr>
&lt;h2 id="7-фаза-5-алгебраический-квадратный-корень-algebraic-square-root-и-крушение-криптографии">7. Фаза 5: Алгебраический квадратный корень (Algebraic Square Root) и крушение криптографии
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">AlgebraicSquareRoot&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(...)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Вычисление рационального квадратного корня V
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">V&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Вычисление алгебраического корня gamma
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">Y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">V&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// GCD(X-Y, N)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Через вычисления матрицы на Фазе 4 мы получили набор отношений $S$, которые «при перемножении дают четные степени для всех простых множителей».
Это позволяет нам создать «квадрат» в обоих мирах — рациональном и алгебраическом.&lt;/p>
&lt;p>Поскольку рациональная сторона — это просто умножение целых чисел, вычислить квадратный корень $V$ легко.
&lt;/p>
$$V^2 = \prod_{S} (a - bm)$$
&lt;p>&lt;strong>Но настоящий ад ждет на «алгебраической стороне».&lt;/strong>
В мире алгебраических полей $\mathbb{Z}[\alpha]$ уникальность факторизации на простые не сохраняется, поэтому мы вычисляли, используя идеалы. Расчеты матрицы гарантировали лишь ** «создание квадрата идеала», но не «гарантировали, что это квадрат элемента ($\gamma^2$)» **.&lt;/p>
&lt;p>Здесь возникают грозные барьеры алгебраической теории чисел — «препятствие группы классов идеалов» и «препятствие группы единиц».
Чтобы преодолеть эту стену, GNFS использует магию ** «Квадратичных характеров (Quadratic Characters)» **.
В матрицу Фазы 4 заранее добавляются несколько десятков специальных столбцов квадратичных вычетов (символов Лежандра) для особых простых идеалов. В результате найденный набор $S$ с ошеломляющей вероятностью обходит все препятствия и благополучно формирует «истинный квадрат элемента $\gamma^2$».&lt;/p>
&lt;p>Процесс нахождения $\gamma$ (Алгебраический квадратный корень) выполняется с помощью невероятно сложного алгоритма, такого как метод Монтгомери.&lt;/p>
&lt;p>И, наконец, алгебраический корень $\gamma$ переносится в реальный мир с помощью гомоморфизма колец $\phi$ (подстановка $m$ вместо $x$), образуя $Y$.
Установив $V$ с рациональной стороны как $X$, мы получаем абсолютное уравнение, к которому стремились:&lt;/p>
&lt;p>&lt;strong>$$X^2 \equiv Y^2 \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Остается только вычислить $\gcd(X-Y, N)$. За долю секунды 0,001 с нетривиальный множитель выводится на экран, и гордая, неприступная криптография RSA полностью рушится.&lt;/p>
&lt;hr>
&lt;h2 id="заключение">Заключение
&lt;/h2>&lt;p>GNFS — это не просто метод программирования.
Это шедевр человеческого интеллекта, который покорил «глубины чистой математики», такие как абстрактная алгебра, теория колец и группы классов идеалов, с помощью «экстремальной инженерии» — распределенной архитектуры суперкомпьютеров и кэш-оптимизации.&lt;/p>
&lt;p>Наши повседневные сообщения в чатах или данные кредитных карт защищены именно этими колоссальными математическими битвами.&lt;/p>
&lt;p>Мы надеемся, что этот фреймворк на C++ позволил вам почувствовать «романтику математики и компьютеров», стоящую за передовыми алгоритмами криптоанализа.&lt;/p></description></item><item><title>Истинная математическая структура общего метода решета числового поля (GNFS)</title><link>http://kenji.blog/ru/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</link><pubDate>Sat, 05 Sep 2026 02:26:13 +0900</pubDate><guid>http://kenji.blog/ru/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</guid><description>&lt;img src="http://kenji.blog/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/rsa_encryption_break_1788542156523.jpg" alt="Featured image of post Истинная математическая структура общего метода решета числового поля (GNFS)" />&lt;h1 id="истинная-математическая-структура-общего-метода-решета-числового-поля-gnfs">Истинная математическая структура общего метода решета числового поля (GNFS)
&lt;/h1>&lt;p>Конечная цель GNFS — найти $X, Y$ такие, что $X^2 \equiv Y^2 \pmod N$.
Для достижения этого математики построили мост между &lt;strong>&amp;ldquo;миром реальных целых чисел&amp;rdquo;&lt;/strong> и &lt;strong>&amp;ldquo;миром алгебраических полей&amp;rdquo;&lt;/strong>. Этим мостом является «гомоморфизм».&lt;/p>
&lt;h2 id="этап-1-гомоморфизм-homomorphism-соединяющий-миры">Этап 1: «Гомоморфизм» (Homomorphism), соединяющий миры
&lt;/h2>&lt;h3 id="1-выбор-многочлена-и-определение-корня">1. Выбор многочлена и определение корня
&lt;/h3>&lt;p>Для гигантского составного числа $N$ мы выбираем некоторое целое число $m$ и многочлен $f(x)$ так, чтобы $f(m) \equiv 0 \pmod N$.
(Пример: Разложите $N$ по основанию $m$ и постройте $f(x)$ из его коэффициентов. При этом предполагается, что $f(x)$ неприводим над полем рациональных чисел $\mathbb{Q}$).&lt;/p>
&lt;p>Далее, пусть $\alpha$ — один из «комплексных корней» уравнения $f(x) = 0$.
Естественно, $f(\alpha) = 0$. $\alpha$ — это не целое число, а сложное число (алгебраическое число), которое может содержать корни или мнимые единицы.&lt;/p>
&lt;h3 id="2-построение-кольца-ring-и-гомоморфизма">2. Построение кольца (Ring) и гомоморфизма
&lt;/h3>&lt;p>Здесь мы подготавливаем два математических «кольца» (миры, где определены сложение и умножение):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Мир A: $\mathbb{Z}[\alpha]$&lt;/strong> (Кольцо алгебраических целых чисел, содержащее $\alpha$)
Это мир чисел, выраженных в виде $a + b\alpha + c\alpha^2 + \dots$.&lt;/li>
&lt;li>&lt;strong>Мир B: $\mathbb{Z}/N\mathbb{Z}$&lt;/strong> (Кольцо вычетов по модулю $N$)
Мир сравнений (по модулю), состоящий только из целых чисел от $0$ до $N-1$.&lt;/li>
&lt;/ul>
&lt;p>Здесь мы определяем отображение (mapping) $\phi$ из Мира A в Мир B следующим образом:
&lt;strong>$$\phi : \mathbb{Z}[\alpha] \to \mathbb{Z}/N\mathbb{Z}$$&lt;/strong>
&lt;strong>$$\phi(\alpha) = m \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Это отображение $\phi$ — магическая операция, которая полностью заменяет переменную $\alpha$ в Мире A на целое число $m$ в Мире B.
Это $\phi$ обладает чрезвычайно мощным свойством, называемым &lt;strong>&amp;ldquo;Гомоморфизм колец&amp;rdquo; (Ring Homomorphism)&lt;/strong>.
Гомоморфизм — это свойство &lt;strong>&amp;ldquo;перехода в другой мир без разрушения структуры сложения и умножения&amp;rdquo;&lt;/strong>. То есть выполняются следующие уравнения:&lt;/p>
&lt;ul>
&lt;li>$\phi(X \times Y) = \phi(X) \times \phi(Y)$&lt;/li>
&lt;li>$\phi(X^2) = \phi(X)^2$&lt;/li>
&lt;/ul>
&lt;p>Что все это значит? Если мы сможем создать &lt;strong>&amp;ldquo;полный квадрат&amp;rdquo; ($\gamma^2$)&lt;/strong> из сложного элемента $\gamma$ в &amp;ldquo;Мире A&amp;rdquo; (мире $\alpha$), мы сможем прыгнуть в &amp;ldquo;Мир B&amp;rdquo; (мир остатков) с помощью $\phi$, и &lt;strong>форма квадрата $\phi(\gamma)^2$ будет идеально сохранена&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="этап-2-крах-разложения-на-простые-множители-и-рождение-идеала-ideal">Этап 2: Крах разложения на простые множители и рождение «Идеала» (Ideal)
&lt;/h2>&lt;p>Мы хотим собрать множество подходящих элементов $(a - b\alpha)$ в Мире A ($\mathbb{Z}[\alpha]$) и перемножить их, чтобы получить «полный квадрат» (квадратичный элемент).
Обычно мы могли бы разложить собранные $(a - b\alpha)$ на «простые множители» и объединить их так, чтобы все показатели степеней простых чисел стали четными (решается с помощью матриц), создавая таким образом квадрат.&lt;/p>
&lt;p>&lt;strong>Однако здесь на пути встает стена алгебраического отчаяния.&lt;/strong>
В мире алгебраических полей, таких как $\mathbb{Z}[\alpha]$, &lt;strong>&amp;ldquo;уникальность разложения на простые множители (каждое число может быть представлено как произведение простых чисел только одним способом)&amp;rdquo;&lt;/strong>, которую мы изучали в средней школе, &lt;strong>полностью рушится&lt;/strong>.&lt;/p>
&lt;p>(Пример: В некоторых мирах алгебраических полей $6 = 2 \times 3$, и в то же время $6 = (1+\sqrt{-5}) \times (1-\sqrt{-5})$, что делает невозможным узнать, какие из них являются истинными простыми числами).&lt;/p>
&lt;p>Если разложение на простые множители не уникально, то головоломка &amp;ldquo;подсчета простых чисел до тех пор, пока их не станет четное количество&amp;rdquo; (метод решета) принципиально невыполнима.&lt;/p>
&lt;h3 id="спасение-куммера-и-дедекинда-идеал">Спасение Куммера и Дедекинда: «Идеал»
&lt;/h3>&lt;p>Этот крах был спасен концепцией &lt;strong>&amp;ldquo;Идеала&amp;rdquo; (Ideal: Идеальное число)&lt;/strong>, созданной математиками 19 века.
Вместо того чтобы рассматривать сам элемент, рассматривая &amp;ldquo;множество кратных (идеал)&amp;rdquo;, порожденное этим элементом, разложение на простые множители снова стало возможным.&lt;/p>
&lt;p>В кольце целых чисел алгебраического поля $\mathcal{O}_K$ (более совершенном кольце, включающем $\mathbb{Z}[\alpha]$), даже если элементы не могут быть однозначно разложены на множители, доказано, что &lt;strong>&amp;ldquo;Идеал всегда может быть однозначно разложен на простые множители как произведение &amp;lsquo;простых идеалов&amp;rsquo; ($\mathfrak{p}$)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Поэтому в GNFS вместо разложения самого элемента $(a - b\alpha)$ мы выполняем &lt;strong>разложение на простые идеалы главного идеала $\langle a - b\alpha \rangle$&lt;/strong>, который он порождает.&lt;/p>
&lt;hr>
&lt;h2 id="этап-3-норма-norm-и-два-решета-sieve">Этап 3: Норма (Norm) и два решета (Sieve)
&lt;/h2>&lt;p>Тогда как нам узнать, на какие простые идеалы распадается идеал $\langle a - b\alpha \rangle$?
Здесь мы используем функцию, называемую &lt;strong>&amp;ldquo;Норма&amp;rdquo; (Norm)&lt;/strong>. Норма — это функция, которая преобразует сложные элементы алгебраического поля в &amp;ldquo;обычные целые числа $\mathbb{Z}$&amp;rdquo; реального мира.&lt;/p>
&lt;p>Норма элемента $(a - b\alpha)$ вычисляется с помощью простого многочлена $b^d f(a/b)$ (где $d$ — степень $f(x)$).&lt;/p>
&lt;p>Благодаря алгебраической теореме известно, что &lt;strong>&amp;ldquo;если норма идеала может быть полностью разложена на небольшие простые числа (является гладкой), то исходный идеал также может быть полностью разложен на небольшие простые идеалы&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Поэтому GNFS одновременно вычисляет следующие две вещи для огромного количества пар целых чисел $(a, b)$ и собирает только те пары, где обе являются &amp;ldquo;гладкими числами&amp;rdquo;:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Рациональное решето (Rational Sieve)&lt;/strong>: $a - bm$ (значение в реальном мире)&lt;/li>
&lt;li>&lt;strong>Алгебраическое решето (Algebraic Sieve)&lt;/strong>: $b^d f(a/b)$ (норма в мире алгебраического поля)&lt;/li>
&lt;/ol>
&lt;p>Мы собираем десятки миллионов пар $(a, b)$, обе из которых гладкие, решаем данные о разложении идеалов на простые множители (сколько простых идеалов присутствует) в виде гигантской матрицы (линейная алгебра над GF(2)) и находим множество $S$ пар таких, что &amp;ldquo;при перемножении показатели всех простых идеалов становятся четными&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="этап-4-два-препятствия-и-группа-классов-идеалов">Этап 4: Два «Препятствия» и группа классов идеалов
&lt;/h2>&lt;p>С помощью матричных вычислений мы обнаружили, что умножение всех идеалов $(a - b\alpha)$ во множестве $S$ дает квадрат некоторого идеала $I$.
&lt;/p>
$$\prod_{S} \langle a - b\alpha \rangle = I^2$$
&lt;p>&lt;strong>Но это еще не конец. Самая глубокая и трудная математическая стена в GNFS находится здесь.&lt;/strong>&lt;/p>
&lt;p>В конечном итоге нам нужен не &amp;ldquo;квадрат идеала&amp;rdquo;, а &lt;strong>&amp;ldquo;квадрат элемента&amp;rdquo; ($\gamma^2$)&lt;/strong> для подстановки в отображение $\phi$.
Только потому, что идеал возведен в квадрат, не означает, что сам элемент возведен в квадрат. Здесь существуют &lt;strong>два невероятно сильных математических препятствия (Obstructions)&lt;/strong>.&lt;/p>
&lt;h3 id="препятствие-1-стена-группы-классов-идеалов-ideal-class-group">Препятствие 1: Стена группы классов идеалов (Ideal Class Group)
&lt;/h3>&lt;p>Идеал $I$ не всегда является &amp;ldquo;идеалом, порожденным одним элементом (главным идеалом)&amp;rdquo;.
Невозможно извлечь конкретный элемент $\gamma$ из идеала, который не является главным.&lt;/p>
&lt;p>Здесь появляется концепция &lt;strong>&amp;ldquo;Группы классов идеалов (Class Group, $Cl_K$)&amp;rdquo;&lt;/strong>. Группа классов идеалов — это группа, которая измеряет, &amp;ldquo;сколько неглавных идеалов существует в мире алгебраического поля (насколько разрушена уникальность разложения на простые множители)&amp;rdquo;.
Даже если $\prod \langle a - b\alpha \rangle$ становится $I^2$, если $I$ не является единичным элементом (главным идеалом) в группе классов идеалов, мы не можем вернуть его к квадрату элемента.&lt;/p>
&lt;h3 id="препятствие-2-стена-группы-единиц-unit-group">Препятствие 2: Стена группы единиц (Unit Group)
&lt;/h3>&lt;p>Допустим, нам повезло, и $I$ является главным идеалом $\langle \gamma \rangle$.
Тогда $\prod \langle a - b\alpha \rangle = \langle \gamma^2 \rangle$.
Вы можете подумать: &amp;ldquo;Отлично, элемент тоже в квадрате!&amp;rdquo;, но вы глубоко ошибаетесь.&lt;/p>
&lt;p>Тот факт, что идеалы (множества кратных) равны, не означает, что элементы полностью равны. Всегда будет сдвиг на &lt;strong>&amp;ldquo;Единицу&amp;rdquo; (Unit: число, обратное которому также является целым, например 1 или -1)&lt;/strong>.
Другими словами, фактическое равенство элементов выглядит следующим образом:
&lt;/p>
$$\prod_{S} (a - b\alpha) = u \cdot \gamma^2$$
&lt;p>
(где $u$ — элемент группы единиц $U_K$)&lt;/p>
&lt;p>Если только эта единица $u$ сама не является квадратом чего-либо (квадратичным элементом), левая часть никогда не сможет стать &amp;ldquo;идеальным квадратом элемента&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="этап-5-магия-адлемана-квадратичные-характеры-quadratic-characters">Этап 5: Магия Адлемана «Квадратичные характеры» (Quadratic Characters)
&lt;/h2>&lt;p>Препятствие группы классов идеалов и препятствие группы единиц. Как нам их преодолеть?
Здесь появляется гениальный метод, называемый &lt;strong>&amp;ldquo;Квадратичными характерами&amp;rdquo; (Quadratic Characters)&lt;/strong>, введенный криптографом Леонардом Адлеманом (буква &amp;ldquo;A&amp;rdquo; в RSA) и его коллегами.&lt;/p>
&lt;p>Чтобы определить, &amp;ldquo;является ли элемент полным квадратом в алгебраическом поле&amp;rdquo;, мы используем версию символа Лежандра (квадратичного вычета) для алгебраических полей.
В гигантскую матрицу (головоломку для того, чтобы сделать количество простых идеалов четным) мы тайно добавляем несколько десятков дополнительных условий (столбцов), утверждающих, что &lt;strong>&amp;ldquo;квадратичные характеры для некоторых особых простых идеалов $\mathfrak{q}$ также все становятся равными $1$ (четными)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Когда мы находим множество $S$, удовлетворяющее этим дополнительным условиям с помощью матричных вычислений, глубокая теорема алгебраической теории чисел гарантирует, что &lt;strong>&amp;ldquo;как препятствие группы классов идеалов, так и препятствие группы единиц исчезнут естественным образом с подавляющей вероятностью&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Благодаря этому мы наконец получаем истинное уравнение:
&lt;/p>
$$\prod_{S} (a - b\alpha) = \gamma^2$$
&lt;hr>
&lt;h2 id="финальный-этап-слияние-миров-и-взлом-криптографии">Финальный этап: Слияние миров и взлом криптографии
&lt;/h2>&lt;p>Наконец, все кусочки головоломки на месте.&lt;/p>
&lt;p>&lt;strong>[Элемент в мире алгебраического поля (Мир A)]&lt;/strong>
$\gamma^2 = \prod (a - b\alpha)$
(Используйте алгоритм извлечения квадратного корня, чтобы найти $\gamma$)&lt;/p>
&lt;p>&lt;strong>[Элемент в реальном мире (мир рациональных чисел)]&lt;/strong>
$V^2 = \prod (a - bm)$
(Это просто обычное умножение целых чисел, поэтому квадратный корень $V$ можно найти легко)&lt;/p>
&lt;p>Теперь настало время для работы первого магического моста, который мы создали, &lt;strong>гомоморфизма $\phi$&lt;/strong>.
Мы переносим элемент $\gamma$ из Мира A в Мир B (мир остатков $N$) с помощью $\phi$ (отображения, которое подставляет $m$ вместо $\alpha$).
&lt;/p>
$$Y = \phi(\gamma) \pmod N$$
&lt;p>С другой стороны, мы берем $V$, созданный в реальном мире, прямо в мир остатков и называем его $X$.
&lt;/p>
$$X = V \pmod N$$
&lt;p>Благодаря свойству гомоморфизма &amp;ldquo;сохранять структуру&amp;rdquo;, квадратичное отношение, которое было истинным в Мире A, идеально сохраняется в Мире B (мире по модулю $N$).
Более того, поскольку исходные пары $(a, b)$ были сформированы так, чтобы соответствовать как $a - b\alpha$ и $a - bm$, эти $X$ и $Y$ сталкиваются в мире по модулю $N$ и порождают следующее абсолютное уравнение:&lt;/p>
&lt;p>&lt;strong>$$X^2 \equiv Y^2 \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Теперь остается только молиться, чтобы $X$ и $Y$ не были тривиальными решениями ($X \equiv \pm Y$), а затем мы вычисляем:
&lt;strong>$\gcd(X - Y, N)$&lt;/strong>&lt;/p>
&lt;p>Если это нетривиальное решение, алгоритм Евклида пронесется за 0,001 секунды, и секретные простые числа $p$ и $q$, которые являются сердцем криптографии RSA, будут выведены на экран.&lt;/p>
&lt;hr>
&lt;p>Это и есть полная картина &lt;strong>&amp;ldquo;Общего метода решета числового поля (GNFS)&amp;rdquo;&lt;/strong>, который объединяет в себе суть современной математики.&lt;/p></description></item><item><title>Что такое Общий метод решета числового поля (GNFS) — сильнейшая математика человечества, взламывающая криптографию интернета?</title><link>http://kenji.blog/ru/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</link><pubDate>Sat, 05 Sep 2026 02:09:08 +0900</pubDate><guid>http://kenji.blog/ru/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485.jpg" alt="Featured image of post Что такое Общий метод решета числового поля (GNFS) — сильнейшая математика человечества, взламывающая криптографию интернета?" />&lt;h1 id="что-такое-общий-метод-решета-числового-поля-gnfs--сильнейшая-математика-человечества-взламывающая-криптографию-интернета">Что такое Общий метод решета числового поля (GNFS) — сильнейшая математика человечества, взламывающая криптографию интернета?
&lt;/h1>&lt;p>Интернет, которым мы пользуемся каждый день. Все наши коммуникации, будь то сообщения в LINE, видео на YouTube или покупки на Amazon, защищены «криптографией».
В настоящее время самым распространенным алгоритмом шифрования в мире является «шифр RSA».&lt;/p>
&lt;p>Суть защиты RSA очень проста. Она использует математическое свойство, заключающееся в том, что &lt;strong>«даже компьютеры не могут решить задачу факторизации гигантских чисел на простые множители»&lt;/strong> .
Например, для числа «15» сразу понятно, что это «3 × 5». Но как только число становится «270-значным», даже если объединить все суперкомпьютеры мира, на его решение уйдут сотни миллионов лет.&lt;/p>
&lt;p>Однако математики тоже не сидят сложа руки. Чтобы взломать этот неприступный шифр, человечество создало магический алгоритм (вычислительную процедуру) под названием &lt;strong>«Общий метод решета числового поля (GNFS — General Number Field Sieve)»&lt;/strong> .&lt;/p>
&lt;p>В этой статье мы не будем использовать сложные технические термины, а опираясь только на знания &lt;strong>математики средней школы (разложение на простые множители, алгебраические выражения, наибольший общий делитель)&lt;/strong> , полностью шаг за шагом объясним, как этот «сильнейший алгоритм человечества» взламывает шифры!&lt;/p>
&lt;hr>
&lt;h2 id="глава-1-цель-взлома--формула-из-средней-школы">Глава 1: Цель взлома — «формула из средней школы»
&lt;/h2>&lt;p>Главный прием против факторизации гигантских чисел. Это формула, которую изучают в средних классах.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>$X^2 - Y^2 = (X + Y)(X - Y)$&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Вы можете подумать: «Э-э, неужели такая базовая формула может взломать шифр?». Однако это и есть тот самый главный ключ, который все открывает.&lt;/p>
&lt;p>Главная цель при взломе шифра — найти для огромного числа $N$ &lt;strong>«такие числа ($X$ и $Y$), что остатки от деления $X^2$ и $Y^2$ на $N$ будут одинаковыми»&lt;/strong> .&lt;/p>
&lt;h3 id="почему-одинаковые-остатки-могут-взломать-шифр">Почему «одинаковые остатки» могут взломать шифр?
&lt;/h3>&lt;p>Предположим, у двух чисел $X^2$ и $Y^2$ «остатки от деления на $N$ одинаковые».
Одинаковые остатки означают, что при вычитании &lt;strong>«$X^2 - Y^2$» результат обязательно будет без остатка делиться на $N$ (станет кратным $N$)&lt;/strong> .&lt;/p>
&lt;p>Здесь давайте представим, что огромное число $N$, используемое в шифре, образовано умножением двух секретных простых чисел ($p$ и $q$) ($N = p \times q$).&lt;/p>
&lt;p>Если разложить на множители $X^2 - Y^2$, то получится &lt;strong>$(X - Y)(X + Y)$&lt;/strong> .
То, что это число кратно $N$, означает, что где-то в этом умножении спрятаны секретные простые числа $p$ и $q$.&lt;/p>
&lt;p>И тут происходит чудо.
Математическая вероятность того, что два простых числа $p$ и $q$ разойдутся по разным «комнатам» — &lt;strong>«$p$ в комнату $(X - Y)$», а «$q$ в комнату $(X + Y)$»&lt;/strong> — составляет ровно &lt;strong>50% (одна вторая)&lt;/strong> .&lt;/p>
&lt;p>Предположим, что только простое число $p$ попало в комнату $(X - Y)$. Давайте вычислим &lt;strong>«наибольший общий делитель (самый большой общий компонент)»&lt;/strong> между $(X - Y)$ и $N$.&lt;/p>
&lt;ul>
&lt;li>Содержимое $(X - Y)$ = $p \times$ какое-то число&lt;/li>
&lt;li>Содержимое $N$ = $p \times q$
Единственный общий компонент здесь — это &lt;strong>«$p$»&lt;/strong> !&lt;/li>
&lt;/ul>
&lt;p>Другими словами, в момент вычисления наибольшего общего делителя скрытое простое число $p$ внезапно выпадает, и шифр оказывается полностью взломанным. (&lt;em>Наибольший общий делитель можно моментально вычислить даже на смартфоне с помощью «Алгоритма Евклида»&lt;/em>)&lt;/p>
&lt;p>&lt;strong>[Мини-колонка: Почему именно квадрат? Разве куб или удвоение не подойдут?]&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>Если взять «$2X - 2Y$», это превратится в $2(X - Y)$, и останется только одна комната, так что простые числа разделить не получится. Если взять «$X^3 - Y^3$», размеры комнат станут несбалансированными, и вычисления станут неоправданно тяжелыми. Для идеального разделения двух простых чисел «квадрат», образующий две красивые комнаты, является самым оптимальным вариантом.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="глава-2-как-найти-x-и-y-головоломка-по-сбору-карточек-с-простыми-числами">Глава 2: Как найти X и Y? «Головоломка по сбору карточек с простыми числами»
&lt;/h2>&lt;p>Цель ясна. Однако, если пытаться искать «$X^2$ и $Y^2$ с одинаковыми остатками» наугад, мы не найдем их до самого конца существования Вселенной.
Поэтому математики придумали гениальный метод под названием &lt;strong>«Головоломка по сбору карточек с простыми числами»&lt;/strong> .&lt;/p>
&lt;h3 id="шаг-1-просеивание-только-золотого-песка-гладких-чисел">Шаг 1: Просеивание только золотого песка (гладких чисел)
&lt;/h3>&lt;p>Сначала мы берем произвольное число $Z$, возводим его в квадрат и вычисляем остаток $W$ от деления на $N$.
(Мир остатков: $Z^2 = W$)&lt;/p>
&lt;p>Полученный остаток $W$ мы раскладываем на простые множители. Здесь, только когда получается &lt;strong>«$W$, состоящее исключительно из маленьких простых чисел, таких как 2, 3, 5, 7»&lt;/strong> , мы оставляем эту формулу как «выигрышную карточку». Если примешивается большое простое число — мы ее выбрасываем.
Это похоже на работу с ситом (решетом) в реке: мы отбрасываем большие камни и собираем только золотой песок.&lt;/p>
&lt;h3 id="шаг-2-головоломка-с-приведением-к-четному-числу">Шаг 2: Головоломка с приведением к «четному числу»
&lt;/h3>&lt;p>Предположим, мы собрали 3 таких карточки с золотым песком:&lt;/p>
&lt;ul>
&lt;li>Карточка A: $Z_1^2 = 2^3 \times 3^1$&lt;/li>
&lt;li>Карточка B: $Z_2^2 = 2^1 \times 5^1$&lt;/li>
&lt;li>Карточка C: $Z_3^2 = 3^1 \times 5^1$&lt;/li>
&lt;/ul>
&lt;p>Давайте перемножим их все.
Правая сторона станет $(2^3 \times 3^1) \times (2^1 \times 5^1) \times (3^1 \times 5^1)$,
а после упрощения получится &lt;strong>«$2^4 \times 3^2 \times 5^2$»&lt;/strong> .&lt;/p>
&lt;p>Поразительно, но количество простых чисел стало «4, 2, 2» — &lt;strong>все они стали четными&lt;/strong> !
То, что все они стали четными, означает, что если поделить их количество пополам, мы получим «квадрат чего-либо».
А именно: $(2^2 \times 3^1 \times 5^1)^2 = (60)^2$.&lt;/p>
&lt;p>Поскольку левая сторона равна $(Z_1 \times Z_2 \times Z_3)^2$, мы, наконец, получаем:
&lt;strong>$X = (Z_1 \times Z_2 \times Z_3)$&lt;/strong>
&lt;strong>$Y = 60$&lt;/strong>
Долгожданная пара «$X^2 = Y^2$» завершена!&lt;/p>
&lt;p>Для компьютеров головоломки с подсчетом того, «четное число или нечетное (0 или 1)», даются очень легко, поэтому с помощью этого метода можно очень быстро найти $X$ и $Y$.&lt;/p>
&lt;hr>
&lt;h2 id="глава-3-стена-отчаяния-на-пути">Глава 3: Стена отчаяния на пути
&lt;/h2>&lt;p>Казалось бы, теперь любой шифр можно взломать! &amp;hellip;Но тут возникает огромная проблема.
Если число шифра $N$ имеет длину до «100 цифр», этот метод (называемый методом квадратичного решета) справляется. Но когда $N$ становится «200-значным или 300-значным», промежуточное значение $W$ становится слишком гигантским.&lt;/p>
&lt;p>Когда числа становятся слишком огромными, «числа, состоящие только из маленьких простых чисел (золотой песок)», перестают появляться вообще. Найти их становится сложнее, чем контактную линзу в пустыне, и собрать карточки для решения головоломки становится абсолютно невозможно.&lt;/p>
&lt;p>И вот здесь наконец появляется совершенное оружие человечества — &lt;strong>«Общий метод решета числового поля (GNFS)»&lt;/strong> .&lt;/p>
&lt;hr>
&lt;h2 id="глава-4-гениальная-идея-человечества--создание-двух-миров">Глава 4: Гениальная идея человечества — создание «двух миров»
&lt;/h2>&lt;p>Гениальность идеи GNFS заключается в следующем: &lt;strong>«Раз числа становятся огромными потому, что мы считаем только в реальном мире, давайте создадим &amp;ldquo;параллельный мир&amp;rdquo; с помощью полиномов (алгебраических выражений) и разделим вычислительную нагрузку на две части»&lt;/strong> .&lt;/p>
&lt;h3 id="магия-алгебраических-выражений">Магия алгебраических выражений
&lt;/h3>&lt;p>GNFS преобразует огромное число $N$ в алгебраическое выражение, используя базовое число $m$.
Например, если $N=100$, мы выбираем $m=4$, тогда $100 = 4^3 + 2(4^2) + 4$.
Используя переменную $x$, мы превращаем это в выражение (параллельный мир): &lt;strong>$f(x) = x^3 + 2x^2 + x$&lt;/strong> .&lt;/p>
&lt;p>Самое интересное в этом выражении — его свойство: &lt;strong>«Если подставить вместо $x$ число $m$ (в данном примере 4), то можно в любой момент &amp;ldquo;телепортироваться&amp;rdquo; обратно к реальному числу $N$»&lt;/strong> .&lt;/p>
&lt;h3 id="поиск-золотого-песка-одновременно-в-двух-мирах">Поиск золотого песка одновременно в двух мирах
&lt;/h3>&lt;p>GNFS генерирует множество произвольных пар целых чисел $(a, b)$ и одновременно выполняет два вычисления:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Реальный мир&lt;/strong>: $a - b \times m$&lt;/li>
&lt;li>&lt;strong>Алгебраический мир&lt;/strong>: значение $a - b \times x$, вычисленное по правилам алгебраических выражений&lt;/li>
&lt;/ol>
&lt;p>Благодаря разделению задачи на два мира, размер используемых чисел радикально уменьшается (становится «легче»). Представьте себе, что гигантский валун разбили на два удобных камня.&lt;/p>
&lt;p>Затем с помощью сита (решета) отсеиваются и собираются только те чудесные пары $(a, b)$, в которых &lt;strong>«и в реальном мире, и в алгебраическом мире результаты состоят только из маленьких простых чисел (являются золотым песком)»&lt;/strong> . Отсюда и происходит название «метод решета числового поля».&lt;/p>
&lt;h3 id="момент-взлома-шифра">Момент взлома шифра
&lt;/h3>&lt;p>Когда из обоих миров собираются десятки миллионов «карточек с золотым песком», с помощью матричных вычислений на суперкомпьютерах находится «комбинация, при которой количество простых чисел становится полностью четным», точно так же, как во 2-й главе.&lt;/p>
&lt;p>Когда комбинация найдена:&lt;/p>
&lt;ul>
&lt;li>Число в квадрате, полученное в реальном мире, обозначается как &lt;strong>$X^2$&lt;/strong>&lt;/li>
&lt;li>Выражение в квадрате, полученное в алгебраическом мире, обозначается как &lt;strong>$Y(x)^2$&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>И наконец, мы подставляем $m$ вместо $x$ в $Y(x)$ алгебраического мира, телепортируя его и объединяя с реальным миром.
И тут, как по математическому волшебству, строго выполняется условие &lt;strong>«остатки $X^2$ и $Y^2$ одинаковы»&lt;/strong> !&lt;/p>
&lt;p>Дальше, как было описано в 1-й главе, достаточно вычислить наибольший общий делитель $X - Y$ и $N$, и неприступный шифр RSA с грохотом рассыпается, открывая секретные простые числа.&lt;/p>
&lt;hr>
&lt;h2 id="заключение-математика-не-заканчивается">Заключение: Математика не заканчивается
&lt;/h2>&lt;p>Возможно, вы подумали: «Отлично, с помощью GNFS можно взломать любой шифр!».
Однако шифр RSA не сдается. В современном интернете используется чудовищно огромное число под названием «RSA-2048 (около 617 цифр)».&lt;/p>
&lt;p>Каким бы сильным алгоритмом ни был GNFS, считается, что даже для взлома 270-значного числа (RSA-270) потребовались бы тысячи, а то и десятки тысяч лет, даже если бы объединили все компьютеры мира. На данный момент наши данные в LINE и банках в безопасности.&lt;/p>
&lt;p>Но что, если появится &lt;strong>«магия, способная мгновенно находить $X$ и $Y$ для любого сколь угодно гигантского числа»&lt;/strong> ?
На самом деле, самое близкое к этому — разрабатываемые сейчас &lt;strong>«квантовые компьютеры (Алгоритм Шора)»&lt;/strong> . Математически доказано, что, используя волновую природу квантовой механики, можно проигнорировать утомительную головоломку со сбором карточек и вытянуть правильный ответ за один раз.&lt;/p>
&lt;p>Бесконечная битва умов между создателями шифров (защитой) и создателями алгоритмов взлома (атакой).
Когда узнаешь, что «разложение на простые множители» и «алгебраические выражения», которые изучают в средней школе, на самом деле являются оружием, ожесточенно сражающимся на переднем крае глобальной безопасности, разве уроки математики не начинают казаться чуточку интереснее?&lt;/p>
&lt;p>Возможно, именно вы, читающий эту статью, в будущем откроете новый сильнейший алгоритм!&lt;/p>
&lt;hr>
&lt;p>&lt;em>(※Эта статья концептуализирует математическую привлекательность взлома шифров для школьников. Настоящий GNFS рассчитывается строго с использованием высшей университетской математики, такой как идеальные группы классов алгебраических числовых полей и гомоморфизмы)&lt;/em>&lt;/p></description></item><item><title>Простое объяснение гипотезы Кеплера</title><link>http://kenji.blog/ru/p/prosto-o-gipoteze-keplera/</link><pubDate>Mon, 21 Jul 2025 22:53:03 +0900</pubDate><guid>http://kenji.blog/ru/p/prosto-o-gipoteze-keplera/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B1%E3%83%97%E3%83%A9%E3%83%BC%E4%BA%88%E6%83%B3%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC/img.png" alt="Featured image of post Простое объяснение гипотезы Кеплера" />&lt;h1 id="простое-объяснение-гипотезы-кеплера-как-плотнее-всего-упаковать-арбузы">Простое объяснение гипотезы Кеплера! 〜Как плотнее всего упаковать арбузы〜
&lt;/h1>&lt;p>Всем привет, это kenji!&lt;/p>
&lt;p>Сегодня я хотел бы максимально просто рассказать о математической проблеме со сложным названием — «гипотеза Кеплера».&lt;/p>
&lt;p>На первый взгляд это может показаться очень специфической темой, но на самом деле это довольно практичная задача: «как плотнее всего упаковать арбузы в коробку?». Она также имеет отношение к холодильникам в магазинах и к тому, как складывать грузы.&lt;/p>
&lt;p>А в мире математики это супер-романтичная история о том, что &lt;strong>никто не мог доказать это на протяжении более 400 лет&lt;/strong> .&lt;/p>
&lt;p>Ну что, поехали!&lt;/p>
&lt;hr>
&lt;h2 id="кто-такой-кеплер">Кто такой Кеплер?
&lt;/h2>&lt;p>Для начала, кто такой «Кеплер» из «гипотезы Кеплера»?&lt;/p>
&lt;p>Это имя немецкого астронома и математика &lt;strong>Иоганна Кеплера (Johannes Kepler)&lt;/strong> .&lt;/p>
&lt;p>Этот человек был невероятно выдающимся.
Например, именно он открыл, что орбиты планет имеют форму эллипса. Сегодня это общеизвестный факт, но в то время (около 1600 года) даже гелиоцентрическая система не пользовалась особым доверием.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Галилей = гений наблюдений&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Кеплер = гений, описавший Вселенную формулами&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Ньютон = супергений, объединивший эти теории в законы физики&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>В таком контексте Кеплер был пионером в том, чтобы «описывать Вселенную с помощью математики».&lt;/p>
&lt;p>И вот однажды он заявил следующее.&lt;/p>
&lt;hr>
&lt;h2 id="что-такое-гипотеза-кеплера">Что такое гипотеза Кеплера?
&lt;/h2>&lt;p>Проще говоря, «гипотеза Кеплера» — это вот о чем.&lt;/p>
&lt;hr>
&lt;blockquote>
&lt;p>&lt;strong>Если мы упаковываем шары одинакового размера (например, арбузы или апельсины) в коробку, какой способ укладки позволит упаковать их плотнее всего?&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;p>Вот такая задача.&lt;/p>
&lt;p>И Кеплер в 1600-х годах предположил следующее:&lt;/p>
&lt;hr>
&lt;blockquote>
&lt;p>&lt;strong>Разве не эффективнее всего складывать их треугольником, как это делают с апельсинами на рынке?&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;p>Говоря математическим языком, это называется &lt;strong>«задача о плотнейшей упаковке»&lt;/strong> — поиск способа максимально плотно заполнить пространство шарами.&lt;/p>
&lt;p>Кеплер предположил, что наиболее эффективным способом является &lt;strong>«гранецентрированная кубическая решетка (ГЦК)»&lt;/strong> (примерно так же, как складывают арбузы треугольником).&lt;/p>
&lt;p>И хотя все думали: «Да, это звучит правдоподобно», математически доказать, что «это абсолютно лучший вариант!», оказалось невероятно сложно.&lt;/p>
&lt;hr>
&lt;h2 id="400-лет-до-доказательства">400 лет до доказательства!?!
&lt;/h2>&lt;p>Итак, когда же это было окончательно доказано?&lt;/p>
&lt;p>Удивительно, но это произошло примерно в &lt;strong>1998–2005 годах&lt;/strong> .
То есть &lt;strong>около 400 лет никто не мог этого доказать&lt;/strong> . Просто невероятно.&lt;/p>
&lt;p>Более того, доказал её американский математик &lt;strong>Томас Хейлс (Thomas Hales)&lt;/strong> .&lt;/p>
&lt;p>Поняв, что вручную это вычислить невозможно, он &lt;strong>использовал компьютер для доказательства&lt;/strong> .
Однако доказательство оказалось настолько сложным, что люди не смогли его нормально проверить! Это вызвало проблему.&lt;/p>
&lt;p>В математическом мире разгорелись бурные дебаты: «Можно ли доверять доказательству, выполненному на компьютере?».&lt;/p>
&lt;p>В итоге &lt;strong>в 2014 году&lt;/strong> было завершено «строгое доказательство, проверенное с учетом компьютера» (официально называемое «формальным доказательством»).&lt;/p>
&lt;p>Это означает, что понадобилось &lt;strong>более 400 лет&lt;/strong> , чтобы доказать правоту интуиции Кеплера. Настоящая романтика.&lt;/p>
&lt;hr>
&lt;h2 id="это-очень-часто-используется-в-реальной-жизни">Это очень часто используется в реальной жизни
&lt;/h2>&lt;p>Можно подумать, что вопрос о том, «как складывать шары», волнует только математиков-гиков, но на самом деле это суперпрактично.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Эффективная расстановка напитков в холодильниках супермаркетов&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Укладка консервных банок на транспортные поддоны&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Применение в телекоммуникациях (например, для сжатия цифровых сигналов)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Использование при проектировании для 3D-принтеров и кристаллических структур&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>И многое другое — на самом деле эта теория активно применяется за кулисами нашей повседневной жизни.&lt;/p>
&lt;hr>
&lt;h2 id="заключение-человеческая-интуиция-удивительна">Заключение: человеческая интуиция удивительна
&lt;/h2>&lt;p>Итак, подведем итоги.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Гипотеза Кеплера&lt;/strong> = задача о том, как наиболее плотно упаковать шары&lt;/li>
&lt;li>&lt;strong>Кеплер&lt;/strong> = математик и астроном, открывший орбиты планет&lt;/li>
&lt;li>&lt;strong>Гипотеза была выдвинута в 1600-х годах! А доказана только в 2000-х!&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Она имеет множество применений в реальной жизни!&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>И самое интересное здесь то, что
&lt;strong>«способ укладки, который продавцы на рынке использовали интуитивно, оказался математически лучшим»&lt;/strong> .&lt;/p>
&lt;p>Иными словами, &lt;strong>человеческая интуиция поразительна&lt;/strong> .
А тот факт, что &lt;strong>на её доказательство может уйти 400 лет&lt;/strong> , делает эту историю по-настоящему романтичной.&lt;/p>
&lt;hr>
&lt;p>Если вам это интересно, обязательно поищите информацию по запросам «Томас Хейлс», «формальное доказательство» и «Sphere Packing». Если копнуть глубже, это безумно интересно.&lt;/p>
&lt;p>До встречи!&lt;/p>
&lt;hr>
&lt;p>[PR]&lt;/p>
&lt;div style="background:#fff;width:120px;height:215px;box-sizing:border-box;border:1px solid #ccc;display:flex;flex-direction:column;justify-content:flex-start;align-items:center;">&lt;div style="line-height:0;">&lt;img src="https://static.jp.mercari.com/assets/img/common/jp/logo_horizontal.png" width="105">&lt;/div>&lt;a href="https://jp.mercari.com/item/m71496725612?afid=1916658352" style="width:100px;height:100px;background:#eee;" target="_blank">&lt;img src="https://ambassador-system.mercari.com/v1/i?id=m71496725612&amp;svc=m" style="line-height:0;width:100px;height:100px;object-fit:contain;"/>&lt;/a>&lt;div style="padding:12px 0;width:100%;text-align:center;">&lt;a href="https://jp.mercari.com/item/m71496725612?afid=1916658352" style="width:100px;height:32px;background-color:#E32B36;border-radius:4px;line-height:14px;text-align:center;color:#fff;font-weight:bold;border:0;font-size:12px;display:inline-flex;justify-content:center;align-items:center;" target="_blank">今すぐ購入&lt;/a>&lt;/div>&lt;/div></description></item><item><title>Гипотеза Коллатца</title><link>http://kenji.blog/ru/p/collatz-conjecture/</link><pubDate>Tue, 15 Jul 2025 18:03:03 +0900</pubDate><guid>http://kenji.blog/ru/p/collatz-conjecture/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/img.png" alt="Featured image of post Гипотеза Коллатца" />&lt;h1 id="действительно-ли-любое-число-в-конце-концов-становится-1--играем-с-гипотезой-коллатца">&amp;ldquo;Действительно ли любое число в конце концов становится 1?&amp;rdquo; ── Играем с гипотезой Коллатца
&lt;/h1>&lt;p>Всем привет! Это Кенджи.&lt;/p>
&lt;p>Внезапный вопрос: когда вы слышите о &amp;ldquo;правиле, по которому любое число в итоге превращается в 1&amp;rdquo;,
разве это не кажется вам немного странным?&lt;/p>
&lt;blockquote>
&lt;p>Например, 19, или 87, или даже 1000000.
Если вы следуете определенному правилу и манипулируете числами, по какой-то причине они всегда сводятся к &amp;ldquo;1&amp;rdquo;.&lt;/p>
&lt;/blockquote>
&lt;p>Эта сказочная история и есть &lt;strong>гипотеза Коллатца (Collatz Conjecture)&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="для-начала-что-такое-гипотеза-коллатца">Для начала, что такое гипотеза Коллатца?
&lt;/h2>&lt;p>Сначала позвольте мне представить правила.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Старт: выберите любое &lt;strong>положительное целое число&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Операция:&lt;/p>
&lt;ul>
&lt;li>Если четное → делим пополам (n → n / 2)&lt;/li>
&lt;li>Если нечетное → умножаем на 3 и прибавляем 1 (n → 3n + 1)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Если повторять это снова и снова, гипотеза гласит, что &lt;strong>любое число в конечном итоге достигнет 1&lt;/strong>.&lt;/p>
&lt;p>Например, если мы начнем с &lt;code>6&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Оно действительно стало &amp;ldquo;1&amp;rdquo;. С возвращением!&lt;/p>
&lt;hr>
&lt;h2 id="давайте-попробуем-это-в-коде-коллатц-на-python">Давайте попробуем это в коде: Коллатц на Python
&lt;/h2>&lt;p>Что ж, в таких случаях быстрее всего попробовать написать код!
Давайте выведем &amp;ldquo;последовательность Коллатца&amp;rdquo; с помощью Python.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">steps&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Пример: давайте начнем с 19&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">19&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>При запуске:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Оно успешно достигает 1.
Пришлось сделать немало крюков, но в итоге мы на финише!&lt;/p>
&lt;p>Кстати, даже если мы начнем с 29, оно достигнет 1 таким же образом.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">pythonprint(collatz(29))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>При запуске:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>На это уходит целых 111 шагов!&lt;/p>
&lt;p>Более того, по пути оно иногда раздувается до более чем 9000.
Это тот случай, когда перед финишем делается огромный крюк.&lt;/p>
&lt;hr>
&lt;h2 id="итак-что-же-в-итоге-в-этом-такого-удивительного">Итак, что же в итоге в этом такого удивительного?
&lt;/h2>&lt;p>Удивительное в этой гипотезе то, что:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Хотя это не доказано, похоже, что оно всегда сводится к 1, независимо от того, какое число вы берете&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Вот в чем крутизна.&lt;/p>
&lt;p>А? А как насчет триллиона или квадриллиона&amp;hellip;?&lt;/p>
&lt;p>Если вы подумали об этом, то вы очень проницательны.
На самом деле, с помощью компьютеров это было проверено вплоть до &amp;ldquo;2 в 68-й степени&amp;rdquo;,
и &lt;strong>все они достигают 1&lt;/strong>. Невероятно&amp;hellip;&lt;/p>
&lt;p>Но &lt;strong>не было теоретически доказано, что &amp;ldquo;все будет именно так&amp;rdquo;&lt;/strong>.
Вот что называется &amp;ldquo;нерешенной проблемой&amp;rdquo; в мире математики.&lt;/p>
&lt;hr>
&lt;h2 id="кто-такой-мистер-коллатц">Кто такой мистер Коллатц?
&lt;/h2>&lt;p>Итак, дочитав до этого места, вы, возможно, спросите: &amp;ldquo;Кто вообще такой Коллатц?&amp;rdquo;
Я представлю его как следует!&lt;/p>
&lt;ul>
&lt;li>Имя: &lt;strong>Лотар Коллатц (Lothar Collatz)&lt;/strong>&lt;/li>
&lt;li>Гражданство: Германия&lt;/li>
&lt;li>Годы жизни: 1910 - 1990&lt;/li>
&lt;li>Профессия: Математик (активно работал в области функционального анализа и теории чисел)&lt;/li>
&lt;/ul>
&lt;p>Он предложил эту гипотезу в 1937 году,
и с тех пор, на протяжении более 80 лет, &lt;strong>никто не смог ее ни доказать, ни опровергнуть&lt;/strong>.&lt;/p>
&lt;p>Кстати, эта проблема настолько проста, но в то же время невероятно глубока,
что даже Пол Эрдёш (супер-известный математик) сказал нечто подобное.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Математика еще не созрела для решения проблемы Коллатца.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Иными словами, существует теория, что человеческая математика еще не доросла до этой загадки&amp;hellip;&lt;/p>
&lt;hr>
&lt;h2 id="сложные-формулы-не-нужны">&amp;ldquo;Сложные формулы&amp;rdquo; не нужны
&lt;/h2>&lt;p>Прелесть гипотезы Коллатца в том, что &lt;strong>каждый может с ней поиграть&lt;/strong>.&lt;/p>
&lt;p>Вам нужны только ручка и бумага.
Если вы напишете код на Python, вы сможете проверять это автоматически.
И при этом &lt;strong>передовые математики всерьез ломают над ней голову&lt;/strong>.&lt;/p>
&lt;p>Разве это не захватывающе?&lt;/p>
&lt;hr>
&lt;h2 id="бонус-код-для-массовой-проверки">Бонус: Код для массовой проверки
&lt;/h2>&lt;p>Я также приложу код для проверки множества чисел за один раз.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (количество шагов: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Этот код сразу выведет последовательности Коллатца для чисел от &amp;ldquo;1 до 20&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="вывод-этот-мир-действительно-странный">Вывод: Этот мир действительно странный
&lt;/h2>&lt;p>Итак, это гипотеза Коллатца.&lt;/p>
&lt;ul>
&lt;li>Хотя она очень проста&lt;/li>
&lt;li>Никто не может ее доказать&lt;/li>
&lt;li>Это огромная проблема в математическом мире&lt;/li>
&lt;/ul>
&lt;p>Она оказалась чем-то вроде сгустка тайн.&lt;/p>
&lt;p>Даже новички в программировании могут попробовать ее, так что, пожалуйста, поиграйте!&lt;/p>
&lt;hr>
&lt;h2 id="рекомендуемые-ссылки-для-тех-кому-интересно">Рекомендуемые ссылки (для тех, кому интересно)
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ru.wikipedia.org/wiki/%d0%93%d0%b8%d0%bf%d0%be%d1%82%d0%b5%d0%b7%d0%b0_%d0%9a%d0%be%d0%bb%d0%bb%d0%b0%d1%82%d1%86%d0%b0" target="_blank" rel="noopener"
>Википедия: Гипотеза Коллатца&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://arxiv.org/abs/1909.03562" target="_blank" rel="noopener"
>Статья Теренса Тао (на английском)&lt;/a>&lt;/li>
&lt;li>Также может быть интересно создать визуализированную версию на Python! (Если будет запрос, я ее сделаю)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>Если вы хотите узнать больше историй о &amp;ldquo;таинственной математике × программировании&amp;rdquo;,
пожалуйста, не стесняйтесь писать &amp;ldquo;расскажи больше&amp;rdquo;.
В будущем я расскажу вам о гипотезе Римана, простых числах и многом другом!&lt;/p>
&lt;hr>
&lt;p>📮 Конец!&lt;/p>
&lt;hr></description></item><item><title>Проблема P≠NP</title><link>http://kenji.blog/ru/p/pnp%E4%BA%88%E6%83%B3/</link><pubDate>Wed, 11 Sep 2024 02:22:39 +0900</pubDate><guid>http://kenji.blog/ru/p/pnp%E4%BA%88%E6%83%B3/</guid><description>&lt;h1 id="обзор">Обзор
&lt;/h1>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Класс P — это класс проблем, которые могут быть разрешены за полиномиальное время на детерминированной машине Тьюринга, а класс NP — это класс проблем, для которых, когда дается доказательство того, что ответ — «да» (называемое свидетелем), правильность свидетеля может быть проверена за полиномиальное время (это называется верификацией). Поскольку проблемы, разрешимые за полиномиальное время, также проверяемы за полиномиальное время, очевидно, что P⊆NP, но неясно, является ли P строгим подмножеством NP. Хотя доказательства еще нет, многие исследователи верят, что P≠NP. Это предположение о том, что класс P и класс NP не равны, называется &amp;#34;проблемой P≠NP&amp;#34;.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Справочный сайт : &lt;a class="link" href="https://daigakudenki.com/np-hard/" target="_blank" rel="noopener"
>https://daigakudenki.com/np-hard/&lt;/a>&lt;/p></description></item><item><title>C-код для генерации простых чисел</title><link>http://kenji.blog/ru/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/</link><pubDate>Sat, 24 Aug 2024 09:38:10 +0900</pubDate><guid>http://kenji.blog/ru/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/</guid><description>&lt;img src="http://kenji.blog/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/img.png" alt="Featured image of post C-код для генерации простых чисел" />&lt;p>Ниже приведен простой код на языке C, который генерирует простые числа в заданном диапазоне. В этом примере перечисляются простые числа от 1 до n.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdbool.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="nf">isPrime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">printPrimes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;2 &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">isPrime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%d &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Введите максимальное значение диапазона для генерации простых чисел: &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scanf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%d&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Простые числа от 1 до %d следующие:&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printPrimes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Этот код работает следующим образом:&lt;/p>
&lt;ol>
&lt;li>Функция isPrime: Определяет, является ли заданное число простым. Для эффективности сначала проверяется делимость на 2 и 3, а затем проверка продолжается с кратными 6.&lt;/li>
&lt;li>Функция printPrimes: Выводит простые числа в заданном диапазоне. Сначала выводится 2, затем проверяются только нечетные числа.&lt;/li>
&lt;li>Функция main: Запрашивает у пользователя максимальное значение диапазона и выводит простые числа в этом диапазоне.&lt;/li>
&lt;/ol>
&lt;p>При компиляции и выполнении этого кода будут отображены простые числа в заданном диапазоне.&lt;/p></description></item><item><title>Введение в Mathematica</title><link>http://kenji.blog/ru/p/mathematica%E5%85%A5%E9%96%80/</link><pubDate>Thu, 25 Jul 2024 01:36:19 +0900</pubDate><guid>http://kenji.blog/ru/p/mathematica%E5%85%A5%E9%96%80/</guid><description>&lt;img src="http://kenji.blog/p/mathematica%E5%85%A5%E9%96%80/img.png" alt="Featured image of post Введение в Mathematica" />&lt;h1 id="введение-в-mathematica">Введение в Mathematica
&lt;/h1>&lt;h2 id="решение-уравнений">Решение уравнений
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[x^2 - 3 x + 2 == 0, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 1}, {x -&amp;gt; 2}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="поиск-решений-уравнений-в-целых-числах">Поиск решений уравнений в целых числах
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[x^2 - 3 x + 2 == 0 &amp;amp;&amp;amp; 0 &amp;lt;= x &amp;lt;= 2, x, Integers]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 1}, {x -&amp;gt; 2}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="решение-систем-уравнений">Решение систем уравнений
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[{x + y == 3, x - y == 1}, {x, y}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 2, y -&amp;gt; 1}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="решение-неравенств">Решение неравенств
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Reduce[x^2 - 3 x + 2 &amp;gt; 0, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x &amp;lt; 1 || x &amp;gt; 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="дифференцирование">Дифференцирование
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">D[x^2, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">2 x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="интегрирование">Интегрирование
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Integrate[x^2, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x^3/3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="вычисление-пределов">Вычисление пределов
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Limit[1/x, x -&amp;gt; 0]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Infinity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="вычисление-рядов">Вычисление рядов
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Sum[1/n^2, {n, 1, Infinity}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">π^2/6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="создание-матриц">Создание матриц
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">m = {{1, 2}, {3, 4}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="умножение-матриц">Умножение матриц
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">m . m
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{7, 10}, {15, 22}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="вычисление-обратной-матрицы">Вычисление обратной матрицы
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Inverse[m]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{-2, 1}, {1.5, -0.5}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="поиск-собственных-значений-и-векторов">Поиск собственных значений и векторов
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Eigensystem[m]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{5, 0}, {{1, 1}, {1, -1}}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="скалярное-произведение-векторов">Скалярное произведение векторов
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2} . {3, 4}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">11
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="векторное-произведение-векторов">Векторное произведение векторов
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Cross[{1, 2, 3}, {4, 5, 6}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{-3, 6, -3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="вычисление-длины-вектора">Вычисление длины вектора
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Norm[{1, 2, 3}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">√14
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="вычисление-угла-между-векторами">Вычисление угла между векторами
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ArcCos[{1, 2} . {3, 4}/(Norm[{1, 2}] Norm[{3, 4}])]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ArcCos[11/(√5 √25)]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="проекция-вектора">Проекция вектора
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2} . {3, 4}/Norm[{3, 4}] {3, 4}/Norm[{3, 4}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{11/5, 22/5}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="вращение-вектора">Вращение вектора
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RotationMatrix[π/2].{1, 0}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0, 1}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="параллельный-перенос-вектора">Параллельный перенос вектора
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">TranslationTransform[{1, 2}][{3, 4}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{4, 6}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="масштабирование-вектора">Масштабирование вектора
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ScalingTransform[{2, 3}][{1, 1}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{2, 3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="отражение-вектора">Отражение вектора
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ReflectionTransform[{1, 1}][{1, 1}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0, 0}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="генерация-случайных-чисел">Генерация случайных чисел
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomReal[]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">0.123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="генерация-случайных-чисел-целые-числа">Генерация случайных чисел (целые числа)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomInteger[]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="генерация-случайных-чисел-с-указанием-диапазона">Генерация случайных чисел (с указанием диапазона)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomReal[{1, 10}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">5.6789
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="генерация-случайных-чисел-целые-числа-с-указанием-диапазона">Генерация случайных чисел (целые числа, с указанием диапазона)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomInteger[{1, 10}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="генерация-случайных-чисел-с-указанием-распределения">Генерация случайных чисел (с указанием распределения)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1]]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">0.123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="генерация-случайных-чисел-с-распределением-и-количеством">Генерация случайных чисел (с распределением и количеством)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1], 10]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0.123456, 0.234567, ..., 0.987654}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="генерация-случайных-чисел-распределение-количество-seed">Генерация случайных чисел (распределение, количество, seed)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">SeedRandom[12345]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1], 10]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0.123456, 0.234567, ..., 0.987654}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="применение-функции-к-элементам-массива">Применение функции к элементам массива
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Map[Sqrt, {1, 4, 9}]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sqrt /@ {1, 4, 9}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Map[#^(1/2)&amp;amp;, {1, 4, 9}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2, 3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="определение-функции-с-помощью-лямбда-выражения">Определение функции с помощью лямбда-выражения
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">f = Function[x, x^2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">f[3]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="композиция-функций">Композиция функций
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">f = Function[x, x^2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">g = Function[x, x + 1]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">h = Function[x, f[g[x]]]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">h[3]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">16
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="ссылка-на-результат-предыдущего-вычисления">Ссылка на результат предыдущего вычисления
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">% + 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">17
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="чистые-функции">Чистые функции
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">(#+3)&amp;amp;[5]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="извлечение-из-массива">Извлечение из массива
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Select[{1, 2, 3, 4, 5}, EvenQ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Select[{1, 2, 3, 4, 5}, Mod[#,2]==0&amp;amp;]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вывод&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{2, 4}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item><item><title>Что такое парадокс дней рождения?</title><link>http://kenji.blog/ru/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/</link><pubDate>Tue, 02 Apr 2024 01:20:50 +0900</pubDate><guid>http://kenji.blog/ru/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/img.png" alt="Featured image of post Что такое парадокс дней рождения?" />&lt;h2 id="вы-знаете-о-парадоксе-дней-рождения">Вы знаете о парадоксе дней рождения?
&lt;/h2>&lt;p>Я расскажу немного странную историю.
Как вы думаете, сколько людей должно собраться, чтобы &amp;ldquo;вероятность того, что у кого-то совпадут дни рождения&amp;rdquo; стала высокой?&lt;/p>
&lt;p>Например, в году 365 дней, поэтому когда говорят, что &amp;ldquo;если соберутся 23 человека, вероятность того, что у кого-то совпадет день рождения, составляет 50% или больше&amp;rdquo;&amp;hellip; это кажется несколько противоречащим интуиции, не так ли?&lt;/p>
&lt;p>Но это &lt;strong>действительно больше 50%.&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="почему-так-происходит">Почему так происходит?
&lt;/h2>&lt;p>Это явление называется &amp;ldquo;парадоксом дней рождения&amp;rdquo;.
Название содержит слово &amp;ldquo;парадокс&amp;rdquo;, но для этого есть веская математическая причина.&lt;/p>
&lt;p>Если количество людей обозначить как &amp;ldquo;n&amp;rdquo;, то &lt;strong>вероятность того, что ни у кого не совпадет день рождения,&lt;/strong> можно вычислить по следующей формуле:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">P(ни у кого не совпадает) = 365/365 × 364/365 × 363/365 × ... × (365 - n + 1)/365
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вычитая это из 1, мы получаем &amp;ldquo;вероятность совпадения с кем-то&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="посмотрим-на-результаты">Посмотрим на результаты&amp;hellip;
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Количество человек&lt;/th>
&lt;th>Вероятность совпадения дней рождения&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>10 человек&lt;/td>
&lt;td>Около 11.7%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>20 человек&lt;/td>
&lt;td>Около 41.1%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>23 человека&lt;/td>
&lt;td>&lt;strong>Около 50.7% (Здесь внимание!)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>30 человек&lt;/td>
&lt;td>Около 70.6%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>70 человек&lt;/td>
&lt;td>&lt;strong>Целых 99.9%!&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Другими словами, если есть всего &lt;strong>23 человека&lt;/strong>, с вероятностью больше половины дни рождения кого-то совпадут.
Кажется, это вполне применимо к школьным классам или рабочим совещаниям.&lt;/p>
&lt;hr>
&lt;h2 id="заключение-разница-между-интуицией-и-математикой-интересна">Заключение: разница между интуицией и математикой интересна
&lt;/h2>&lt;p>&amp;ldquo;Парадокс дней рождения&amp;rdquo; — это интересный пример того, как наша интуиция расходится с реальной математической вероятностью.
Знание таких вещей может оживить небольшую беседу или викторину!&lt;/p>
&lt;hr>
&lt;h2 id="полезные-ссылки">Полезные ссылки
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9" target="_blank" rel="noopener"
>Парадокс дней рождения (Википедия)&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Парадокс Монти Холла</title><link>http://kenji.blog/ru/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/</link><pubDate>Sun, 31 Mar 2024 23:41:51 +0900</pubDate><guid>http://kenji.blog/ru/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/img_1.png" alt="Featured image of post Парадокс Монти Холла" />&lt;h2 id="что-такое-парадокс-монти-холла">Что такое парадокс Монти Холла
&lt;/h2>&lt;p>Парадокс Монти Холла — это задача, основанная на игре из американского телешоу &amp;ldquo;Let&amp;rsquo;s Make a Deal&amp;rdquo;, которая выглядит следующим образом.&lt;/p>
&lt;p>Исходные условия: за одной из трех дверей находится приз, а за двумя другими — ничего.&lt;/p>
&lt;ol>
&lt;li>Участник выбирает одну из трех дверей.&lt;/li>
&lt;li>Ведущий открывает одну из двух оставшихся дверей (ту, за которой нет приза).&lt;/li>
&lt;li>Участника спрашивают, хочет ли он изменить свой выбор двери.&lt;/li>
&lt;/ol>
&lt;p>Задача состоит в том, чтобы решить, лучше ли участнику изменить свой выбор или нет.&lt;/p>
&lt;h2 id="решение">Решение
&lt;/h2>&lt;p>Решение парадокса Монти Холла выглядит следующим образом.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Если участник не меняет дверь, которую он выбрал изначально&lt;/p>
&lt;ul>
&lt;li>Вероятность выигрыша: 1/3&lt;/li>
&lt;li>Вероятность проигрыша: 2/3&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>После того как ведущий открывает дверь без приза&lt;/p>
&lt;ul>
&lt;li>Если не менять выбор, вероятность выигрыша: 1/3 (остается такой же, как в п. 1)&lt;/li>
&lt;li>Если изменить выбор, вероятность выигрыша: 2/3 (вероятность того, что приз не был выбран изначально)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>Следовательно, у участника больше шансов на выигрыш, если он изменит свой выбор.&lt;/p>
&lt;h2 id="источники">Источники
&lt;/h2>&lt;ul>
&lt;li>Wikipedia &lt;a class="link" href="https://en.wikipedia.org/wiki/Monty_Hall_problem" target="_blank" rel="noopener"
>Monty Hall problem&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Нерешенные математические проблемы</title><link>http://kenji.blog/ru/p/nereshennye-matematicheskie-problemy/</link><pubDate>Sat, 02 Mar 2024 22:57:36 +0900</pubDate><guid>http://kenji.blog/ru/p/nereshennye-matematicheskie-problemy/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/img.png" alt="Featured image of post Нерешенные математические проблемы" />&lt;h1 id="нерешенные-математические-проблемы">Нерешенные математические проблемы
&lt;/h1>&lt;p>Мы расскажем о нерешенных математических проблемах. Хотя сами проблемы просты, существует еще много проблем, которые не доказаны.&lt;/p>
&lt;h2 id="существует-ли-бесконечное-множество-совершенных-чисел">Существует ли бесконечное множество совершенных чисел?
&lt;/h2>&lt;p>Совершенное число — это натуральное число, равное сумме всех своих собственных делителей (то есть делителей, отличных от самого числа).
Например,&lt;/p>
&lt;ul>
&lt;li>Делителями числа 6 являются 1, 2 и 3, а 1+2+3=6, поэтому это совершенное число.&lt;/li>
&lt;li>Делителями числа 28 являются 1, 2, 4, 7 и 14, а 1+2+4+7+14=28, поэтому это совершенное число.&lt;/li>
&lt;/ul>
&lt;p>На данный момент обнаружено только 51 совершенное число. Хотя ожидается, что их бесконечно много, это еще не доказано.&lt;/p>
&lt;h2 id="проблема-гольдбаха">Проблема Гольдбаха
&lt;/h2>&lt;p>Проблема Гольдбаха (или гипотеза Гольдбаха) утверждает, что любое четное число больше 2 можно представить в виде суммы двух простых чисел.
(Здесь простое число — это натуральное число, не имеющее делителей, кроме 1 и самого себя.)&lt;/p>
&lt;p>Например,&lt;/p>
&lt;ul>
&lt;li>4=2+2&lt;/li>
&lt;li>6=3+3&lt;/li>
&lt;li>8=3+5&lt;/li>
&lt;li>10=3+7=5+5&lt;/li>
&lt;/ul>
&lt;p>Сама проблема очень проста, но она до сих пор не доказана.&lt;/p>
&lt;h2 id="гипотеза-римана">Гипотеза Римана
&lt;/h2>&lt;p>Гипотеза утверждает, что нетривиальные нули дзета-функции Римана ограничиваются отрицательными четными числами и комплексными числами с действительной частью, равной 1 / 2.&lt;/p>
&lt;p>Дзета-функция Римана $\zeta$ определяется следующим образом, где $s$ — комплексное число, а $n$ — натуральное число:&lt;/p>
$$\zeta(s):=\sum _{n=1}^{\infty }{\frac {1}{n^{s}}}=1+{\frac {1}{2^{s}}}+{\frac {1}{3^{s}}}+{\frac {1}{4^{s}}}+\cdots$$</description></item><item><title>История математики</title><link>http://kenji.blog/ru/p/%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F-%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B8/</link><pubDate>Sat, 22 Jul 2023 15:25:10 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F-%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B8/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/img.png" alt="Featured image of post История математики" />&lt;h3 id="три-классические-задачи-на-построение-древней-греции">Три классические задачи на построение древней Греции
&lt;/h3>&lt;ol>
&lt;li>Построить квадрат, равновеликий по площади данному кругу (Квадратура круга)&lt;/li>
&lt;li>Разделить произвольный заданный угол на три равные части (Трисекция угла)&lt;/li>
&lt;li>Построить куб, объем которого в два раза больше объема заданного куба (Удвоение куба)&lt;/li>
&lt;/ol>
&lt;h3 id="архимедова-спираль">Архимедова спираль
&lt;/h3>&lt;p>На плоскости луч OB вращается вокруг фиксированной точки O с постоянной скоростью. Если начальное положение — OA,
и точка P начинает движение от O вдоль OB с постоянной скоростью одновременно с началом вращения, то линия,
которую описывает точка P, называется архимедовой спиралью.&lt;/p>
&lt;h3 id="теорема-паппа">Теорема Паппа
&lt;/h3>&lt;ul>
&lt;li>Циклоида&lt;/li>
&lt;li>Конхоида Никомеда&lt;/li>
&lt;li>Циссоида Диокла&lt;/li>
&lt;li>Метод касательных Ферма&lt;/li>
&lt;li>Метод нормалей Декарта&lt;/li>
&lt;/ul>
&lt;h3 id="хронология">Хронология
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Год&lt;/th>
&lt;th>Событие&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Около 3400 г. до н.э.&lt;/td>
&lt;td>Шумеры используют глиняные жетоны для счета&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Около 3000 г. до н.э.&lt;/td>
&lt;td>Появление иероглифической математики в Египте&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Около 2800 г. до н.э.&lt;/td>
&lt;td>Индская цивилизация использует меры и веса на основе десятичной системы&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Около 2700 г. до н.э.&lt;/td>
&lt;td>Египтяне используют веревку и пифагоровы тройки для проверки углов&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Около 2500 г. до н.э.&lt;/td>
&lt;td>Обнаружен абак, инструмент для вычислений&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Около 2500 г. до н.э.&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="ссылки">Ссылки
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://ru.wikipedia.org/wiki/%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B8" target="_blank" rel="noopener"
>История математики&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Как найти простые числа до 1000 с помощью решета Эратосфена</title><link>http://kenji.blog/ru/p/kak-najti-prostye-chisla-do-1000-s-pomoshchyu-resheta-eratosfena/</link><pubDate>Sun, 09 Apr 2023 12:54:24 +0900</pubDate><guid>http://kenji.blog/ru/p/kak-najti-prostye-chisla-do-1000-s-pomoshchyu-resheta-eratosfena/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png" alt="Featured image of post Как найти простые числа до 1000 с помощью решета Эратосфена" />&lt;h2 id="что-такое-решето-эратосфена">Что такое решето Эратосфена
&lt;/h2>&lt;p>Решето Эратосфена — это алгоритм для нахождения всех простых чисел до заданного целого числа.
Алгоритм прост и может быть реализован с помощью следующих шагов:&lt;/p>
&lt;ol>
&lt;li>Создайте логический (bool) массив из N элементов и инициализируйте все элементы как true.&lt;/li>
&lt;li>Установите 0-й и 1-й элементы массива как false (так как 0 и 1 не являются простыми числами).&lt;/li>
&lt;li>Если 2-й элемент массива равен true, выведите 2 как простое число.&lt;/li>
&lt;li>Установите все элементы, кратные 2, начиная с $2^2$, в false ※&lt;/li>
&lt;li>Если 3-й элемент массива равен true, выведите 3 как простое число.&lt;/li>
&lt;li>Установите все элементы, кратные 3, начиная с $3^2$, в false.&lt;/li>
&lt;li>Повторите тот же процесс для 4-го, 5-го, &amp;hellip;, N-го элементов.&lt;/li>
&lt;/ol>
&lt;p>※ Причина, по которой мы устанавливаем в false элементы, начиная с квадрата числа, заключается в том, что числа, меньшие квадрата, уже были обработаны (перечисление завершено).&lt;/p>
&lt;p>&lt;img src="http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/Animation_Sieb_des_Eratosthenes.gif"
width="445"
height="369"
srcset="http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/Animation_Sieb_des_Eratosthenes_hua63c6218ac9f9cdba93ccb20db392e0e_206214_480x0_resize_box_1.gif 480w, http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/Animation_Sieb_des_Eratosthenes_hua63c6218ac9f9cdba93ccb20db392e0e_206214_1024x0_resize_box_1.gif 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="120"
data-flex-basis="289px"
>&lt;/p>
&lt;h2 id="реализация-на-rust">Реализация на Rust
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">fn main() {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let n = 1000;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut is_prime = vec![true; n+1];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[0] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[1] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in 2..=n {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if is_prime[i] {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> println!(&amp;#34;{}&amp;#34;, i);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut j = i * i;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> while j &amp;lt;= n {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[j] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> j += i;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="немного-более-быстрая-версия">Немного более быстрая версия
&lt;/h2>&lt;p>Мы реализуем немного более быструю версию, учитывая следующие моменты:&lt;/p>
&lt;ul>
&lt;li>Вместо инициализации массива значением true, инициализируем его значением false (так быстрее).&lt;/li>
&lt;li>Поскольку кратные 2 не являются простыми числами, мы опускаем процесс установки кратных 2 в false.&lt;/li>
&lt;li>Нет необходимости выполнять цикл до n; если найти простые числа до квадратного корня из n, можно найти все простые числа до n.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">fn main() {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let n = 1000;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut is_prime = vec![false; n+1];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[2] = true;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in (3..=n).step_by(2) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[i] = true;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in 3..=((n as f64).sqrt() as usize) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if is_prime[i] {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut j = i * i;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> while j &amp;lt;= n {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[j] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> j += i * 2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in (2..=n).filter(|&amp;amp;x| is_prime[x]) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> println!(&amp;#34;{}&amp;#34;, i);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="источники">Источники
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9" target="_blank" rel="noopener"
>Решето Эратосфена&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Как рисовать графики с помощью Python (matplotlib.pyplot)</title><link>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B8-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-python-matplotlib-pyplot/</link><pubDate>Sun, 09 Apr 2023 01:02:19 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B8-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-python-matplotlib-pyplot/</guid><description>&lt;img src="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png" alt="Featured image of post Как рисовать графики с помощью Python (matplotlib.pyplot)" />&lt;p>&lt;img src="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1.png"
width="1200"
height="288"
srcset="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hue3f23818eeeec9c43d6452cc0f61fb52_43864_480x0_resize_box_3.png 480w, http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hue3f23818eeeec9c43d6452cc0f61fb52_43864_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="416"
data-flex-basis="1000px"
>&lt;/p>
&lt;h1 id="требования">Требования
&lt;/h1>&lt;ul>
&lt;li>Аккаунт Google&lt;/li>
&lt;/ul>
&lt;h1 id="шаги">Шаги
&lt;/h1>&lt;ol>
&lt;li>Перейдите на &lt;a class="link" href="https://colab.research.google.com/" target="_blank" rel="noopener"
>https://colab.research.google.com/&lt;/a>&lt;/li>
&lt;li>Выберите «Файл» → «Создать блокнот»&lt;/li>
&lt;li>Вставьте и выполните следующий код&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">matplotlib.pyplot&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">plt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">500&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;sin curve&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cos&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cos curve&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">legend&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># отображение легенды&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">show&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h1 id="результат">Результат
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png"
width="568"
height="413"
srcset="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hucdb24ab588d845f9f7a56ef99be2c709_27745_480x0_resize_box_3.png 480w, http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hucdb24ab588d845f9f7a56ef99be2c709_27745_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img.png"
class="gallery-image"
data-flex-grow="137"
data-flex-basis="330px"
>&lt;/p>
&lt;h1 id="ссылки">Ссылки
&lt;/h1>&lt;ul>
&lt;li>&lt;a class="link" href="https://matplotlib.org/3.5.3/api/_as_gen/matplotlib.pyplot.html" target="_blank" rel="noopener"
>matplotlib.pyplot — Matplotlib 3.5.3 documentation&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Как включить KaTeX (отображение формул в стиле LaTeX) в hugo</title><link>http://kenji.blog/ru/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 31 Mar 2023 23:11:26 +0900</pubDate><guid>http://kenji.blog/ru/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;img src="http://kenji.blog/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png" alt="Featured image of post Как включить KaTeX (отображение формул в стиле LaTeX) в hugo" />&lt;h1 id="что-такое-katex">Что такое KaTeX?
&lt;/h1>&lt;p>KaTeX — это JavaScript-библиотека для отображения математических формул в стиле LaTeX в HTML.&lt;/p>
&lt;p>В частности, вы можете отображать формулы, подобные этой:&lt;/p>
$$f(x) = x^2 + x + 41$$
&lt;p>Существуют и другие библиотеки для отображения формул в стиле LaTeX, но KaTeX славится своей простотой и скоростью.&lt;/p>
&lt;h1 id="как-внедрить-в-hugo">Как внедрить в hugo
&lt;/h1>&lt;ol>
&lt;li>Создайте новый файл &lt;code>layouts/partials/math.html&lt;/code> в структуре папок hugo.&lt;/li>
&lt;/ol>
&lt;p>Содержимое должно быть следующим:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css&amp;#34; integrity=&amp;#34;sha384-vKruj+a13U8yHIkAyGgK1J3ArTLzrFGBbBc0tDp4ad/EyewESeXE/Iv67Aj8gKZ0&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;script defer src=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js&amp;#34; integrity=&amp;#34;sha384-PwRUT/YqbnEjkZO0zZxNqcxACrXe+j766U2amXcgMg5457rve2Y7I6ZJSm2A0mS4&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;script defer src=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/contrib/auto-render.min.js&amp;#34; integrity=&amp;#34;sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;script&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">document.addEventListener(&amp;#34;DOMContentLoaded&amp;#34;, function() {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> renderMathInElement(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> document.body,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> delimiters: [
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;$$&amp;#34;, right: &amp;#34;$$&amp;#34;, display: true},
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;\\[&amp;#34;, right: &amp;#34;\\]&amp;#34;, display: true},
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;$&amp;#34;, right: &amp;#34;$&amp;#34;, display: false},
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;\\(&amp;#34;, right: &amp;#34;\\)&amp;#34;, display: false}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> });
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> });
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;/script&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ol start="2">
&lt;li>Затем добавьте следующий код в существующий файл &lt;code>layouts/partials/extend_head.html&lt;/code>.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{ if or .Params.math .Site.Params.math }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ partial &amp;#34;math.html&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ol start="3">
&lt;li>Теперь вы готовы использовать KaTeX.&lt;/li>
&lt;/ol>
&lt;p>Добавив &lt;code>math: true&lt;/code> в front matter вашей страницы, вы сможете активировать KaTeX.&lt;/p>
&lt;ol start="4">
&lt;li>Все, что вам нужно сделать, это написать формулы в стиле LaTeX в теле вашей статьи.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">$$ e^{i \pi} = -1 $$
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>При написании, как показано выше, это будет отображаться следующим образом:&lt;/p>
$$ e^{i \pi} = -1 $$
&lt;h1 id="ссылки">Ссылки
&lt;/h1>&lt;ul>
&lt;li>&lt;a class="link" href="https://reorx.github.io/hugo-PaperModX/docs/math-typesetting/" target="_blank" rel="noopener"
>Math Typesetting | PaperModX&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://katex.org/docs/autorender.html" target="_blank" rel="noopener"
>KaTex Auto-render Extension&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.storange.jp/2017/02/katex.html" target="_blank" rel="noopener"
>Введение в KaTeX | The Strange Storage&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Решение задачи коммивояжера с помощью Mathematica</title><link>http://kenji.blog/ru/p/%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-mathematica/</link><pubDate>Wed, 12 Oct 2022 19:05:58 +0900</pubDate><guid>http://kenji.blog/ru/p/%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-mathematica/</guid><description>&lt;img src="http://kenji.blog/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/img.png" alt="Featured image of post Решение задачи коммивояжера с помощью Mathematica" />&lt;h1 id="решение-задачи-коммивояжера-с-помощью-mathematica">Решение задачи коммивояжера с помощью Mathematica
&lt;/h1>&lt;h2 id="проблема">Проблема
&lt;/h2>&lt;blockquote class="twitter-tweet">&lt;p lang="ja" dir="ltr">電車でこんな広告を見かけました😁📸 &lt;a href="https://t.co/iXEgvtXrpL">pic.twitter.com/iXEgvtXrpL&lt;/a>&lt;/p>&amp;mdash; 早稲田大学 早水桃子研究室 (@hayamizu_lab) &lt;a href="https://x.com/hayamizu_lab/status/1579806418982825984?ref_src=twsrc%5Etfw">October 11, 2022&lt;/a>&lt;/blockquote>
&lt;script async src="https://platform.x.com/widgets.js" charset="utf-8">&lt;/script>
&lt;h2 id="решение">Решение
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">d=SparseArray[{{1,2}-&amp;gt;10,{2,1}-&amp;gt;10,{1,5}-&amp;gt;15,{5,1}-&amp;gt;15,{1,4}-&amp;gt;12,{4,1}-&amp;gt;12,{1,3}-&amp;gt;20,{3,1}-&amp;gt;20,{2,5}-&amp;gt;10,{5,2}-&amp;gt;10,{3,4}-&amp;gt;10,{4,3}-&amp;gt;10,{3,8}-&amp;gt;30,{8,3}-&amp;gt;30,{3,7}-&amp;gt;20,{7,3}-&amp;gt;20,{3,6}-&amp;gt;25,{6,3}-&amp;gt;25,{4,5}-&amp;gt;15,{5,4}-&amp;gt;15,{4,8}-&amp;gt;20,{8,4}-&amp;gt;20,{5,9}-&amp;gt;18,{9,5}-&amp;gt;18,{5,8}-&amp;gt;15,{8,5}-&amp;gt;15,{6,7}-&amp;gt;5,{7,6}-&amp;gt;5,{7,8}-&amp;gt;35,{8,7}-&amp;gt;35,{8,9}-&amp;gt;12,{9,8}-&amp;gt;12},{9,9},Infinity];
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Создайте матрицу с помощью функции SparseArray. Каждый элемент представляет расстояние между городами в строке и столбце этого элемента. Например, первый элемент &lt;code>{1,2}-&amp;gt;10&lt;/code> означает, что расстояние между 1 и 2 равно 10. Предпоследний элемент &lt;code>{9,9}&lt;/code> указывает на размер матрицы, а последний элемент &lt;code>Infinity&lt;/code> означает, что длина пути между неуказанными городами бесконечна. Другими словами, это означает, что пути нет.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{len,tour}=FindShortestTour[{1,2,3,4,5,6,7,8,9},DistanceFunction-&amp;gt;(d[[#1,#2]]&amp;amp;)]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вы можете легко решить задачу коммивояжера с помощью функции FindShortestTour. &lt;code>{1,2,3,4,5,6,7,8,9}&lt;/code> представляют номера городов. &lt;code>DistanceFunction-&amp;gt;(d[[#1,#2]]&amp;amp;)&lt;/code> передает матрицу d, представляющую расстояния между городами.&lt;/p>
&lt;h2 id="вывод">Вывод
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{137, {1, 2, 5, 9, 8, 7, 6, 3, 4}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Выводом являются кратчайшее расстояние и маршрут в это время. Кратчайшее расстояние равно &lt;code>137&lt;/code>, а маршрут — &lt;code>1→2→5→9→8→7→6→3→4→1&lt;/code>. Если изменить порядок на ABC, он станет &lt;code>A, B, E, I, H, G, F, C, D&lt;/code>.&lt;/p></description></item><item><title>Мои любимые математические формулы</title><link>http://kenji.blog/ru/p/%D0%BC%D0%BE%D0%B8-%D0%BB%D1%8E%D0%B1%D0%B8%D0%BC%D1%8B%D0%B5-%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B/</link><pubDate>Wed, 05 Oct 2022 13:24:50 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%BC%D0%BE%D0%B8-%D0%BB%D1%8E%D0%B1%D0%B8%D0%BC%D1%8B%D0%B5-%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B/</guid><description>&lt;img src="http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/img.png" alt="Featured image of post Мои любимые математические формулы" />&lt;h2 id="теорема-вильсона">Теорема Вильсона
&lt;/h2>&lt;p>Пусть $p$ — простое число, тогда выполняется $(p−1)!≡−1 \pmod p$&lt;/p>
&lt;h2 id="формула-эйлера">Формула Эйлера
&lt;/h2>&lt;p>$e^{iπ}+1=0$&lt;/p>
&lt;h2 id="великая-теорема-ферма">Великая теорема Ферма
&lt;/h2>&lt;p>Для любого целого числа $n≥3$ не существует таких положительных целых чисел $x,y,z$, которые удовлетворяли бы уравнению $x^n+y^n=z^n$&lt;/p>
&lt;h2 id="базельская-проблема">Базельская проблема
&lt;/h2>&lt;p>$1/1^2+1/2^2+1/3^2+1/4^2+...=π^2/6$&lt;/p>
&lt;h2 id="многочлен-эйлера-для-генерации-простых-чисел">Многочлен Эйлера для генерации простых чисел
&lt;/h2>&lt;p>$n^2+n+41$ дает простые числа для всех целых $n$ от $0$ до $39$&lt;/p></description></item></channel></rss>