<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.65.244.35&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.65.244.35&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.65.244.35"/>
		<updated>2026-08-05T12:15:52Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%B9_%D0%BE%D0%B1%D1%89%D0%B8%D0%B9_%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C&amp;diff=80836</id>
		<title>Наибольший общий делитель</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%B9_%D0%BE%D0%B1%D1%89%D0%B8%D0%B9_%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C&amp;diff=80836"/>
				<updated>2021-05-06T14:17:12Z</updated>
		
		<summary type="html">&lt;p&gt;188.65.244.35: /* Расширенный алгоритм Евклида */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Наибольшим общим делителем''' (англ. &amp;lt;tex&amp;gt;\gcd&amp;lt;/tex&amp;gt; {{---}} ''greatest common divisor'') для двух целых чисел &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; называется наибольшее натуральное &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, такое что &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; делится на &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; делится на &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;. Более формально, &lt;br /&gt;
&amp;lt;tex&amp;gt;\gcd(a, b) =\max \left\{ d \mid a \equiv 0 \left(\bmod d\right), b \equiv 0 \left(\bmod d\right) \right\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Свойства НОД==&lt;br /&gt;
&lt;br /&gt;
Наибольший общий делитель существует и однозначно определён, если хотя бы одно из чисел &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; не ноль.&lt;br /&gt;
&lt;br /&gt;
Понятие наибольшего общего делителя естественным образом обобщается на наборы из более чем двух целых чисел:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Наибольший общий делитель''' для целочисленного множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; определяется как &lt;br /&gt;
&amp;lt;tex&amp;gt;\gcd(A) = \max \left\{ d \mid \forall a_j \in A,\: a_j \equiv 0 \left(\bmod d \right)\right\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Существует определение НОД через [[Разложение_на_множители_(факторизация) | разложение числа на простые множители]]:&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=l001&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; — натуральные числа. Тогда &amp;lt;tex dpi=&amp;quot;140&amp;quot;&amp;gt;\gcd(a, b) = p_1^{\min(\alpha_1, \beta_1)}\cdot p_2^{\min(\alpha_2, \beta_2)} \cdot \dotso \cdot p_k^{\min(\alpha_k, \beta_k)},&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;p_j&amp;lt;/tex&amp;gt; — делитель &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. (Если &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; не делится на &amp;lt;tex&amp;gt;p_j,&amp;lt;/tex&amp;gt; будем считать, что &amp;lt;tex&amp;gt;p_j&amp;lt;/tex&amp;gt; присутствует в разложении &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ой степени.)&lt;br /&gt;
|proof=&lt;br /&gt;
Разложим &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; на множители: пусть &amp;lt;tex dpi=&amp;quot;140&amp;quot;&amp;gt;a = p_1^{\alpha_1} \cdot p_2^{\alpha_2} \cdot \dotso \cdot p_k^{\alpha_k}, \: &lt;br /&gt;
b = q_1^{\beta_1} \cdot q_2^{\beta_2} \cdot \dotso \cdot q_k^{\beta_k}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p_j, q_j&amp;lt;/tex&amp;gt; {{---}} простые, а &amp;lt;tex&amp;gt;\alpha_j, \beta_j&amp;lt;/tex&amp;gt; {{---}} натуральные&lt;br /&gt;
(такие разложения существуют, по [[Основная_теорема_арифметики | основной теореме арифметики]]). Без ограничения общности, можно считать, что &amp;lt;tex&amp;gt;p_j = q_j, k = n&amp;lt;/tex&amp;gt; (если это не так, сделаем соответствующие &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; равными нулю).&lt;br /&gt;
Очевидно, что в таком случае &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и на &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; делятся на &amp;lt;tex dpi=&amp;quot;140&amp;quot;&amp;gt;p = p_1^{\min(\alpha_1, \beta_1)}\cdot p_2^{\min(\alpha_2, \beta_2)} \cdot \dotso \cdot p_k^{\min(\alpha_k, \beta_k)} &amp;lt;/tex&amp;gt;. Проверим его максимальность.&lt;br /&gt;
Пусть существует &amp;lt;tex&amp;gt;q &amp;gt; p&amp;lt;/tex&amp;gt;, такое что &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; делятся на &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;. Тогда оно необходимо будет раскладываться на те же простые множители, что и &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;tex dpi=&amp;quot;140&amp;quot;&amp;gt;q = p_1^{\gamma_1}\cdot p_2^{\gamma_2} \cdot \dotso \cdot p_k^{\gamma_k} &amp;lt;/tex&amp;gt;. Значит, существует &amp;lt;tex&amp;gt;j \leqslant k : \min(\alpha_j, \beta_j) &amp;lt; \gamma_j&amp;lt;/tex&amp;gt;. Из этого следует, что либо &amp;lt;tex&amp;gt;\gamma_j &amp;gt; \alpha_j&amp;lt;/tex&amp;gt;, либо &amp;lt;tex&amp;gt;\gamma_j &amp;gt; \beta_j&amp;lt;/tex&amp;gt;. Но в первом случае, &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; не окажется делителем &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, а во втором {{---}} &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Значит, такого &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; не существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Связь с наименьшим общим кратным===&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Наименьшим общим кратным''' (англ. &amp;lt;tex&amp;gt;\text{lcm}&amp;lt;/tex&amp;gt; {{---}} ''least common multiple'') для двух чисел &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; называется наименьшее натуральное число, которое делится на &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; без остатка. Более формально &lt;br /&gt;
&amp;lt;tex&amp;gt;\text{lcm}(a, b) = \min \left\{ d \mid d \equiv 0 \left( \bmod a\right), d \equiv 0 \left( \bmod b\right) \right\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Существует представление НОК через  [[Разложение_на_множители_(факторизация) | разложение числа на простые множители]]:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=l002&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; — натуральные числа. Тогда &amp;lt;tex dpi=&amp;quot;140&amp;quot;&amp;gt;\text{lcm}(a, b) = p_1^{\max(\alpha_1, \beta_1)}\cdot p_2^{\max(\alpha_2, \beta_2)} \cdot \dotso \cdot p_k^{\max(\alpha_k, \beta_k)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Доказательство полностью аналогично доказательству [[#l001 | утверждения о НОД]], с той лишь разницей, что мы заменяем &amp;lt;tex&amp;gt;\min&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;\max&amp;lt;/tex&amp;gt;, а знаки неравенств {{---}} на противоположные.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Наибольший общий делитель связан с наименьшим общим кратным следующим равенством:&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=l01&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} целые числа. Тогда &amp;lt;tex&amp;gt;\gcd(a, b) \cdot \text{lcm}(a, b) = a \cdot b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[#l001 | утверждению о НОД]] и [[#l002 | утверждению о НОК]], пользуясь тем, что &amp;lt;tex&amp;gt;\max(\alpha, \beta) + \min(\alpha, \beta) = \alpha + \beta&amp;lt;/tex&amp;gt;, получаем нашу лемму.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Алгоритм Вычисления==&lt;br /&gt;
&lt;br /&gt;
===Наивный алгоритм===&lt;br /&gt;
&lt;br /&gt;
В наивном методе, мы считаем, что нам известны разложения чисел &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; на простые множители.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;// &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; {{---}} множество простых чисел в разложении &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
 // &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; {{---}} множество простых чисел в разложении &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
 // &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; {{---}} степени простых чисел в разложении &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
 // &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; {{---}} степени простых чисел в разложении &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' naiveGcd(p, q, &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;): &lt;br /&gt;
     gcd &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; 1&lt;br /&gt;
     i, j &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; 0, 0&lt;br /&gt;
     '''while''' i &amp;lt; p.length() '''and''' j &amp;lt; q.length():&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; == &amp;lt;tex&amp;gt; q_j&amp;lt;/tex&amp;gt; : &lt;br /&gt;
         t &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; min(&amp;lt;tex&amp;gt;\alpha_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\beta_i&amp;lt;/tex&amp;gt;)&lt;br /&gt;
             gcd = gcd &amp;lt;tex&amp;gt;\cdot&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;p_i^t&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''else if''' &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; &amp;lt; &amp;lt;tex&amp;gt;q_j&amp;lt;/tex&amp;gt; :&lt;br /&gt;
             i += 1&lt;br /&gt;
         '''else''':&lt;br /&gt;
             j += 1&lt;br /&gt;
     '''return''' gcd&lt;br /&gt;
&lt;br /&gt;
Корректность алгоритма следует из того, что он по сути просто делает пересечение двух упорядоченных массивов (&amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;), только результат записывает не в массив, а агрегирует в переменной &amp;lt;tex&amp;gt;\gcd&amp;lt;/tex&amp;gt;. Асимптотика равна минимуму из длин массивов &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Стандартный алгоритм Евклида===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; — целые числа, не равные одновременно нулю, и последовательность чисел&lt;br /&gt;
: &amp;lt;tex&amp;gt; a,\, b,\,r_1 &amp;gt; r_2 &amp;gt; r_3 &amp;gt; r_4 &amp;gt; \cdots &amp;gt;r_n&amp;lt;/tex&amp;gt;&lt;br /&gt;
определена тем, что каждое &amp;lt;tex&amp;gt;r_k&amp;lt;/tex&amp;gt; — это остаток от деления предпредыдущего числа на предыдущее, а предпоследнее делится на последнее нацело, то есть&lt;br /&gt;
: &amp;lt;tex&amp;gt;a = b \cdot q_0 + r_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;b = r_1 \cdot q_1 + r_2&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;r_1 = r_2 \cdot q_2 + r_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;r_{k-2} = r_{k-1} \cdot q_{k-1} + r_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;\cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt;r_{n-1} = r_n \cdot q_n&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;\gcd(a, b) = r_n&amp;lt;/tex&amp;gt; {{---}} последний ненулевой член этой последовательности.&lt;br /&gt;
}}&lt;br /&gt;
'''Существование''' таких &amp;lt;tex&amp;gt;r_1, r_2, \cdots&amp;lt;/tex&amp;gt;, то есть возможность деления с остатком &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; для любого целого &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и целого &amp;lt;tex&amp;gt;n\ne 0&amp;lt;/tex&amp;gt;, доказывается индукцией по ''m''.&lt;br /&gt;
&lt;br /&gt;
'''Корректность''' этого алгоритма вытекает из следующих двух утверждений:&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=l1&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;a = b\cdot q + r&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;\gcd (a,b) = \gcd (b,r).&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=# Пусть  &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; — любой общий делитель чисел  &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt;, не обязательно максимальный, тогда &amp;lt;tex&amp;gt; a = t_1 \cdot k &amp;lt;/tex&amp;gt; ; &amp;lt;tex&amp;gt; b = t_2 \cdot  k &amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt; t_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; t_2 &amp;lt;/tex&amp;gt; — целые числа из определения.&lt;br /&gt;
# Тогда &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; также общий делитель чисел  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt;, так как  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; делится на  &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; по определению, а &amp;lt;tex&amp;gt;r = a - b \cdot q = (t_1 - t_2 \cdot  q)\cdot k  &amp;lt;/tex&amp;gt;  (выражение в скобках есть целое число, следовательно,  &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; делит  &amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt; без остатка)&lt;br /&gt;
# Обратное также верно и доказывается аналогично: пусть  &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; — любой общий делитель чисел  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt;, не обязательно максимальный, тогда &amp;lt;tex&amp;gt; b = t_1 \cdot k &amp;lt;/tex&amp;gt; ; &amp;lt;tex&amp;gt; r = t_2 \cdot k &amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt; t_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; t_2 &amp;lt;/tex&amp;gt; — целые числа из определения.&lt;br /&gt;
# Тогда &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; также общий делитель чисел  &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt;, так как  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; делится на  &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; по определению, а &amp;lt;tex&amp;gt;a = b \cdot q + r = (t_1 \cdot q + t_2)\cdot k  &amp;lt;/tex&amp;gt;  (выражение в скобках есть целое число, следовательно,  &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; делит  &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; без остатка)&lt;br /&gt;
# Следовательно, все общие делители пар чисел  &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt; совпадают. Другими словами, нет общего делителя у чисел  &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt;, который не был бы также делителем  &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt;, и наоборот.&lt;br /&gt;
# В частности, максимальный делитель остается тем же самым. Что и требовалось доказать.&lt;br /&gt;
}}&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=l2&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\gcd (0,r) = r&amp;lt;/tex&amp;gt; для любого ненулевого &amp;lt;tex&amp;gt;r.&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Далее, оценим асимптотику работы алгоритма.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм Евклида работает за &amp;lt;tex&amp;gt;O(\log \min (a, b))&amp;lt;/tex&amp;gt;  &lt;br /&gt;
}}&lt;br /&gt;
Доказательство этого факта&amp;lt;ref&amp;gt;[http://mathworld.wolfram.com/EuclideanAlgorithm.html Wolfram MathWorld {{---}} алгоритм Евклида]&amp;lt;/ref&amp;gt; достаточно громоздкое, поэтому не будем приводить его здесь.&lt;br /&gt;
&lt;br /&gt;
Проще сформулировать алгоритм Евклида так: если даны натуральные числа &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; и, пока получается положительное число, по очереди вычитать из большего меньшее, то в результате получится НОД.&lt;br /&gt;
&lt;br /&gt;
Таким образом, реализация стандартного алгоритма Евклида, достаточно проста:&lt;br /&gt;
 '''function''' euclideanGcd(a, b) :&lt;br /&gt;
     '''while''' b &amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt; 0 :&lt;br /&gt;
         t &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; b&lt;br /&gt;
         b &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; a mod b&lt;br /&gt;
         a &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; t&lt;br /&gt;
     '''return''' a&lt;br /&gt;
Мы получили очень простой алгоритм, который считает НОД за логарифмическое время. However, we can do better.&lt;br /&gt;
&lt;br /&gt;
===Двоичный алгоритм Евклида===&lt;br /&gt;
Идея улучшения: давайте вместо долгого деления ограничимся вычитаниями и битовыми сдвигами.&lt;br /&gt;
&lt;br /&gt;
Для начала, опишем еще несколько свойств &amp;lt;tex&amp;gt;gcd&amp;lt;/tex&amp;gt;:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=l3&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; — натуральные числа, тогда&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gcd(2 \cdot a, 2 \cdot b) = 2 \cdot \gcd(a, b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gcd(2 \cdot a, 2 \cdot b + 1) = \gcd(a, 2 \cdot b + 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\gcd(2 \cdot a + 1, 2 \cdot b + 1) = \gcd(\left|a - b\right|, 2 \cdot b + 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Тривиальным образом следует из определения&lt;br /&gt;
}}&lt;br /&gt;
Пользуясь этим, и утверждением [[#l2 | о НОДе нуля]], определим двоичный алгоритм Евклида (ниже будет дана рекурсивная реализация, для лучшей читаемости):&lt;br /&gt;
 '''function''' binaryGcd(a, b) :&lt;br /&gt;
     '''if''' a == b '''or''' b == 0 : &lt;br /&gt;
         '''return''' a&lt;br /&gt;
     '''if''' a == 0 : &lt;br /&gt;
         '''return''' b &lt;br /&gt;
     &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;// первые два случая&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''if''' a mod 2 = 0 :&lt;br /&gt;
         '''if''' b mod 2 = 0 : &lt;br /&gt;
             '''return''' binaryGcd(a / 2, b / 2) &amp;lt;tex&amp;gt;\cdot&amp;lt;/tex&amp;gt; 2&lt;br /&gt;
         '''else'''&lt;br /&gt;
             '''return''' binaryGcd(a / 2, b)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;// второй случай, только &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; поменяли местами&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''if''' b mod 2 = 0 : &lt;br /&gt;
         '''return''' binaryGcd(a, b / 2)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;// остается третий случай. На самом деле, мы можем оставлять справа и &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
     // поэтому давайте всегда оставлять меньшее&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''if''' a &amp;gt; b : &lt;br /&gt;
         '''return''' binaryGcd((a - b) / 2, b)&lt;br /&gt;
     '''return''' binaryGcd((b - a) / 2, a)&lt;br /&gt;
&lt;br /&gt;
Корректность данного алгоритма следует из того, что он на каждом шаге делает эквивалентные преобразования НОД(это следует из утверждений [[#l3 | о НОДе четных и нечетных]] и [[#l2 | о НОДе нуля]]).&lt;br /&gt;
&lt;br /&gt;
Можно показать&amp;lt;ref&amp;gt;http://maths-people.anu.edu.au/~brent/pd/rpb183pr.pdf Twenty years' analysis of the Binary Euclidean Algorithm&amp;lt;/ref&amp;gt;, что этот алгоритм, в среднем на 60% более эффективен, чем классический.&lt;br /&gt;
&lt;br /&gt;
===Расширенный алгоритм Евклида===&lt;br /&gt;
В стандартном алгоритме мы использовали следующее свойство: &amp;lt;tex&amp;gt;\gcd(a, b) = \gcd(b, a \bmod b)&amp;lt;/tex&amp;gt;. Воспользуемся им для того, чтобы решить следующую задачу: найти &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;a \cdot x + b \cdot y = \gcd(a, b)&amp;lt;/tex&amp;gt;. Пусть мы нашли пару &amp;lt;tex&amp;gt;x_1, y_1: \: b \cdot x_1 + (a \bmod b) \cdot y_1 = \gcd(a, b)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;a \bmod b = a - \lfloor \dfrac{a}{b}\rfloor \cdot b&amp;lt;/tex&amp;gt;. Получаем: &amp;lt;tex&amp;gt;b \cdot x_1 + (a \bmod b) \cdot y_1 = b \cdot x_1 + \left(a - \lfloor \dfrac{a}{b}\rfloor \cdot  b\right) \cdot y_1 = &lt;br /&gt;
b \cdot \left(x_1 - \lfloor \dfrac{a}{b}\rfloor \cdot  y_1\right) + a \cdot y_1 = a \cdot y_1 + b \cdot \left(x_1 - \lfloor \dfrac{a}{b}\rfloor \cdot  y_1\right)&amp;lt;/tex&amp;gt;. Следовательно, приходим к расширенному алгоритму Евклида:&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Алгоритм возвращает тройку &amp;lt;tex&amp;gt;\gcd, x, y&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' extendedGcd(a, b) : &lt;br /&gt;
     '''if''' b == 0 : &lt;br /&gt;
         '''return''' a, 1, 0&lt;br /&gt;
     gcd, &amp;lt;tex&amp;gt;x_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; extendedGcd(b, a mod b)&lt;br /&gt;
     x &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;y_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     y &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;x_1&amp;lt;/tex&amp;gt; - (a div b) &amp;lt;tex&amp;gt;\cdot&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;y_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''return''' gcd, &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;&lt;br /&gt;
Такое представление наибольшего общего делителя называется '''соотношением Безу''', а числа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; — '''коэффициентами Безу'''. Соотношение Безу является ключевым в доказательстве леммы Евклида и основной теоремы арифметики.&lt;br /&gt;
&lt;br /&gt;
== См. также==&lt;br /&gt;
* [[Разложение_на_множители_(факторизация) | Разложение на множители]]&lt;br /&gt;
* [[Простые_числа | Простые числа]]&lt;br /&gt;
* [[Основная_теорема_арифметики | Основная теорема арифметики]]&lt;br /&gt;
&lt;br /&gt;
== Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Категория: Теория чисел]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Greatest_common_divisor Wikipedia {{---}} Greatest common divisor]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Binary_GCD_algorithm Wikipedia {{---}} Binary GCD Algorithm]&lt;/div&gt;</summary>
		<author><name>188.65.244.35</name></author>	</entry>

	</feed>