WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 |   ...   | 2 | 3 || 5 |

«ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ: КРИПТОГРАФИЯ Институт проблем информационной безопасности МГУ О. Н. ВАСИЛЕНКО ТЕОРЕТИКО-ЧИСЛОВЫЕ АЛГОРИТМЫ В КРИПТОГРАФИИ МЦНМО, 2003 УДК 511+519.719.2 Издание осуществлено ...»

-- [ Страница 4 ] --

Пусть deg h0 (x) m. Тогда h0(x) L. Поскольку h0 (x) делит f(x), выполнено неравенство |h0 (x)| n + 1en|f(x)| (8.14) (доказательство этого неравенства см. в работе [183];

оно оценива ет величину коэффициентов многочлена-делителя через коэффициенты делимого). Применим теорему 7.8 к вектору =0 (h0 (x)) L =0 (L).

Поскольку = 0 и L Rm+1, то b1 2m/2| | = 2m/2|h0 (x)| 2m/2 n + 1en|f(x)|.

Отсюда |b1|n|f(x)|m 2mn/2 (n + 1)n/2 en |f|m+n.

224 Гл. 8. Факторизация многочленов над полем рациональных чисел Из (8.12) тогда получим, что |b1|n|f(x)|m < pkl, откуда следует (8.13).

Лемма 8.6. В обозначениях и условиях предыдущей леммы предположим дополнительно, что 1/n pkl t = max j |bj| < 1. (8.15) |f(x)|m Тогда deg h0 (x) = m + 1 - t и -1 (b1),..., -1 (bt) 0 h0 (x) = НОД, (8.16) p где наибольшее целое неотрицательное число, для которо — го p делит все коэффициенты НОД(-1(b1),..., -1 (bt)) Z[x].

0 Доказательство. Рассмотрим множество J = j | 1 j m + 1, pkl |bj| < =. По лемме 8.4 для j J h0 (x) | -1(bj). Пусть |f|m h1 (x) = НОДjJ (-1 (bj));

тогда h0 (x) | h1(x). Докажем, что J = {1,..., t} и что h0 (x) = ±h1(x) p, где из (8.16).

/ Поскольку deg -1 (bj) m для j = 1,..., m - 1, и многочлены -1 (bj) линейно независимы над Z, то |J| m + 1 - deg h1 (x). (8.17) Далее, |h0 (x) · xj| = |h0(x)| n + 1en|f(x)| всилу(8.14), и для i = 0, 1,...

..., m - deg h0 (x) многочлены h0 (x) · xi содержатся в L и линейно независимы. Тогда по теореме 7.10 при j = 1, 2,..., m + 1 - deg h0 (x) выполнены неравенства |bj| 2m/2 max{|0 (h0 (x))|, |0 (h0 (x) · x)|,..., |0 (h0 (x) · xm-deg h0 (x))|} = = 2m/2|0(h0 (x))| = 2m/2|h0 (x)| 2m/2 n + 1en|f(x)|.

Отсюда, аналогично доказательству предыдущей леммы, получим |bj|n|f(x)|m pkl (8.18) для j = 1,..., m + 1 - deg h0 (x). Поэтому 1, 2,..., m + 1 - deg h0 (x) J.

Следовательно, m + 1 - deg h0 (x) |J| m + 1 - deg h1 (x);

значит, deg h1 (x) deg h0 (x). Поскольку h0 (x)|h1 (x) в Z[x], то h1 (x) = dh0 (x), где d Z, d = 0. (8.19) § 8.4. LLL-алгоритм факторизации: подъем разложения Мы доказали, что |J| = m + 1 - deg h0 (x), J = {1,..., m + 1 - deg h0 (x)}, и что t = |J|, т. е. deg h0 (x) = m + 1 - t.

Теперь докажем, что h1 (x) в (8.19) является почти примитивным, т. е. наибольший общий делитель его коэффициентов может быть равен лишь некоторой степени числа p;

из этого будет следовать (8.16). Пред положим противное, т. е. что найдется простое число q, q = p, такое, что h1 (x) q Z[x]. По определению h1 (x) получим, что вектор b1 лежит / q в L, та к ка к 1 J. Пусть b1 = (b10,..., b1m) Zm+1. Тогда b1i = qb, 1i где b Z, i = 0,..., m. Та к ка к b1 L, то 1i m h(x) (mod pk) q b xi (mod pk).

1i i= Поскольку q = p, то отсюда следует, что m h(x) (mod pk) b xi (mod pk), 1i i= т. е. (b,..., b ) L. Но это невозможно, так как b1 является элемен 10 1m том базиса решетки L.

§ 8.4. LLL-алгоритм факторизации:

подъем разложения В этом параграфе мы покажем, как соотношение u0 (x)v0 (x) w(x) (mod pm), где p простое число, m N, u0 (x), v0 (x), w0 (x) Z[x], может быть — преобразовано в соотношение u2 (x)v2 (x) w(x) (mod pm ) для некоторых эффективно вычислимых многочленов u2 (x), v2 (x) Z[x] и некоторого m1 > m.

В этом параграфе штрих не является знаком производной, а служит для обозначения какого-либо другого многочлена.

Для начала рассмотрим произвольное поле K. Пусть g(x), h(x) K[x], deg g(x) deg h(x) 1, d(x) = НОД(g(x), h(x)).

Алгоритм 1.

На входе алгоритма заданы u(x), v(x) Z[x]. На выходе получается представление u(x)g(x) + v(x)h(x) = d(x).

15 О. Н. Василенко 226 Гл. 8. Факторизация многочленов над полем рациональных чисел 1 шаг. Присвоить (u1, u2, u3) := (1, 0, g(x)), (v1, v2, v3) := (0, 1, h(x)).

2 шаг. Если v3 = 0, то выдать значение u(x) = u1, v(x) = u2, d(x) = u и закончить работу.

3 шаг. Разделить с остатком:

u3 = qv3 + r, deg r < deg v3.

4 шаг. Присвоить (t1, t2, t3) := (u1, u2, u3) - q(v1, v2, v3), (u1, u2, u3) := := (v1, v2, v3), (v1, v2, v3) := (t1, t2, t3) и вернуться на 2 шаг.

Конец алгоритма.

Легко видеть, что найденные многочлены u(x), v(x), d(x) дей ствительно удовлетворяют равенству u(x)g(x) + v(x)h(x) = d(x) = = НОД(g(x), h(x)). Это проверяется в точности так же, как в обычном алгоритме Евклида для целых чисел (см. Приложение). Можно пока зать (см. [25, § 4.6.1, упр. 3]), что deg v(x) < deg g(x), deg u(x) < deg h(x).

Теперь рассмотрим поле K = Z pZ.

/ Алгоритм 2.

На входе задано простое число p, j N, многочленыa(x), b(x), c(x), gj (x), hj(x) Z pZ[x], такие, что старший коэффициент hj (x) обратим / в Z pjZ и a(x)gj (x) + b(x)hj (x) = 1 в Z pjZ[x]. На выходе получаем / / многочлены a (x), b (x) Z pjZ такие, что a (x)gj (x) + b (x)hj (x) = c(x) / в Z pjZ[x], и при этом deg a (x) < deg hj(x).

/ 1 шаг. Ввиду обратимости старшего коэффициента hj (x) можно произвести деление с остатком:

a(x)c(x) = hj (x) · q(x) + r(x), deg r(x) < deg hj (x).

2 шаг. Присвоить a (x) := r(x), b (x) := b(x)c(x) + gj (x)q(x).

Конец алгоритма.

Корректность работы алгоритма следует из равенств gj (x)a (x) + hj (x)b (x) = = gj (x)(a(x)c(x) - hj (x)q(x)) + hj (x)(b(x)c(x) + gj (x)q(x)) = = c(x)(gj (x)a(x) + hj(x)b(x)) = c(x).

Лемма 8.7. Пусть p простое число, j N, t(x) Z p2jZ[x].

— / Пусть gj (x), hj(x) Z pjZ[x], t(x) gj (x)hj (x) (mod pj), старший / коэффициент hj (x) обратим в Z pjZ[x] и существуют много / члены aj(x), bj(x) Z pjZ[x] такие, что aj(x)gj (x) + bj (x)hj (x) = / § 8.4. LLL-алгоритм факторизации: подъем разложения в Z pjZ[x]. Тогда можно определить многочлены a2j (x), b2j (x), / g2j (x), h2j (x) Z p2jZ[x] такие, что / t(x) g2j (x)h2j (x) (mod p2j), a2j (x)g2j (x) + b2j (x)h2j (x) = 1 в Z p2jZ[x], / g2j (x) gj (mod pj), h2j (x) hj(x) (mod pj), deg h2j (x) = deg hj (x).

Доказательство. Определим многочлен cj (x) Z pjZ[x] при по / мощи равенства t(x) - gj (x)hj (x) = pjcj (x).

С помощью алгоритма 2 вычислим a (x), b (x) такие, что j j a (x)gj (x) + b (x)hj (x) = cj(x) в Z pjZ[x], dega (x) < deg hj (x).

/ j j j Положим g2j (x) = gj (x) + pjb (x), h2j (x) = hj (x) + pja (x), g2j (x), h2j (x) j j Z p2jZ[x]. Тогдаочевидно, что degh2j (x) = deghj (x) и что g2j (x) gj (x) / (mod pj), h2j (x) hj (x) (mod pj). Далее, g2j (x)h2j (x) gj (x)hj (x) + pj(a (x)gj (x) + b (x)hj (x)) (mod p2j) j j t(x) - pjcj (x) + pjcj (x) (mod p2j) t(x) (mod p2j).

Определим многочлен c1j (x) Z pjZ[x] ра венством / g2j (x)aj (x) + h2j(x)bj (x) = 1 + pjc1j(x) в Z p2jZ[x].

/ С помощью алгоритма 2 найдем a (x), b (x) такие, что в Z pjZ[x] вы / j j полнено равенство gj (x)a (x) + hj(x)b (x) = c1j (x).

j j Положим a2j (x) = aj (x) - pja (x) Z p2jZ[x], / j b2j (x) = bj (x) - pjb (x) Z p2jZ[x].

/ j Тогда g2j (x)a2j (x) + h2j (x)b2j (x) = g2j (x)aj (x) + h2j (x)bj (x) - pjc1j(x) = в Z p2jZ[x]. Лемма доказана.

/ Замечание 8.8. В лемме описан квадратичный подъем, т. е. переход от соотношений по модулю pj к соотношениям по модулю p2j. Можно 15* 228 Гл. 8. Факторизация многочленов над полем рациональных чисел описать также линейный подъем, т. е. переход от соотношений по мо дулю pj к соотношениям по модулю pj+1 (см. [1, гл. 6;

89, гл. 3]).

Однако если мы хотим получить из соотношений по модулю p соотно шения по модулюpk, где k достаточно велико, то лучше использовать квадратичный подъем, так как он быстрее приведет нас к требуемому результату.

§ 8.5. LLL-алгоритм факторизации:

полное описание Теперь мы можем детально описать LLL-алгоритм факторизации многочленов в кольце Z[x].

Алгоритм (LLL-факторизация).

На входе алгоритма задан примитивный многочлен f0 (x) Z[x], deg f0 = n0 > 1. На выходе получается разложение f0(x) на неприводи мые множители в Z[x].

1 шаг. Вычисляем g(x) = НОД(f0 (x), f0(x)) Z[x], где f0 (x) про — f0 (x) изводная. Полагаем f(x) =. Заметим, что, если g(x) 1 k f0 (x) = f1(x)... fk(x) (8.20) разложение f0 (x) на неприводимые множители в Z[x], то оно же — есть разложение f0 (x) на неприводимые множители в Q[x] (см. лемму 1- k-1- 8.2). Поэтому g(x) = f1 (x)... fk (x) есть примитивный много член, и его можно найти с помощью алгоритма Евклида в Q[x]. Тогда f(x) = f1 (x)... fk (x) многочлен, не имеющий кратных неприводимых — множителей.

Обозначим n = deg f(x). Далее мы считаем, что n 2 (f(x) неприво дим при n = 1 и f0 (x) = f(x), где = deg f0(x)).

2 шаг. Вычисляем результант Res(f, f ) Z;

Res(f, f ) = 0 (та к ка к f и f взаимно просты). Определение и свойства результанта см. в [9, гл. 5].

3 шаг. Находим наименьшее простое число p, такое, что p Res(f, f ).

Тогда p не делит старший коэффициент f(x), и f(x) (mod p) Z pZ[x] / не имеет кратных неприводимых делителей. Можно доказать (см. [160]), что p удовлетворяет неравенству n log n + (2 - 1) log |f| p max 101,, 0, поэтому мы быстро найдем его, перебирая все простые числа подряд.

§ 8.5. LLL-алгоритм факторизации: полное описание 4 шаг. Раскладываем f(x) (mod p) в Z pZ[x] на неприводимые уни / тарные множители с помощью алгоритма Берлекэмпа. Пусть S спи — сок этих множителей. Заводим список S1 неприводимых делителей f(x) в Z[x], S1 :=. Пола га емF(x) = f(x), N = deg f(x). Если |S| = 1, то f(x) неприводим в Z[x] (так как неприводим в Z pZ[x]).

/ 5 шаг. Берем какой-либо многочлен h (x) S;

пусть deg 1(x) = l (мы считаем, что |S| 2). Пусть F(x) = 1(x)1 (x) (mod p). Посколь ку 1(x) и g1 (x) взаимно просты в Z pZ[x], с помощью алгоритма / из §8.4 находим представление u(x)1(x) + v(x)g1 (x) = 1 в Z pZ[x], / где deg u(x) < deg g1 (x), deg v(x) < deg h (x). Находим минимальное на туральное число k такое, что 2 pkl > 2N /2 (N + 1)N/2eN |F(x)|2N.

6 шаг. С помощью метода доказательства леммы 8.7 из §8. (применяемого последовательно несколько раз), находим многочлен h1 (x) Z pkZ[x], такой, что / h1(x) (mod pk) | F(x) (mod pk), deg h1 (x) = deg h (x), старший коэффициент h1 (x) обратим по моду лю pk. Если в качестве коэффициентов h(x) Z pkZ[x] рассматри / вать наименьшие неотрицательные вычеты элементов Z pkZ, то можно / считать, что h(x) Z[x]. Тогда для многочлена h1 (x) выполнены свой ства Б), В) и Г) из §8.2. Домножив h1 (x) Z pkZ[x] на некоторый / элемент a (Z pkZ), a 1 (mod p), можно обеспечить и условие А).

/ 7 шаг. Перебирая последовательно значения N - 1 N - N - m =,,...,, N - 1, 2N 2N-1 будем для них выполнять шаг 8, переходя к шагу 9, как только найдем h0 (x) Z[x], h0 (x) | F(x). Если делитель не будет найден для всех m, то F(x) неприводим в Z[x] (это будет следовать из леммы 8.5).

8 шаг. Для данного m рассматриваем множества L Z[x], L =0(L) Zm+1, определенные в §8.3. По ба зису {0(pkxi) | 0 i l - 1}{0(h1 (x)xi) | 0 i m - l} решетки L находим приведенный базис b1,..., bm+1. Если выполняется неравенство 1/N pkl |b1| <, (8.21) |F(x)|m 230 Гл. 8. Факторизация многочленов над полем рациональных чисел то выполнены условия леммы 8.6. Тогда положим НОД(-1 (b1),..., -1 (bt)) 0 h0 (x) =, p где t и из той же леммы. Мы нашли многочлен h0 (x) Z[x], яв — ляющийся неприводимым делителем F(x). Заносим h0(x) в список S и идем на 9 шаг. Если же (8.21) не выполнено, то переходим к следу ющему значению m.

9 шаг. Полагаем N := deg(F(x) h0 (x)), F(x) = F(x) h0(x) и из мно / / жества S удаляем делители многочлена h0 (x) (mod p) (которые мы на ходим путем переборапо множеству S). Если N > 1и|S| > 1, то возвра щаемся на 5 шаг. Если N = 0 или N = 1 или |S| = 1, то многочлен F(x) неприводим (или F(x) = 1). Тогда мы добавляем F(x) в список S1 (если N > 0) и переходим на 10 шаг.

10 шаг. Теперь список S1 состоит из многочленов f1 (s),..., fk (x) (см. формулу (8.20)). Пробными делениями находим показатели 1 k 1,..., k и выдаем разложение f0 (x) = f1 (x)... fk (x).

Конец алгоритма.

Корректность алгоритма легко следует из доказанных в §8.2 8. — утверждений.

Теорема 8.9 (см. [160]). Алгоритм раскладывает f0 (x) на непри водимые множители за O(n6 + n5 log |f|) арифметических опе раций.

Замечание 8.10. В книге [38] приведено развернутое описание LLL-алгоритма факторизации многочленов, а также блок-схемы вспо могательных и основного алгоритмов.

§ 8.6. Практичный алгоритм факторизации Вкниге [89, § 3.5.5] отмечено, что хотя описанный в §8.5 алгоритм имеет полиномиальную сложность от длины входа, все же на практике он работает довольно медленно. В главе 3 этой книги приведен алго ритм факторизации, который, хотя и имеет экспоненциальную оценку сложности, на практике работает гораздо быстрее LLL-алгоритма. Мы вкратце опишем здесь его схему.

Алгоритм факторизации в Z[x].

На входе примитивный многочлен f0(x) Z[x], который мы хотим разложить на неприводимые множители.

§ 8.6. Практичный алгоритм факторизации 1 шаг. Как и в LLL-алгоритме из §8.5, мы сводим задачу фак торизации f0(x) к задаче факторизации примитивного многочлена f(x) Z[x], не имеющего кратных неприводимых делителей.

2 шаг. Находим наименьшее простое число p, для которого НОД(f(x) (mod p), f (x) (mod p)) =1вZ pZ[x]. С помощью какого-либо / из алгоритмов, описанных в гл. 6, находим разложение f(x) на непри водимые множители в Z pZ[x] (это разложение будет бесквадратным).

/ 3 шаг. Если h(x) Z[x], h(x) | f(x), то можно оценить максимум мо дулей коэффициентов h(x) некоторой величиной B, за висящей от f(x) (см. [89, теорема 3.5.1] или формулу (8.14) из §8.3, следующую из ра боты [183]). Находим B и затем находим наименьшее e N, такое, что pe > 2l(f)B, где l(f) обозначает старший коэффициент f(x) (l(f) N).

Положим n0 = deg f(x). Заводим список S1 неприводимых делителей f(x), S1 :=.

4 шаг. Используя результаты §8.4, находим разложение f(x) = l(f)g1 (x)... gr (x) (mod pe) в кольце Z peZ[x].

/ Присваиваем d := 1, S := {g1(x),..., gr (x)}.

5 шаг. На этом шаге мы рассматриваем всевозможные комбинации G(x) = gi (x)... gi (x) (mod pe).

1 j Мы вычисляем для каждой из них однозначно определенный многочлен G(x) Z[x] такой, что:

1 1) коэффициенты G(x) принадлежат полуинтервалу - pe;

pe ;

2 2) G(x) l(f)G(x) (mod pe), если deg G(x) deg f(x), и G(x) f(x) G(x) (mod pe), если deg G(x) > deg f(x).

/ Если G(x) делит l(f)f(x), то мы выносим наибольший общий делитель коэффициентов G(x) и получаем неприводимый прими тивный многочлен G1 (x), делящий f(x) в Z[x]. Мы заносим его в список S1 неприводимых делителей f(x), удаляем соответствующие gi (x),..., gi (x) из списка S и за меняем f(x) на f(x) G1(x).

/ 1 j 6 шаг. Мы увеличиваем d на1, т. е. d := d + 1. Если d n0 2, то воз / вращаемся на 5 шаг. Если же d > n0 2, то оставшийся после выпол / нения 5 шага многочлен f(x) будет неприводимым, и мы добавляем его в список S1 (если он не равен константе).

Конец алгоритма.

Замечание 8.11. Дальнейшие детали см. в [89, § 3.5.4]. Аналогич ные методы факторизации описаны в [1, гл. 6] и [25, § 4.6.2].

232 Гл. 8. Факторизация многочленов над полем рациональных чисел § 8.7. Факторизация многочленов с использованием приближенных вычислений В данном параграфе мы опишем два алгоритма из работы [160].

Один из них находит минимальный многочлен алгебраического чис ла, а второй раскладывает на неприводимые множители многочлены из Q[x] и Z[x]. В этих алгоритмах также используются LLL-приведен ные базисы решеток в сочетании с приближенным вычислением корней многочленов.

Напомним, что число C называется алгебраическим, если оно является корнем некоторого многочлена h(x) из Q[x], не равного тождественно нулю. Можно считать, что h(x) Z[x], h(x) неприво дим и примитивен. В этом случае h(x) называется минимальным многочленом, его степень deg h(x) называется степенью deg алгебраического числа, корни h(x) называются сопряженными с алгебраическими числами, максимум модулей коэффициентов h(x) называется высотой алгебраического числа.

m Для многочленов g(x) = gixi Q[x] мы будем обозначать i= |g(x)| = max |gi|.

i=0,...,m Норма многочлена |g(x)| та же, что и в §8.1.

В этом параграфе нам понадобятся решетки неполного ранга, т. е.

множества =Zb1 +... + Zbk Rn, где k n и векторы b1,..., bk ли нейно независимы. В таких решетках приведенные базисы определяют ся та к же, ка к и в случа е k = n, и существует полиномиальный алгоритм их построения, см. [160]. При этом выполняется неравенство |v1| 2(k-1)/2|w| (8.22) для всех w, w = 0 (см. [160]);

здесь v1 первый вектор из приве — денного базиса решетки.

Пусть алгебраическое число, которое известно нам лишь при — ближенно;

d и H известные оценки сверху для степени и высоты.

— Тогда достаточно хорошее приближение к числу позволит нам найти минимальный многочлен h(x) для.

Если фиксировано, то можно найти приближения i к сте пеням i. Пусть они также фиксированы. Тогда для многочленов g(x) = g = gixi C[x] через g мы будем обозначать сумму i g = gi i. (8.23) i § 8.7. Факторизация многочленов с использованием приближенных вычислений Зафиксируем n, 1 n d, и s N. Рассмотрим решетку Ls в Rn+3, порожденную строками матрицы 1... 0 2s Re 0 2s Im..............................

(8.24) 0... 1 2s Re n 2s Im n размера (n+1) (n+3). Эти строки мы будем обозначать b1,..., bn+ n Rn+3. Для многочлена g = g(x) = gixi Z[x] обозначим через i= n g = gibi Ls. (8.25) i= Легко видеть, что n 2 n 2 |g|2=g0+...+gn+22s Re gi i + Im gi i =|g(x)|2+22s|g |2.

i=0 i= Очевидно, что формула (8.25) задает взаимно однозначное соответствие между многочленами из Z[x] степени не выше n и векторами решет ки Ls.

Идея метода нахождения минимального многочлена h(x) для за ключается в следующем. Пусть n = deg h(x) = deg. Тогда для всех многочленов g(x) Z[x], deg g(x) n, таких, что g( ) = 0, будет вы полнено неравенство |g|2 > 2n|h|2, (8.26) если мы подходящим образом выберем значение s и если величины | i - i| достаточно малы. Найдем приведенный базис Ls. Пусть v — первый его вектор, и v(x) соответствующий ему (по формуле (8.25) — многочлен. Поскольку h Ls, то в силу (8.22) ||2 2n|h|2.

Тогда из (8.26) следует, что v( ) = 0, откуда h(x) | v(x). Посколь ку deg v(x) n = deg h(x), то v(x) = h(x) · c, где c Z. Так как v — из базиса решетки Ls и h Ls, то c = ±1, v(x) = ±h(x) искомый — минимальный многочлен.

Теперь приступим к аккуратному описанию и обоснованию метода.

Лемма 8.12. Пусть, 0,..., n C, 0 = 1, | i - i|, i = 1,..., n.

Пусть f(x) C[x], degf(x) n. Тогда |f( ) - f | n|f|.

234 Гл. 8. Факторизация многочленов над полем рациональных чисел Доказательство. Вса мом деле n |f( ) - f | = ai ( i - i) n |f|.

i= Лемма доказана.

\ Лемма 8.13. Пусть h(x), g(x) Z[x] {0}, deg h(x) = n, deg g(x) = = m. Пусть C, | | 1, h( ) = 0. Если h(x) неприводим и g( ) = 0, то выполнено неравенство |g( )| |h(x)|-m|g(x)|-n+1.

n Доказательство. Если m = 0, то неравенство очевидно. Пусть m 1. Рассмотрим матрицу M размера (n + m) (n + m), у которой i-й столбец составляют коэффициенты многочлена xi-1h(x) при 1 i m, и коэффициенты многочлена xi-m-1g(x) при m + 1 i n + m. Пусть R = | det M| = | Res(h(x), g(x))|. Тогда по свойству результанта R = 0, так как h(x) неприводим и g( ) = 0. При i = 2,..., n + m прибавим i-ю строку матрицы M, умноженную на xi-1, к первой строке и затем раскроем определитель M по первой строке. Получим равенство R = |h(x)(a0 + a1x +... + am-1xm-1) + g(x)(c0 +... cn-1xn-1)|, где ai, cj определители миноров M. При x = получим R = — = |g( )||co +... + cn-1 n-1|. В силу неравенства Адамара для опре делителей матриц |cj| |h(x)|m|g(x)|n-1.

Так как | | 1, то |c0 +... + cn-1 n-1| n|h(x)|m|g(x)|n-1. Теперь из неравенства R 1 следует утверждение леммы.

Лемма 8.14. Пусть s N, алгебраическое число, | | 1, — h(x) минимальный многочлен, deg h(x) = d 1, высота h(x) — не превосходит H. Пусть 0,..., d C, 0 = 1, | i - i| при 2s 1 i d. Пусть g(x) Z[x], deg g(x) d, g( ) = 0. Предположим, что выполнено неравенство (3d+4) / 2s 2d /2 (d + 1) H2d. (8.27) Тогда (в обознач ениях (8.25)) |h| < (d + 1)H, |g| > 2d/2(d + 1)H.

Доказательство. Очевидно, что для любого многочлена f(x) C[x], deg f(x) d, выполнено неравенство |f(x)|2 (d + 1)|f(x)|2. Поскольку § 8.7. Факторизация многочленов с использованием приближенных вычислений |h|2 = |h(x)|2 + 22s|h |2, и по лемме 8.12 |h | = |h( ) - h | 2-sdH, то |h|2 |h(x)|2 + d2H2 (d + 1)H2 + d2H2 < (d + 1)2H2.

Теперь докажем неравенство для |g|. Если |g(x)| > 2d/2(d + 1)H, то из равенства |g|2 = |g(x)|2 + 22s|g |2 следует требуемое неравенство.

Допустим, что |g(x)| 2d/2 (d + 1)H. По лемме 8.13 тогда 1 1 1 1 1 |g( )| · · · · > d d |h(x)|d |g(x)|d-1 ((d + 1)H2)d/2 (2d/2 (d + 1)H)d- d > 2-d(d-1)/2 · (d + 1)- H-2d+1.

Поэтому |g| 2s|g | 2s(|g( )| -|g( ) - g |) > - d > 2s (2-d(d-1)/2 (d + 1) H-2d+1 - 2-sd|g(x)|) = d(d-1) - d = 2s- (d + 1) H-2d+1 - d|g(x)|.

Так как |g(x)| |g(x)| 2d/2 (d + 1)H, то d2 s- - d 2 |g| > H · 2d/2 (2 (d + 1) H-2d - d(d + 1)), откуда с учетом (8.27) получим требуемое неравенство |g| > > H · 2d/2 (d + 1).

Теорема 8.15. Пусть s,, h(x), d, h и числа i 2-sZ[ -1], i = 0,..., d, удовлетворяют условиям леммы 8.14, включая нера венство (8.27). Пусть n N, 1 n L, и пусть LLL-алгоритм построения приведенного базиса, примененный к векторам b1,..., bn+1, являющимися строками матрицы (8.24), дает приве n денный базис с первым вектором v = vibi. Тогда три следующих i= условия эквивалентны:

1) |v| 2d/2 (d + 1)H;

n 2) корень многочлена v(x) = vixi;

— i= 3) deg n.

Далее, если deg = n, то h(x) = ±v(x).

Доказательство. По формуле (8.22) выполняется неравенство |v| 2n/2|w| для всех w Ls = Zb1 +... + Zbn+1, w = 0. Пусть вы полнено первое условие теоремы. Тогда из леммы 8.14 следует, что v( ) = 0.

236 Гл. 8. Факторизация многочленов над полем рациональных чисел Очевидно, что из второго условия следует третье. Пусть выпол нено третье условие. Тогда deg h(x) n, поэтому h вектор из Ls.

— По лемме 8.14 имеем |h| < (d + 1)H. Тогда из (8.22) следует, что || 2n/2 (d + 1)H, т. е. из третьего условия следует первое.

Наконец, пусть deg = n. Тогда в силу доказанного v( ) = 0. Так как h(x) неприводим, то из леммы Гаусса (см. §8.1) следует, что h(x) делит v(x) в Z[x];

v(x) = h(x) · l, где l Z. Отсюда = h · l. Та к ка к v — из базиса решетки Ls и h Ls, то l = ±1.

Алгоритм 1 (нахождение минимального многочлена).

На входе алгоритма заданы верхние оценки d и H для степени вы и соты алгебраического числа, | | 1;

приближение Q + -1Q, | | 1, такое, что | - | 2-s (4d), где s минимальное натуральное / — число, удовлетворяющее неравенству (3d+4) / 2s 2d /2 (d + 1) H2d.

На выходе минимальный многочлен.

— для 1 шаг. Вычисляем i 2-s (Q + -1Q), i = 0,..., d, такие, что 0 = 1, | i - i| 2-s-, 1 i d. Для этого округляем вещественную и мнимую части числа i до s битов после запятой. Заметим, что тогда | i - i| 2-s, поскольку | i - i| | i - i| + | i - i| i- 1 -s- 2-s -s- 2 | - | · | |j| |i-1-j + 2 · d + 2.

4d 2s j= Это означает, что выполнено условие теоремы 8.15.

2 шаг (цикл). Для n = 1, 2,..., d выполняем шаги 3 и 4, пока не найдем минимальный многочлен для.

3 шаг. Применяя LLL-алгоритм, находим приведенный базис ре шетки Ls = Zb0 +... + Zbn, порожденной строками матрицы (8.24).

4 шаг. Если первый вектор v приведенного базиса удовлетворя n ет неравенству |v| 2d/2 (d + 1)H, то выдаем многочлен v(x) = vixi n i= где v = vibi в качестве минимального многочлена для.

i= Конец алгоритма.

Корректность алгоритма следует из теоремы 8.15.

Замечание 8.16. Неравенство | | 1 не является серьезным огра ничением. Если | | > 1 и корень многочлена h(x) то 1 корень — / — § 8.7. Факторизация многочленов с использованием приближенных вычислений 1 многочлена xdeg h(x) · h, < 1. При этом, если приближение — x к, | - |, где 0 <, и приближение к 1, | - 1 |, то — / / 1 1 - - - + +.

| | 1 Поскольку | | | | -| - | | | -| |, то | - | 3, т. е. при ближает 1 с точностью3.

/ Теорема 8.17 (см. [143]). Пусть алгебраическое число, d — иH оценки на степень и высоту, приближение к такое, — — 2-s что | - |, где s минимальное натуральное число, для ко — 12d торого выполнено неравенство (8.27). Тогда алгоритм 1 находит минимальный многочлен для за O(d5 (d + log H)) арифметических операций с целыми числами, имеющими величину O(d2 (d + log H)) битов.

Теперь перейдем к факторизации многочленов. Пусть f(x) Z[x] — фиксированный примитивный многочлен, deg f(x) = d 2, и мы хотим разложить f(x) на неприводимые множители в Z[x]. Если h(x) Z[x], h(x) делитель f(x), deg h(x) = n, то высота h(x) не превосходит — n - 1 n - |f(x)| + |ad| при всех j = 1,..., n - 1, где ad старший — j j - коэффициент f(x) (см. [25, упр. 4.6.2.20;

89, теорема 3.5.1]). Отсюда, считая, что n d 2 (если f(x) приводим), мы можем выбрать оценку H / сверху для коэффициентов искомого h(x), которая понадобится для применения алгоритма 1.

Алгоритм 2 (факторизация f(x) в Z[x]).

На входе алгоритма заданы f(x), d, H. Алгоритм последовательно выдает неприводимые делители f(x), пока полностью не разложит f(x) на множители в Z[x].

1 шаг. Если d 1, то f(x) неприводим, и алгоритм заканчивает ра боту.

2 шаг. Найдем наименьшее s N такое, что (3d+4) / 2s 2d /2 (d + 1) H2d.

3 шаг. Вычислим (каким-либо способом) такое приближение 2-s Q + iQ к некоторому корню многочлена f(x), что | - | 12d 2-s если | | 1, то достаточно выполнения неравенства | - |.

4d 238 Гл. 8. Факторизация многочленов над полем рациональных чисел 4 шаг. Применяя алгоритм 1, находим минимальный многочлен h(x) для алгебраического числа.

5 шаг. Пробными делениями находим наибольшее k N такое, что h(x)k | f(x), и выдаем h(x) и k. Этот шаг можно не делать, ес ли многочлен f(x) бесквадратен;

бесквадратность можно обеспечить так же, как в алгоритме из §8.5.

6 шаг. Заменяем d на d - k deg h(x), f(x) на f(x) h(x)k и возвра ща / емся на 1 шаг.

Конец алгоритма.

Корректность алгоритма 2 очевидна. Оценим его сложность. Нам осталось выбрать метод приближенного вычисления корней многочле на из Z[x] на 3 шаге алгоритма 2. Существуют различные методы для решения этой задачи, см. [6;

89, гл. 3]. В частности, существуют алго ритмы, имеющие полиномиальную сложность от d, log |f(x)| и количе ства требуемых битов, см. [143;

242]. Использование этих алгоритмов позволяет указать полиномиальную оценку сложности и для алгорит ма 2 (см. [143, теорема 3.7]).

§ 8.8. Заключение Появление в начале 80-х годов XX века LLL-алгоритма для факто ризации многочленов из Z[x] с полиномиальной сложностью от длины входа вызвало огромный интерес у математиков во всем мире. До сих пор сложность имеющихся алгоритмов для факторизации целых чисел гораздо хуже, как мы видели в гл. 2 4. LLL-приведенные базисы ре — шеток нашли применение во многих задачах математики;

часть из них была описана в гл. 7. Дальнейшее развитие метода работы [160] было получено в ряде работ отечественных авторов, см., например, [21;

43].

Кроме описанных в данной главе алгоритмов факторизации много членов из Z[x] и Q[x] имеются алгоритмы факторизации многочленов с коэффициентами из числовых полей, см., например, [89, гл. 3].

В последние годы появились работы, связанные с применением LLL-приведенных базисов в алгоритмах решета числового поля для факторизации и дискретного логарифмирования, см., например, [204].

В основном это применение относится к оптимальному выбору много членов, порождающих числовые поля.

Глава 9. Дискретное преобразование Фурье и его приложения § 9.1. Введение. Дискретное преобразование Фурье и его свойства Дискретное преобразование Фурье имеет важные приложения в тео рии чисел и алгебре. Оно подробно описано во многих книгах, см., на пример, [5;

37]. Мы не претендуем здесь на полноту изложения. Будут описаны лишь некоторые основные свойства и некоторые важные при ложения дискретного преобразования Фурье. В частности, будет до казана теорема, необходимая для обоснования алгоритма Полларда — Штрассена из главы 2;

ее доказательство взято из работы [271].

Введем некоторые обозначения. Пусть t N, n = 2t. Пусть R ком — мутативное кольцо с единицей 1, содержащее 2-1 элемент, обратный — к 2. Пусть также R содержит элемент 2n некоторый фиксированный — корень уравнения уравнения xn + 1 = 0. Положим n = 2.

2n Лемма 9.1. Элемент 2n порождает в мультипликативной группе обратимых элементов кольца R циклическую подгруппу порядка 2n.

t Доказательство. Та кка к 2 = -1, то мультипликативный порядок 2n элемента 2n равен 2t+1 = 2n.

Определение 9.2. Пусть (f0,..., fn-1) Rn произвольный вектор.

— Дискретным преобразованием Фурье 1-го типа для этого век тора называют n-мерный вектор (f,..., f ) Rn, определяемый ра 0 n- венствами n- f = ijfj, i = 0,..., n - 1.

i n j= Дискретным преобразованием Фурье 2-го типа называют n-мерный вектор (f, f,..., f ) Rn, определяемый равенствами 1 3 2n- n- ij f = 2nfj, i = 1, 3,..., 2n - 1.

i j= 240 Гл. 9. Дискретное преобразование Фурье Замечание 9.3. Элементы f являются значениями многочлена i n- F(x) = fjxj R[x] в точках x = i ;

элементы f являются значениями i n j= многочлена F(x) в точках x = i при нечетных i.

2n В следующей лемме содержатся формулы обращения для преобра зования Фурье.

Лемма 9.4. Справедливы следующие равенства:

n- fi = n-1 f -ij,(9.1) j n j= -ij fi = n-1 f 2n,(9.2) j 1 j 2n- j нечетно — где n-1 = (2-1)t R.

-k 2nr-k Доказательство. Пусть k Z. Тогда 2n = 2n, где r Z, 2nr - k 0. Кроме того, поскольку мультипликативный порядок элемен та n равен n, то справедливы равенства n- lj = n при l 0 (mod n), (9.3) n j= n- lj = 0 при l 0 (mod n). (9.4) n j= Равенство (9.1) выполняется, поскольку n-1 n-1 n-1 n-1 n- ( f -ij = fk jk -ij = fk nk-i)j = nfi j n n n j=0 j=0 k=0 k=0 j= в силу (9.3) и (9.4).

Справедливость (9.2) следует из n- -ij -i(2k+1) f 2n = f 2n = j 2k+ 1 j 2n-1 k= j нечетно — n-1 n-1 n-1 n- l(2k+1) -i(2k+1) l-i ( = fl 2n 2n = fl 2n nl-i)k.

k=0 l=0 l=0 k= Сучетом (9.3) и (9.4) получаем равенство (9.2).

§ 9.2. Вычисление дискретного преобразования Фурье Заметим, что вычисление дискретного преобразования Фурье непо средственно по формулам (9.1) и (9.2) требует O(n2) операций сложения и умножения в кольце R. В следующем параграфе мы приведем ме тод, который позволяет вычислить дискретное преобразование Фурье за O(n log n) операций. Этот метод называется быстрым преобразо ванием Фурье.

§ 9.2. Вычисление дискретного преобразования Фурье В этом параграфе мы сохраняем обозначения и предположения из §9.1.

Теорема 9.5. Дискретное преобразование Фурье (f,..., f ) 0 n- может быть вычислено за nt сложений в кольце R и nt умножений в кольце R на степени элемента n.

Дискретное преобразование Фурье (f,..., f ) может быть 1 2n- вычислено за nt сложений в кольце R и nt умножений в кольце R на степени элемента 2n.

Если задан вектор (f,..., f ) или (f,..., f ), то вектор 0 n-1 1 2n- (f0,..., fn-1) может быть вычислен за nt сложений в кольце R, nt умножений в кольце R на степени элемента 2n и n умножений на n-1 R.

Доказательство. Обозначим n- F(x) = fjxj = fjxj + fjxj = F0 (x2) + xF1(x2), j=0 0 j n-1 0 j n- j четно j нечетно — — n где deg F0 (x), deg F1 (x) < = 2t-1. Отсюда F( i ) = F0( 2i) + i F1( 2i), i = 0,..., n - 1. (9.5) n n n n Положим n/2 = 2. Тогда n n { 2i | 0 i n - 1} = i 0 i - 1.

n n / Далее рассуждаем по индукции. Вычисление дискретного преобразо вания Фурье первого типа, т. е. вычисление набора (F( 0),..., F( n-1)) n n по формуле (9.5) можно выполнить за n сложений в кольце R и n умножений в R на степени n, если известны наборы значений F0 ( i ) n / n и F1( i ), i = 0,..., - 1. Если t = 1 и n = 2 = 2t (это основание n / 16 О. Н. Василенко 242 Гл. 9. Дискретное преобразование Фурье индукции), то для вычисления (f, f ) надо найти F0 + i F1, где F 0 и F1 элементы кольца R, i = 0, 1. То есть при n = 2 требуется 2 = nt — умножений в R на степени n = 2 и 2 = nt сложений в R.

Теперь предположим, что при всех j < t для вычисления дискретного преобразования Фурье первого типа от 2j-мерного вектора требуется t-j 2j · j умножений в R на степени 2j = ( n)2 и 2j · j сложений в R. Тогда при j = t вычисление вектора (f,..., f ) по формуле (9.5) состоит 0 n- в вычислении F0 ( i ) и F1( i ) при i = 0,..., n - 1, т. е. в вычислении n 2 n / / преобразований Фурье для векторов длины n 2, состоящих из коэф / фициентов F0(x) и F1 (x), плюс еще n сложений в R и n умножений в R настепени n. Тогда, учитывая индуктивное предположение, вычисление вектора (f,..., f ) потребует не более чем n сложений в R, плюс n 0 n- умножений в R, плюс 2 · 2t-1(t - 1) сложений в R, плюс 2 · 2t-1(t - 1) умножений в R настепени n. То есть требуется n + n(t - 1) = nt сложе ний в R и n + n(t - 1) = nt умножений в R настепени n. Этодока зыва ет первое утверждение теоремы.

Второе утверждение теоремы доказывается аналогично, достаточно лишь заменить n на 2n.

Третье утверждение теоремы следует из первых двух и леммы 9.4.

§ 9.3. Дискретное преобразование Фурье и умножение многочленов В этом параграфе мы покажем, как с помощью дискретного преоб разования Фурье можно быстро умножать многочлены. Мы сохраняем обозначения и предположения из §9.1.

t Лемма 9.6. Одно умножение в кольце R[x] (x2 + 1) можно вы / полнить за n = 2t умножений в R, 3tn сложений в R, 3tn умно жений в R на степени элемента 2n и n умножений в R на эле мент n-1.

Замечание 9.7. Лемма неприменима в случае R = Z и R = Q, по скольку в Z и Q нет элемента 2n.

n-1 n- Доказательство. Пусть F = fixi, G= gixi, F, GR[x] и явля i=0 i= t ются представителями каких-либо классов факторкольца R[x] (x2 +1).

/ n- Пусть H = hixi R[x], FG H (mod xn + 1), т. е. H есть результат i= умножения F на G в факторкольце;

его нужно вычислить.

§ 9.3. Дискретное преобразование Фурье и умножение многочленов Преобразование Фурье 2-го типа для векторов (f0,..., fn-1) и (g0,..., gn-1) дает нам равенства f gi = F( i )G( i ) = H( i ) = h i i 2n 2n 2n при нечетных i, 1 i 2n - 1, так как n + 1 = 0. Если все f и gi нам i 2n известны, то все h вычисляются за n умножений в R. По теореме 9.5 все i элементы f и gi можно вычислить за2tn сложений в R и2tn умножений i в R настепени элемента 2n. По той же теореме все hi можно вычислить, зная h, за tn сложений в R, tn умножений в R на степени элемента 2n i и n умножений в R на элемент n-1. Отсюда легко следует утверждение леммы.

Следствие 9.8. Пусть T коммутативное кольцо с едини — цей, 2-1 T, 4n = 2t+2 T корень уравнения x2n + 1 = 0. Если — F(x), G(x) T [x], degF(x) < n, deg G(x) < n, то произведение мно гочленов F (x) · G(x) T [x] можно вычислить за 2n умножений в T, 6n(t + 1) сложений в T, 6n(t + 1) умножений в T на степени элемента 4n и 2n умножений в T на элемент (2-1)t+1.

Доказательство. Из-за ограничений на степени многочленов F(x) и G(x) многочлен F(x) · G(x) имеет степень меньше, чем 2n, и поэто му равен остатку от деления F(x) · G(x) на 22n + 1. Поэтому результат умножения F(x) на G(x) в кольце R[x] можно найти за одно умножение в кольце R[x] (x2n + 1). Утверждение следствия вытекает из леммы 9.1, / где n заменено на 2n и t заменено на t + 1.

Пусть далее T обозначает коммутативное кольцо с единицей, со держащее элемент 2-1. Говоря об операции сложения в T, мы будем подразумевать также и операцию вычитания. Все постоянные в симво лах O(·) далее абсолютные. Справедлива следующая фундаментальная лемма.

t Лемма 9.9. Если t 2, то одно умножение в кольце T [x] (x2 + 1) / можно выполнить за O(2t · t) умножений в T и O(2t · t · log t) сло жений в T.

Замечание 9.10. Этот результат применим и к кольцу целых чисел Z, если рассматривать в качестве T следующее кольцо:

m T = m Z, k Z 0, T Z.

2k В компьютере элементы кольца T представимы точно, например, в ви де пар (m, k).

Прежде чем привести довольно длинное доказательство леммы 9.9, выведем из нее следующую важную теорему.

16* 244 Гл. 9. Дискретное преобразование Фурье Теорема 9.11. Произведение двух многочленов из кольца T [x] степеней, не превосходящих n (n 3), может быть вычислено за M(n) = O(n log n) умножений в T и A(n) = O(n log n log log n) сло жений в T.

Доказательство. Пусть t N такое, что 2t-1 2n < 2t. Очевидно, что t 2, 2n < 2t 4n. Поэтому умножение двух многочленов степени t не выше n по модулю x2 + 1 есть обычное их умножение. Тогда по лем ме 9.9 мы можем найти их произведение за M(n) = O(2t · t) = O(n · log n) умножений в T и A(n) = O(2t · t log t) = O(n · log n log log n) сложений в T.

Доказательство леммы 9.9. Пусть F = F(x) и G = G(x) мно — 2t- гочлены степеней не выше, чем 2t - 1, H = H(x) = Hixi, причем i= t H FG (mod x2 + 1). Мы должны вычислить H0,..., H2t по ко - эффициентам многочленов F и G. Пусть k натуральный параметр, — 1 k < t, который мы выберем ниже. Представим F и G в виде 2t-k-1 2t-k- k k F = fi (x)xi·2, G = gi(x)xi·2, i=0 i= где fi (x), gi (x) T [x], degfi (x) 2k - 1, deg gi (x) 2k - 1.

Алгоритм вычисления F · G заключается в следующем.

2t-k-1 2t-k- 1 шаг. Умножаем fi (x)Yi на gi (x)Yi в кольце i=0 i= 2t-k- t-k T [x, Y] (Y2 - 1). Результат обозначим через H = hi(x)Yi.

/ i= k t 2 шаг. Подставим Y = x2 в H и приведем по модулю x2 + 1 = t-k = Y2 + 1. Тогда 2t-k-1 2t-k- k k F(x) · G(x) = fl(x)x2 l · gj (x)x2 j l=0 j= 2t-k- k k t-k hi (x)x2 i (mod (x2 )2 + 1).

i= 2t- Отсюда на шаге 2 мы найдем H(x) = Hixi. Надо только понять, i= t как на шаге 2 из набора {hi (x)} при приведении по модулю x2 + получаются коэффициенты Hi.

§ 9.3. Дискретное преобразование Фурье и умножение многочленов На 1 шаге мы перемножаем 2t-k-1 2t-k-1 2t-k- t-k fl (x)Yl · gj (x)Yj hi (x)Yi (mod Y2 + 1).

l=0 j=0 i= Здесь l + j 2t-k+1 - 2 < 2t-k+1 - 1. При этом возможны два случая.

1 случ ай. Если 0 l + j 2t-k - 1, то t-k Yl · Yj Yl+j (mod Y2 + 1).

2 случ ай. Если 2t-k l + j 2 · 2t-k - 2, то t-k Yl+j -Yi (mod Y2 + 1), где i = l + j - 2t-k.

Поэтому hi (x) = fl (x)gi (x) - fl (x)gi (x), l,j l,j l+j=i l+j=i+2t-k где i = 0,..., 2t-k - 1. Отсюда следует, что deg hi (x) deg fl(x) = = deg gj(x) 2k+1 - 2 < 2k+1 - 1. Поскольку k < t, то deg hi < 2t - 1.

2 шаг выполняется не более чем за 2t сложений в T, поскольку 2k+1- k если мы уже знаем hi (x) = hijxj, то при подстановке Y = x2 мы j= получим выражение 2t-k-1 2k+1- k t hijxj+i2 (mod x2 + 1).

i=0 j= t Приведение по модулю x2 + 1 будет происходить с теми слагаемыми, у которых j + i2k 2t. Тогда при j + i2k = r2t + l, где 0 l < 2t, будет k происходить замена xj+i2 на (-1)r · xl, т. е. величину (-1)r · hij надо будет прибавить к коэффициенту при xl (т. е. надо выполнить одно сло жение или вычитание). Таких сложений будет не больше, чем число слагаемых, т. е. не больше, чем 2t-k · 2k+1 = 2t+1. Но на самом деле при 0 i 2t-k-1 выполнено неравенство j + 2k · i 2k+1 - 1 + 2t-1 - 2k = 2k + 2t-1 - 1 2t - 1, поскольку k t - 1. То есть для таких i приведение выполнять не нуж но. Остаются значения i в интервале 2t-k-1 i 2t-k - 1;

таких зна чений будет не более чем 2t-k-1. Следовательно, пар (i, j) для которых 246 Гл. 9. Дискретное преобразование Фурье на втором шаге придется выполнять приведение, будет не больше, чем 2t-k-1 · 2k+1 = 2t. Мы показали, что 2 шаг выполняется не более чем за 2t сложений в T.

Теперь рассмотрим 1 шаг. Умножение мы можем выполнять t-k t-k не в кольце T [x, Y] (Y2 - 1), а в кольце R[Y] (Y2 + 1), где R = / / k+ = T [x] (x2 + 1). В самом деле, поскольку degfi (x) < 2k, deggi (x) < 2k, / то их произведение в кольце T [x] совпадает с их произведением в коль k+1 k+ це T [x] (x2 + 1). В кольце R есть элемент 2k+2 x (mod x2 + 1) / — k+ корень уравнения X2 + 1 = 0.

Положим k = [t 2] 1. Тогда / t - 1 t k, k < t.(9.6) 2 Поскольку 2t-k+1 2k+2, в R есть элемент 2t-k+1 это степень эле — мента 2k+2.

Одно умножение на степень элемента 2t-k+1 в кольце R выпол няется не более чем за 2k+1 сложений в T. В самом деле, поскольку k+ x 2k+2 (mod x2 + 1), то 2k+1- R = {a0 + a1 2k+2 +... + a2k+1 2k+2 | ai T, i = 0,..., 2k+1 - 1}.

- k+ j j Умножение на 2t+k-1 = 21 с учетом равенства 2 = -1 приводит k+ 2k+ к перестановке коэффициентов a0, a1,..., a2k+1, и при этом некото - рые из них меняют знак.

Применим лемму 9.6 для оценки сложности одного умножения t-k в кольце R[Y] (Y2 + 1). Нам нужно выполнить 2t-k умножений в R, / 3 · (t - k) · 2t-k сложений в R (что составляет 3 · (t - k) · 2t-k · 2k+ сложений в T, поскольку элементы кольца R представимы в виде мно гочленов из T [x] степени не выше 2k+1 - 1), 3 · (t - k) · 2t-k умножений в R на степени элемента 2t-k+1, 2t-k умножений в R наэлемент (2-1)t-k (что опять-таки составляет 2t-k · 2k+1 = 2t+1 умножений в T на эле мент (2-1)t-k). Всего получается 2t-k умножений в R, 6 · (t - k) · 2t+ сложений в T и 2t+1 умножений в T на элемент (2-1)t-k.

Учтем еще 2t сложений в T на 2 шаге. Положим t k(t) = k + 1 = + 1 2. (9.7) k+ Тогда одно умножение в T [x] (x2 + 1) выполняется за 2t-k(t)+1 умно / k(t) жений в кольце R = T [x] (x2 + 1) плюс не более, чем 12 · t · 2t сло / жений в T, плюс 2t+1 умножение в T.

§ 9.3. Дискретное преобразование Фурье и умножение многочленов Если t 3, то k(t) < t. Мы сводим описанным выше способом умно t k(t) жение в кольце T [x] (x2 + 1) к умножению в кольце T [x] (x2 + 1) / / и далее вниз, пока не попадем в кольцо T [x] (x4 + 1), где умножение / выполняем любым способом за O(1) операций сложения и умножения в T.

Обозначим через M1 (2j) и A1 (2j) число умножений в T и сложе ний в T, соответственно необходимых для выполнения указанным выше j способом одного умножения в кольце T [x] (x2 + 1). Тогда, при t / выполнены неравенства M1 (2t) 2t-k(t)+1M1(2k(t)) + 2t+1,(9.8) A1 (2t) 2t-k(t)+1A1 (2k(t)) + 12 · t · 2t,(9.9) где k(t) из (9.7). Положим (j) = A1 (2j) 2j, j = 2, 3,... (9.10) / Тогда (t) 2 (k(t)) + 12t. Предположим, что при 2 j < t выполне но неравенство (j) cj log j при некоторой абсолютной постоянной c.

Тогда выполнены неравенства t t (t) 2ck(t) logk(t) + 12t 2c + 1 log + 1 + 12t < ct log t, 2 если постоянная c достаточно велика. Итак, A1 (2t) 2t · ct log t = = O(2t · t log t) это доказывает утверждение 2 леммы 9.9 о количестве — сложений.

Теперь положим M1 (2j) (j) =, j = 2, 3,... (9.11) 2j Справедливо неравенство (t) 2 (k(t)) + 2. Отсюда (t) 2(2 (k(k(t))) + 2) + 2 = 22 (k(k(t))) + 22 + 2, t 1 t t и т. д. Поскольку k(t) + 1, то k((k(t)) + 1 + 1 = + 1 + ;

2 2 2 t k(k(... (k(t))...)) < + 2 для всех j 1. Поэтому при j = [log2 t] будет 2j j выполнено неравенство (t) 2j · c1 + 2 + 22 +... + 2j < 2j · c1 + 2j+1 c2 · t, где c1, c2 абсолютные постоянные. Итак, M1(t) = O(t · 2t). Лемма 9. — полностью доказана.

248 Гл. 9. Дискретное преобразование Фурье § 9.4. Дискретное преобразование Фурье и деление многочленов Мы сохраняем обозначения и предположения из §9.1. Функции M(n) и A(n) те же, что в теореме 9.11.

— Теорема 9.12. Пусть T коммутативное кольцо с едини — цей, в котором содержится элемент 2-1. Пусть F (x), G(x) T [x], deg F(x) n, deg G(x) n, где n 3, и пусть задан элемент коль ца T, обратный к старшему коэффициенту многочлена G(x).

Тогда, если мы обозначим результат деления с остатком F(x) = Q(x)G(x) + R(x), где Q(x), R(x) T [x], deg R(x) < deg G(x), то Q(x) и R(x) можно вычислить за O(n log n) умножений в T и O(n log n log log n) сложений в T.

Доказательство. Можно предположить, что n = deg F(x), m = n m = deg G(x) и m n. Пусть F(x) = fixi, G(x) = gjxj. Нам нужно i=0 j= найти элементы q0,..., qn-m, r0,..., rm-1 T такие, что n n-m m m- fixi = qixi · gjxj + rixi. (9.12) i=0 i=0 j=0 i= Заменив x на x-1 и умножив на xn, преобразуем (9.12) в соотно шение n n-m m fixn-i qixn-m-i · gjxm-j (mod xn-m+1). (9.13) i=0 i=0 j= Обозначим через T [[x]] кольцо формальных степенных рядов вида a0 + a1x + a2x2 +... с коэффициентами из T. Пусть H = H(x) T [[x]] — m формальный степенной ряд, обратный к G (x) = gixm-i. Такой ряд H i= существует, поскольку по условию теоремы коэффициент gm обратим в T. Тогда, найдя H (mod xN ) для некоторого N1 N и умножив на него (9.13), мы найдем Q(x) (mod xN ).

Для элемента P T [[x]] мы обозначаем f(P) = - G T [[x]], если P элемент T [[x]] определен. Очевидно, что f(H) = 0. Для P T [[x]] P § 9.4. ДПФ и деление многочленов положим (P) = 2P - P2G = H - G (P - H)2 T [[x]]. (9.14) Предположим, что P H (mod xk) для некоторого k N. Тогдаиз (9.14) следует, что (P) H (mod x2k). Если задан элемент P такой, что P H (mod xk), то (P) (mod x2k) вычисляем следующим образом:

обрезаем ряд G на x2k, умножа ем на (-P), прибавляем 2 и также об резаем на x2k;

полученный элемент 2 + (-P)G (mod x2k) мы умножа ем на P и обрезаем ряд на x2k. Получится соотношение (P) (mod x2k) P(2 - PG) (mod x2k) H (mod x2k).

То есть если P H (mod xk), то (P) H (mod x2k), и мы можем найти (P) (mod x2k) за два умножения в T [x] многочленов меньшей степени, чем 2k, и одно сложение в T (прибавление элемента 2).

Мы начинаем итерацию с P = g-1 T, где g = gm известный — нам старший коэффициент G(x). Тогда P H (mod x). Затем мы вы j числяем (P) (mod x2), ((P)) (mod x4),..., j (P) (mod x2 ),..., где j обозначает отображение, примененное j раз. При этом j j (P) H (mod x2 ), и, в частности, j (P) T [[x]] будут обратимы.

Обозначим через A (k) и M (k) число сложений и умножений в T, необходимых, чтобы вычислить H (mod xk). Мы показали, что A (2k) A (k) + 2A(2k) + 1, (9.15) M (2k) M (k) + 2M(2k). (9.16) При этом A (1) = M(1) = 0, поскольку g-1 T нам известен. Из §9. следует, что M(n) = O(n log n), и можно считать, что M(n) = CMn log n при n > 1, M(1) = CM, где CM некоторая абсолютная постоянная.

— Аналогично можно считать, что A(n) = CAn log n log log n при n и A(n) = CA при n = 1, 2, 3, где CA абсолютная постоянная. Тогда — M(x) A(x) M(x), A(x),, растущие функции. Из (9.16) по индукции — x x легко следует, что M (2t) 4M(2t). (9.17) Далее, из (9.15) следует, что A (2t) 6A(2t). (9.18) 250 Гл. 9. Дискретное преобразование Фурье В самом деле, A (2t) A (2t-1) + 2A(2t) + 1...

... A (1) + 2(A(2) + A(4) +... + A(2t)) + t = t A(2t) A(2j) · 2t = t + 2 = 2t A(2t) j= t t A(2t) A(2j) 2j = t + 2 2j / t + 21-tA(2t) · 2j;

2t A(2t) 2t / j=1 j= последнее неравенство верно, так как числа A(2j) 2j возрастают. От / сюда 2t+1 - A (2t) t + 2A(2t) · t + 4A(2t) 6A(2t), 2t поскольку t 2A(2t).

Выберем наименьшее t N такое, что 2t n - m + 1. Тогда 2t 2(n - m), если n > m (в случае n = m вычисление H (mod xn-m+1) тривиально). Вычисление H (mod xn-m+1) будет выполнено не более, чем за A (2t) сложений и M(2t) умножений в T. Из (9.17) и (9.18) следует, что нам понадобится не более чем 6A(2(n - m)) сложений и 4M(2(n - m)) умножений в T.

Теперь вычисляем n H (mod xn-m+1) · fixn-i (mod xn-m+1) i= n-m и обрезаем ряд на xn-m+1. В силу (9.13) мы найдем qixn-m-i.

i= То есть мы определили коэффициенты искомого частного в форму n-m m ле (9.12). Далее находим произведение qixi · gjxj за одно i=0 j= умножение многочленов степени n - m и m в T [x], а затем определяем m- rixi за одно вычитание многочленов степени не выше n.

i= Оценим число выполняемых операций сложения и умножения. Сло жений было сделано не более чем 6A(2(n - m)) + A(n - m) + A(max(m, n - m)) + n. (9.19) § 9.5. ДПФ в алгоритме Полларда Штрассена — Умножений было сделано не более чем 4M(2(n - m)) + M(n - m) + M(max(m, n - m)). (9.20) Величина (9.19) не превосходит 6A(2n) + A(n) + A(n) + n = O(n log n log log n), а величина (9.20) не превосходит 4M(2n) + 2M(n) = O(n log n).

Теорема доказана.

§ 9.5. Применение дискретного преобразования Фурье в алгоритме Полларда Штрассена — Здесь мы докажем теорему, необходимую для полного обоснова ния алгоритма Полларда Штрассена из §6.2. Доказательство теоре — мы можно найти в [271;

67]. Мы сохраняем обозначения и предполо жения из §9.1;

под сложениями мы подразумеваем и вычитания в T.

Теорема 9.13. Пусть T коммутативное кольцо с единицей, — содержащее элемент 2-1. Пусть заданы элементы x1,..., xn T и многочлен F(x) T [x], причем F(x) представлен либо в ви n n де F (x) = fixi, либо в виде F(x) = (x - yi), иn = degF(x) 3. Тогда i=0 i= элементы F (x1),..., F(xn) могут быть вычислены за O(n log2 n log log n) сложений в T и O(n log2 n) умножений в T.

Доказательство. Обозначим через t наименьшее натуральное чис ло такое, что n 2t. Положим xi = 0 при n < i 2t.

Сначала мы вычисляем коэффициенты вспомогательных много членов j·2i Gij(X) = (X - xk), 0 i t, 1 j 2t-i. (9.21) k=(j-1)·2i+ При i = 0 имеем G0j(X) = X - xj;

j = 1,..., 2t. Предположим, что для некоторого i, 0 i t - 1, мы уже вычислили коэффициенты 2t-i мно гочленов Gij(X) степени 2i. Тогда вычисляем набор 2t-(i+1) многочле нов Gi+1,j (X), j = 1,..., 2t-(i+1), степени 2i+1 за2t-(i+1) умножений двух соседних многочленов Gij(X) степени 2i. Поэтому весь набор многочле t- нов (9.21) может быть найден за не более чем 2t-(i+1)A(2i) сложений i= t- в T ине более чем 2t-(i+1)M(2i) умножений в T (функции A(x) и M(x) i= те же, что в теореме 9.11). Функция A(x) x по определению является / 252 Гл. 9. Дискретное преобразование Фурье возрастающей, так как мы берем не точное значение A(x), а верхнюю оценку вида CA log x log log x, где CA некоторая постоянная. Анало — гично, в качестве M мы используем величину CMx log x. Тогда t- A(2i) A(2t-1) 2t-1 · t · 2t-1 · = tA(2t-1), 2i 2t- i= t-i- 2t-i-1M(2i) tM(2t-1).

i= Дальнейшее доказательство разделяется на два случая.

n 1 случ ай. Многочлен F(x) задан в виде fixi, т. е. известныкоэф i= фициенты f0,..., fn T. Положим Ft,1 (x) = F(x), и далее при 0 i < t, 1 j 2t-i положим Fij (x) равным остатку от деления F (x) j+ i+1, на Gij(x) (с уменьшением i диапазон изменения j растет). Тогда при 0 i t, 1 j 2t-i и при (j - 1)2i < k j · 2i справедливы равенства Fij(xk) = Fi-1,2j-1 (xk), если (2j - 2)2i-1 < k (2j - 1)2i-1;

(9.22) Fij(xk) = Fi-1,2j (xk), если (2j - 1)2i-1 < k 2j2i-1. (9.23) Это следует из того, что если Gij (xk) = 0, то значение делимого и остатка в точке xk совпадают. В самом деле, если Fij (x) = H(x) · Gi-1,2j-1 (x) + Fi,2j-1 (x), то при доказательстве (9.22) мы пользуемся тем, что Gi-1,2j-1 (xk) = при (2j - 2)2i-1 < k (2j - 1)2i-1;

аналогично доказывается (9.23).

Следовательно, вычисление F(x) = Ft,1 (x) в точках x1,..., x2t сводится к вычислению Ft-1,1 (x) и Ft-1,2 (x) в точках x1,..., x2t-1 и x2t-1,..., x2t + соответственно. И вообще, вычисление Fi,j (xk), где (j - 1)2i < k j · 2i, сводится к вычислению Fi-1,2j-1 (xk) при (2j - 2)2i-1 < k (2j - 1) · 2i- и Fi-1,2j (xk) при (2j - 1)2i-1 < k 2j · 2i-1 соответственно. Так мы спускаемся по первому индексу вниз, пока не доходим до F0j(x), где 1 j 2t. Но F0j (x) константы, это остатки от деления исходного — F(x) на G0j(x) = x - xj. То есть F0j (x) = F(xj) искомые величины.

— Оценим число операций, необходимых для вычисления F0j (x). Если все многочлены Gij (x) уже найдены, то мы последовательно находим остат ки Fij (x). Так как deg Fi+1,j (x) < deg Gi+1,j(x) = 2i+1, то по теореме 9. (которая применима, так как все Gij(x) унитарные многочлены) для — § 9.6. Заключение нахождения остатка Fij (x) требуется O(2i+1 log 2i+1 log log 2i+1) C · A(2i+1) A сложений в T и O(2i+1 log 2i+1) C · M(2i+1) M умножений в T (C и C некоторые постоянные). Поэтому для — A M нахождения всех многочленов Fij (x) при заданных Gij (x) требуется t-1 t- не более, чем C · A(2i+1)2t-i сложений в T и C · M(2i+1)2t-i A M i=0 i= умножений в T. Аналогично доказательству теоремы из предыдущего параграфа число сложений тогда оценится величиной C tA(2t), а число A умножений величиной C tM(2t), где C и C некоторые постоян — — M A M ные. С учетом доказанной выше оценки сложности для вычисления всех многочленов Gij (X) и неравенства 2t 2n, из которого следует, что t= =O(log n), мы получаем утверждение теоремы в рассматриваемом случае.

n 2 случ ай. Пусть многочлен F(x) задан в виде произведения (x-yi).

i= Тогда мы уже показали, что коэффициенты многочлена Gt,1 (x) = 2t n t = = x2 -n (x - xk) могут быть вычислены в рамках указанного k=1 k= в утверждении теоремы количества сложений и умножений в T. По сле этого вычисления мы оказываемся в условиях 1 случая, для которого теорема уже доказана.

Теорема полностью доказана.

§ 9.6. Заключение Применение дискретного преобразования Фурье в арифметике мно гочленов действительно является эффективным на практике. Дискрет ное преобразование Фурье можно также использовать в целочисленной арифметике. В частности, с его помощью доказывается теорема Шенха ге Штрассена: произведение двух n-разрядных двоичных чисел можно — вычислить за O(n log n log log n) битовых операций. Однако на практике алгоритм Шенхаге Штрассена неэффективен, хотя и имеет наилуч — шую известную оценку сложности среди алгоритмов умножения це лых чисел. Постоянная в символе O(·) в указанной оценке сложности алгоритма слишком велика, что делает его практичным лишь для чи сел, записываемых несколькими тысячами десятичных цифр, см. [60;

243;

292]. В следующей главе мы опишем эффективные алгоритмы для умножения больших целых чисел.

Глава 10. Целочисленная арифметика многократной точности § 10.1. Введение. Сложение и вычитание В данной главе мы описываем основные алгоритмы для выполне ния арифметических операций с большими целыми числами, а также некоторые алгоритмы в кольцах вычетов Z nZ.

/ Мы считаем, что числа записаны в b-ичной системе счисления, где b фиксированное натуральное число, b 2. При этом натураль — ное число, записываемое не более чем n цифрами в b-ичной системе счисления, мы обозначаем u1... un (допуская, что несколько старших разрядов u1,..., uk могут равняться нулю). Основание b не всегда равно 2;

иногда оно соответствует размеру машинного слова, отведен ному под запись обычных целых чисел. В этом случае мы работаем с массивом, содержащим большое целое число.

При работе с большими целыми числами удобно хранить знак такого числа в отдельной ячейке или переменной. Если мы хотим, например, перемножить два числа, то знак произведения мы вычисляем отдельно.

Заметим, что программы, реализующие арифметику многократной точности, лучше всего писать на ассемблере.

Опишем сложение и вычитание.

Алгоритм А (сложение неотрицательных целых чисел).

Для двух неотрицательных чисел u1... un и v1... vn вычисляется их сумма w0... wn;

при этом w0 цифра переноса всегда равна 0 или 1.

— — 1 шаг. Присвоить j := n, k := 0 (здесь j идет по разрядам, k следит за переносом).

2 шаг. Присвоить wj := uj + vj + k (mod b), wj наименьший неот — рицательный вычет в данном классе вычетов;

uj + vj + k k =.

b (Заметим, что wj очередная цифра, k перенос;

всегда k = 0 или — — k = 1. При этом, если b = 2 или b размер машинного слова, то для — § 10.2. Умножение вычисления wj и k не нужно использовать деления, достаточно взять соответствующий разряд (или разряды) в записи uj + vj + k.) 3 шаг. Присвоить j := j - 1. Если j > 0, то идти на шаг 2;

если j = 0, то присвоить w0 := k и закончить работу.

Конец алгоритма.

Обоснование корректности алгоритма очевидно.

Алгоритм S (вычитание неотрицательных целых чисел).

По двум n-разрядным неотрицательным целым числам u=u1...un v = v1... vn 0 вычисляется их разность w = w1... wn = u - v.

Замечание 10.1. Для того, чтобы в общем случае установить, что u1... un v1... vn, надо пройти по цифрам, вычисляя uj - vj. Это про стая проверка;

с ее помощью находится знак разности u - v в общем случае.

1 шаг. Присвоить j := n, k := 0 (переменная k это заем из стар — шего разряда).

2 шаг. Присвоить wj := uj - vj + k (mod b) наименьший неотри — цательный вычет в данном классе вычетов;

uj - vj + k k :=.

b 3 шаг. j := j - 1. Если j > 0, то идти на шаг 2;

при j = 0 за кончить работу.

Конец алгоритма.

Обоснование алгоритма достаточно очевидно. При j = n мы нахо дим wn = un - vn, если un vn, и wn = b + un - vn, если un < vn. Соот ветственно, k = 0 и k = -1 это заем из n - 1 разряда. Дальнейшие — рассуждения аналогичны.

§ 10.2. Умножение Здесь мы опишем несколько методов умножения целых чисел, при водящих к эффективным на практике алгоритмам.

Алгоритм M (умножение неотрицательных целых чисел стол биком).

Для чисел u = u1... un и v = v1... vm в системе счисления с основа нием b мы находим их произведение w = uv = w1... wm+n.

1 шаг. Присвоить wm+1 := 0,..., wm+n := 0, j := m. (Значение j пе ремещается по номерам разрядов v от младших к старшим.) 256 Гл. 10. Целочисленная арифметика многократной точности 2 шаг. Если vj = 0, то присвоить wj := 0 и перейти на шаг 6. (Этот шаг можно пропустить. Однако если b мало, например, b = 2, то vj равно нулю с достаточно большой вероятностью. В этом случае вы полнение шага 2 дает значительную экономию.) 3 шаг. Присвоить i := n, k := 0. (Значение i идет по номерам разря дов числа u, k отвечает за перенос.) 4 шаг. Присвоить t := ui · vj + wi+j + k, wi+j := t (mod b) наи — меньший неотрицательный вычет в данном классе вычетов, k := [t b].

/ (По прежнему, как и в § 10.1, при вычислении wi+j и k в ряде слу чаев можно обходиться без деления. Легко показать, что выполняются неравенства 0 t < b2, 0 k < b.) 5 шаг. i := i - 1. Если i > 0, то идти на шаг 4. Если i = 0, то при своить wj := k.

6 шаг. j := j - 1. Если j > 0, то идти на шаг 2. Если j = 0, то закон чить работу.

Конец алгоритма.

Проведем обоснование корректности алгоритма по индукции.

Пусть j = m. Если на 2 шаге vm = 0, то в последних n + 1 раз рядах w будут стоять нули. Если же vm > 0, то на 4-м шаге мы фактически находим uibn-ivmbm-m = uivjbm+n-(i+j) и добавляем в раз ряд wi+j с учетом переноса k. При этом определяется истинное значение цифры wi+j и очередной перенос k. В итоге при j = m по сле шагов 2 5 мы нашли wmwm+1... wm+n = u · vn. Это основание — индукции.

Теперь предположим, что мы прошли 2 6 ша ги l раз и верно опре — делили u · (vm-l+1vm-l+2... vm) = wm-(l-1)wm-(l-2)... wm+n. Тогда по сле 6 шага j = m - l, мы уходим на 2 шаг и вычисляем u · vm-l · bl.

Снова идем по разрядам un,..., u1, на ходим uibn-ivm-lbl = uivjbn+l-i и соответственно изменяем цифру с номером n + m - (n + l - i) = i + j.

На этом мы завершим наше краткое обоснование алгоритма М.

Теперь мы опишем метод умножения, предложенный Комбой, см. [92;

91]. Мы будем называть этот метод быстрым столбиком. На м « » n n нужно умножить u=u1...un = uibn-i на v=v1...vm = vjbm-j. Будем i=1 j= считать, что n m. В алгоритме M нам требовалось кроме mn умноже ний uivj и некоторого количества сложений определенное количество чтений записей памяти. А именно, элементы vj мы читали m раз, эле менты ui мы читали mn раз (по n раз при каждом фиксированном j), элементы wi+j мы mn раз читали и mn раз записывали для них но вые значения. То есть нам нужно mn умножений и около 3mn чтений § 10.2. Умножение записей памяти. В алгоритме M мы вычисляли uv по формуле uv = uvjbm-j. (10.1) j= Однако справедлива и другая формула:

m+n-2 s uv = bs un-ivm-s+i, (10.2) s=0 i= где при l 0 мыпола га ем ul = vl = 0. В самом деле, m+n-2 n- uv = bs un-ivm-j = un-ivm-s+ibs = s=0 i+j=s i=0 i s m-1+i 0 i n- 0 j m- m+n- = bs un-ivm-s+i. (10.3) s=0 s-m+1 i s Формула (10.3) эквивалентна формуле (10.2). Действительно, ес ли s - m + 1 < 0, т. е. s < m - 1, то при i < 0 величина un-i рав на 0 по определению. Если же s - m + 1 > 0, т. е. s > m - 1, то при 0 i < s - m + 1 значение i + m - s < 1, и vm-s+i = 0 по определению.

Теперь воспользуемся формулой (10.2), чтобы умножить u на v.

Алгоритм FM («быстрый столбик»)..

1 шаг. t := 0.

2 шаг. (цикл) Для s от 0 до m + n - 1 с шагом 1 выполнить ша ги 3 и 4.

3 шаг. Для i от 0 до s с шагом 1 выполнить присвоение t := t + un-i · vm-s+i.

4 шаг. Присвоить wm+n-s := t (mod b) наименьший неотрица — тельный вычет по модулю b (опять-таки, это не деление, а чтение записи памяти, если b = 2 или b размер машинного слова);

— t := [t b].

/ Конец алгоритма.

Корректность алгоритма следует из формулы (10.2).

Операций умножения здесь столько же, сколько в алгоритме М, поскольку каждое ui надо умножить на каждое vj, только в другом по рядке. Однако количество чтений записей памяти сокращается: мы чи таем ui и vj столько раз, сколько перемножаем т. е. 2mn раз (mn раз — 17 О. Н. Василенко 258 Гл. 10. Целочисленная арифметика многократной точности читаем ui и mn раз читаем vj). И еще требуется m + n записей в память значений wm+n-s. В итоге число чтений записей памяти в быстром « столбике существенно меньше, чем в алгоритме М, и реализация алго » ритма FM дает реальный выигрыш во времени на практике (если писать программу на ассемблере и если b это размер слова в ассемблере).

— Теперь опишем метод Карацубы для умножения целых чисел (см. [23]). Предположим, что у нас имеется два 2n-разрядных числа в двоичной системе счисления:

u = u2n-1... u0, v = v2n-1... v0.

Положим u = 2nu + u, v = 2nv + v, где u = u2n-1... un, u = un-1... u0, v = v2n-1... vn, v = vn-1... v0.

Тогда uv = (22n + 2n)u v + 2n (u - u )(v - v ) + (2n + 1)u v. (10.4) Поэтому для умножения двух 2n-разрядных чисел по формуле (10.4) нужно три умножения n-разрядных чисел и O(1) сложений, вычита ний и сдвигов 4n-разрядных чисел, которые делаются за O(n) битовых операций. Если обозначить через T (n) число битовых операций для умножения двух n-разрядных чисел, то T (2n) 3T (n) + cn, (10.5) где c некоторая абсолютная постоянная. Из (10.5) по индукции сле — дует неравенство T (2k) c(3k - 2k), k = 1, 2, 3,... (10.6) Действительно, при k = 1 T (2) c (это обеспечивается за счет выбора постоянной c). Далее, если (10.6) верно для k, то T (2k+1) 3T (2k) + c2k 3c(3k - 2k) + c2k = c(3k+1 - 2k+1).

Поскольку умножение двух n-разрядных чисел сводится к умноже нию 2[log n]+1-разрядных чисел (старшие биты при необходимости по ла га ем ра вными нулю), то из (10.6) получим неравенство 2 2 2 T (n) T (2[log n]+1) c3[log n]+1 c13log n = c1nlog 3.

Это есть оценка сверху количества битовых операций, требуемых для умножения двух n-разрядных чисел методом Карацубы.

§ 10.3. Деление Метод Карацубы становится более эффективным, чем быстрый « столбик, для достаточно больших чисел. По разным источникам, гра » ница находится где-то между числами порядка 2450 и 2640. Поскольку в методе Карацубы умножение 2n-разрядных чисел сводится к умно жению n-разрядных, то, сделав несколько тактов алгоритма Карацубы, мы приходим к умножению чисел того размера, где более эффективен быстрый столбик, и с его помощью завершаем умножение. В этом « » и заключается практичный алгоритм умножения целых чисел.

Замечание 10.2. Алгоритм Карацубы был впоследствии обобщен Тоомом и Куком, см. [39;

94]. В частности, можно показать, что в ал горитме Тоома Кука — 2log2 n T (n) = O n2 log2 n.

Алгоритм Тоома Кука описан в [25, § 4.3.3]. Там же описан модуляр — ный метод Шенхаге. Еще лучшую, чем алгоритм Тоома Кука, оцен — ку сложности имеет алгоритм Шенхаге Штрассена, о котором было — вкратце рассказано в гл. 9.

Вра бота х [115] и [279] описаны методы распараллеливания умно жения целых чисел многократной точности.

§ 10.3. Деление В этом параграфе мы опишем методы деления целых чисел много кратной точности.

Для начала рассмотрим алгоритм деления многоразрядного числа на одноразрядное.

Алгоритм DO (деление на одноразрядное число).

Находим частное w = w1... wn от деления числа u = u1... un в си стеме счисления с основанием b на одноразрядное число v, 1 v < b, и оста ток r = u - vw.

1 шаг. r := 0, j := 1.

rb + uj 2 шаг. w - j := ;

r := rb + uj (mod v) наименьший неот — v рицательный вычет в данном классе вычетов.

3 шаг. j := j + 1. Если j n, то идти на 2 шаг. Если j > n, то выда ть w = w1... wn и r.

Конец алгоритма.

Корректность алгоритма DO очевидна это обычное деление — углом.

17* 260 Гл. 10. Целочисленная арифметика многократной точности Теперь рассмотрим простой алгоритм деления многоразрядных це лых чисел из [180, гл. 14]. Пусть b основание системы счисления, — u = un... u1u0, v = vt... v1v0 натуральные числа, n t 1, vt = — (случай t = 0, т. е. деление на одноразрядное число, рассмотрен выше в алгоритме DO).

Алгоритм деления.

На входе u, v;

на выходе частное q = qn-t... q0 иоста ток r = rt... r0, u = qv + r, 0 r < v.

1 шаг. Для j от 0 до n - t присвоить qj := 0.

2 шаг. До тех пор, пока u vbn-t, выполнять следующие действия:

qn-t := qn-t + 1, u := u - vbn-t (здесь определяется старшая цифра частного).

3 шаг. Для i = n, n - 1,..., t + 1 выполнять пункты 1 4:

— 1) если ui vt, то присвоить qi-t-1 := b - 1, иначе присвоить uib + ui- qi-t-1 := ;

vt 2) до тех пор, пока qi-t-1 (vtb + vt-1) > uib2 + ui-1b + ui-2, выпол нять qi-t-1 := qi-t-1 - 1;

(заметим, что всегда будет выполняться неравенство qi-t-1 0);

3) присвоить u := u - qi-t-1bi-t-1v;

4) если u < 0, то присвоить u := u + vbi-t-1, qi-t-1 := qi-t-1 - 1.

4 шаг. r := u. Выда ть q и r.

Конец алгоритма.

Покажем, что алгоритм работает верно. После 1 шага q = 0. По сле второго шага найдена старшая цифра qn-t частного, и текущее значение u меньше, чем vbn-t. Возьмем первое значение i = n;

нам нужно определить цифру частного qn-t-1. Если un vt (неравенство пункта 3 шага), то наибольшее возможное значение qn-t-1 равно b - (например, при un = b - 1, vt = 1). Если же un < vt, то наибольшее воз unb + un- можное значение qn-t-1 равно. Действительно, vt unb + un-1 unbn + un-1bn-1 +... + u0 < + 1 bn-t-1v, vt § 10.3. Деление так как справедливо даже более сильное неравенство:

unb + un-1 unbn +... + u0 < + 1 bn-t-1vtbt = vt unb + un-1 = + 1 bn-1vt.

vt Последнее верно, так как unb + un-1 unbn + un-1bn-1 = (unb + un-1)bn-1 < + 1 bn-1vt, vt и поскольку обе части строгого неравенства делятся нацело на bn-1, добавление к левой части величины un-2bn-2 +... + u0, меньшей, чем bn-1, сохраняет неравенство. Итак, мы обосновали 1-й пункт 3-го шага. Здесь величина qi-t-1 не меньше истинного значения циф ры частного с номером i - t - 1, и не больше, чем b - 1, та к ка к при vt un + 1 имеем unb + un-1 unb + un-1 un-1 - b = b + < b.

vt un + 1 un + Во втором пункте 3 шага мы находим более точное значение qi-t-1.

В самом деле, пусть (qn-t-1 + 1) (vtb + vt-1) > unb2 + un-1b + un-2, (10.7) qn-t-1 (vtbt + vt-1) unb2 + un-1b + un-2. (10.8) Из первого неравенства следует, что bn-t-1(qn-t-1 + 1) (vtbt + vt-1bt-1) > unbn + un-1bn-1 + un-2.

Так как обе части делятся на bn-2 и un-3bn-3 +... + u0 < bn-2, то bn-t-1(qn-t-1 + 1) (vtbt + vt-1bt-1) > u.

Тем более bn-t-1(qn-t-1 + 1)v > u;

зна чит, qn-t-1 + 1 больше искомой цифры частного, а qn-t-1 не меньше.

— Пусть для найденного значения qn-t-1 выполнено неравенст во (10.8). Покажем, что тогда qn-t-1 либо равно истинной цифре част ного, либо на единицу больше. Предположим противное. Тогда qn-t- больше истинной цифры хотя бы на 2, т. е.

u < (qn-t-1 - 1)bn-t-1v. (10.9) Отсюда unbn + un-1bn-1 + un-2bn-2 < (qn-t-1 - 1)bn-t-1 (vtbt +... v0).

262 Гл. 10. Целочисленная арифметика многократной точности Применяя (10.8), получим qn-t-1(vtb + vt-1)bn-2 < < (qn-t-1 - 1)bn-t-1(vtbt + vt-1bt-1 + vt-2bt-2 +... + v0).

Пользуясь делимостью на bn-2, нера венства миvt-2bt-2 +... + v0 < bt- и 0 qn-t-1 < b, получим, что qn-t-1(vtb + vt-1)bn-2 (qn-t-1 - 1)bn-t-1 (vtbt + vt-1bt-1), а это невозможно.

Итак, найденное во 2 пункте 3 шага значение qn-t-1 равно истинно му значению цифры частного, или на единицу больше. Отсюда следует обоснование 3 и 4 пунктов 3 шага.

После прохождения 3 шага для i = n будет выполнено неравенство u = unbn +... + u0 < vbn-t-1 = bn-t-1(vtbt +... + v0).

Отсюда следует, что un = 0. Поэтому мы возвращаемся на 3-й шаг к значению i = n - 1, и т. д.

Мы обосновали корректность работы 3-го шага для i = n. Для мень ших значений i все рассуждения повторяются дословно.

На этом завершается обоснование данного алгоритма деления.

Теперь мы опишем более тонкий алгоритм деления целых чисел мно гократной точности, следуя [25, гл. 4]. Мы дадим лишь несколько более подробные доказательства вспомогательных утверждений, чем это сде лано в книге [25]. Заметим, что в книге [25] приведена также блок схема алгоритма деления.

Пусть u = u0... un и v = v1... vn неотрицательные целые числа, — записанные в системе счисления с основанием b, причем v1 > 0, u v < b.

/ Нам нужно найти частное от деления u на v q = [u v], (10.10) / 0 q b - 1. Нахождение q при сделанных нами предположениях мы будем называть основной задачей.

Заметим, что u v < b тогда и только тогда, когда u b < v, что ра в / / носильно неравенству u0... un-1 < v1... vn. (10.11) Обозначим u0b + u q = min, b - 1. (10.12) v § 10.3. Деление Значение q вычислить нетрудно, нужно найти частное от деления двух разрядного числа u0b + u1 на одноразрядное v1 (см. алгоритм DO выше).

Теорема 10.3. В условиях основной задачи справедливо нера венство q q.

Доказательство. Поскольку q = [u v] b 1, теорема верна при / u0b + u q = b - 1. Пусть q < b - 1. Тогда q =. Из этого следует, что v qv1 u0b + u1 - v1 + 1. (10.13) u0b + u В самом деле, если Z, то (10.13) верно, так как v1 1.

v1 u u0b + u1 u0b + u1 0b + u1 k Если же не целое число, то = +, — v1 v1 v1 v где k N, 1 k v1 - 1. Тогда u0b + u1 k u0b + u1 v1 - q = - -, v1 v1 v1 v откуда следует (10.13).

С помощью (10.13) получаем неравенства u - qv u - qv1bn- u0bn-2 +... + un - (u0bn + u1bn-1 - v1bn-1 + bn-1) = = u2bn-2 +... un - bn-1 + v1bn-1 < v1bn-1 v.

Так как u qv и u < (q + 1)v, то q q, что и требова лось дока за ть.

Теорема 10.4. Если в условиях основной задачи также выпол нено неравенство v1 [b 2], то / q - 2 q.

Доказательство. Так как (по теореме 10.3) q q, то, предположив, что q < q - 2, мы придем к противоречию. Пусть q q + 3. По опреде лению u0b + u1 u0bn + unbn-1 u q = <.

v v1bn-1 v - bn- u При этом v > bn-1, так как если v = bn-1, то q = = u0b + u1, v и по условию q b - 1. Из этого следует, что q = u0b + u1 = q, а это противоречит сделанному предположению.

Поскольку q частное, то q > u v - 1. Тогда — / u u u bn- 3 q - q < - + 1 = · + 1.

v v - bn- v - bn-1 v 264 Гл. 10. Целочисленная арифметика многократной точности Значит u bn- · > 2, v - bn- v u v - bn-1 v > 2 = 2 - 1 2(v1 - 1).

v bn-1 bn- Далее, так как q b - 1, то b - u q - 3 q = [u v] 2v1 - 2.

/ b Поэтому v1 - 1, v1 < [b 2], что противоречит условию теоремы.

/ Замечание 10.5. Мы показали, что если v1 [b 2], то пробное / частное q никогда не отличается от истинного частного q больше, чем на две единицы.

Теперь обратимся к задаче нормализации: как, находясь в усло виях основной задачи, попасть в условия теоремы 10.4? Ока зыва ется, b следует умножить u и v на. При этом частное q не изменится, v1 + и будет выполнена следующая теорема.

b Теорема 10.6. В условиях основной задачи у числа v = v v1 + старший разряд будет не меньше, чем [b 2], и ч исло v останет / b ся n-разрядным. При этом число u = u будет не более чем v1 + (n + 1)-разрядным.

Доказательство. Покажем сначала, что если a, c N, 1 a < c, то c c c a < (a + 1) c. (10.14) 2 a + 1 a + Второе и третье неравенства в (10.14) очевидны;

докажем первое.

Рассмотрим сначала случай a [c 2]. Тогда, поскольку c a + 1, / c c то a a.

a + 1 Пусть теперь 1 a < [c 2]. Тогда / c c c c a > a - 1 - 1 - 1.

a + 1 a + 1 2 Здесь мы воспользовались тем, что c c 2ac - 2a2 - 2a - ca - c + 2a + a - 1 - + 1 = = a + 1 a + 1 2a + ac - 2a2 - c + 2 (a - 1) (c - 2a - 2) = = 0, 2a + 2 2a + § 10.3. Деление так как из неравенства a < [c 2] c 2 следует, что a + 1 c 2, / / / c 2a + 2. Итак, формула (10.14) дока за на.

Теперь докажем теорему 10.6. Положим в (10.14) a = v1, c = b. Тогда b b bn-1 v1bn-1, (10.15) 2 v1 + b b v1 < (v1 + 1) b. (10.16) v1 + 1 v1 + Так как одно из неравенств (10.16) строгое, то из (10.15) и (10.16) получим, что b b bn-1 v1 bn-1 < b · bn-1. (10.17) 2 v1 + b Однако v1 еще не является старшим разрядом числа v, та к ка к v1 + возможен перенос из младших разрядов. Но если этот перенос будет b строго меньше, чем, то старший разряд числа v будет строго v1 + b меньше, чем (v1 + 1), а это число не превосходит b. Поэтому v v1 + останется n-разрядным. Осталось показать что перенос из млад лишь, b ших разрядов v в n-й строго меньше, чем.

v1 + Перенос из последнего разряда v в предпоследний составит не бо лее чем (b - 1) b 1 b b = 1 - <, b v1 + 1 b v1 + 1 v1 + поскольку 1 - < 1. Далее применим индукцию: предположим, что пе b b ренос из (j + 1)-го разряда в j-й строго меньше, чем. Тогда v1 + перенос из j-го в (j - 1)-й разряд будет не превосходить b b - 1 bn-j + vj bn-j v1 + 1 v1 + bn-j+ b b - 1 + (b - 1) v1 + 1 v1 + = b b 1 b = - <.

v1 + 1 b v1 + 266 Гл. 10. Целочисленная арифметика многократной точности Итак, мы доказали, что v останется n-разрядным. Из (10.17) следу ет, что старший разряд v будет не меньше [b 2]. Наконец, u будет / u u не более чем (n + 1)-разрядным, так как = < b.

v v Теперь опишем алгоритм деления целых чисел многократной точно сти, основанный на теоремах 10.3 10.6.

— Алгоритм D (деление неотрицательных целых чисел).

Для чисел u = u1... um+n и v = v1... vn, записанных системе в u счисления с основанием b, где v1 = 0, находим частное = q0... qm v и оста ток r = u - qv = r1... rn. Здесь m 0. Если n = 1, то применяем алгоритм DO. Далее считаем, что n 2.

b 1 шаг (нормализация). Присвоить d :=, v1 + u0u1... um+n := u1... um+n · d, v1... vn := v1... vn · d.

(Из теоремы 10.6 следует, что новое значение v1 больше или равно [b 2].) / 2 шаг. j := 0.

3 шаг (обеспечение выполнения условий основной задачи). Присво uj... uj+n ить l := 0. Если b, то выполнены условия основной задачи;

v uj... uj+n мы переходим на 4 шаг. Если < b, то v uj... uj+n := uj... uj+n - bv, l := l + 1.

uj... uj+n Снова проверить выполнение неравенства < b;

еслида, то пе v рейти на 4 шаг. Иначе еще раз присвоить uj... uj+n := uj... uj+n - bv, l := l + 1.

Замечание 10.7. Покажем, что после 3 шагабудет выполнено нера u венство < b, т. е. выполнены условия основной задачи. Поскольку v v1 [b 2], то v = v1... vn [b 2]bn-1. Та кже uj... uj+n bn+1 - 1. По / / кажем, что uj... uj+n < 3bv. (10.18) Действительно, 3bv 3bv1bn-1 3bn [b 2] > bn+1 - 1 uj... uj+n, / так как при b = 2 нера венство 3 · 2n [2 2] > 2n+1 - / § 10.3. Деление b очевидно, а при b 3 либо [b 2] = b 2, либо [b 2] = -, и тогда / / / 2 b 1 3 1 + 3bn [b 2] 1 + 3bn - = 1 + bn+1 - bn > bn+1, / 2 2 2 1 так как bn+1 bn. Ита к, после 3 ша га uj... uj+n < bv.

2 Замечание 10.8. Значение переменной l показывает, что из перво начального значения uj... uj+n мы вычли lbv. Впоследствии нам на до будет добавить lb в соответствующий разряд итогового частного на 9 шаге.

4 шаг (нахождение q). На этом шаге выполнено неравенство uj v1, так как, если uj > v1, то ujuj+1... uj+n - b · v1... vn ujbn - (v1bn + v2bn-1 +... + vnb) bn - (v2bn-1 +... vnb) > 0, что противоречит условию основной задачи, которое выполнено.

ujb + uj+1 uj+ Если uj = v1, то = b + b, и тогда мы присваи v1 v ваем q := b - 1.

ujb + uj+ Если uj < v1, то b - 1, та к ка к ина че v ujb + uj+ b, ujb + uj+1 bv1, v что невозможно, поскольку b - 1 uj+1, b(v1 - uj) b.

В этом случае мы присваиваем ujb + uj+ q =.

v 5 шаг. Проверить выполнение неравенства v2q > (ujb + uj+1 - qv1)b + uj+2. (10.19) Если оно выполнено, то q := q - 1. Снова проверить (10.19), и если оно выполнено, то присвоить еще раз q := q - 1.

Замечание 10.9. Поскольку n 2, то v не менее чем двухраз — рядное, а число u = u0... um+n не менее чем трехразрядное;

значит, — цифра uj+2 с номером j + 2 определена.

Замечание 10.10. После 4 шага выполнены условия теорем 10. и 10.4. Значит, q - 2 q q, т. е. q равно либо q, либо q + 1, либо 268 Гл. 10. Целочисленная арифметика многократной точности q + 2. Положим r := ujb + uj+1 - qv1 выражение, стоящее в форму — ле (10.19) в скобках. Покажем, что если v2q > rb + uj+2, (10.20) то q > q. В самом деле, надо доказать, что uj... uj+n - qv < 0.

Справедливы следующие соотношения:

uj... uj+n - qv uj... uj+n - qv1bn-1 - qv2bn-2 = = uj+2bn-2 +... + uj+n + ujbn + uj+1bn-1 - qv1bn-1 - qv2bn-2 = = rbn-1 + uj+2bn-2 +... + uj+n - qv2bn-2 < < rbn-1 + (uj+2 + 1)bn-2 - qv2bn-2 = = bn-2(rb + uj+2 + 1 - qv2). (10.21) Если выполнено неравенство (10.20), то в формуле (10.21) rb + uj+2 + 1 - qv2 < rb + uj+2 + 1 - (r b + uj+2) = 1.

Поэтому rb + uj+2 + 1 - q v2 < 0, и из (10.21) следует, что uj... uj+n - q v < 0, т. е. q q + 1. Следовательно, надо заменить q на q - 1 это будет — лучшим приближением к q. Эта процедура 5 шага делается не более двух раз, так как q q + 2 по теореме 10.4.

Замечание 10.11. Сейчас для текущего значения q, удовлетворя ющего неравенству q q q + 2, и для значения r = ujb + uj+1 - qv выполняется неравенство v2q br + uj+2. (10.22) Докажем, что в этом случае q равно либо q, либо q + 1. Предположим противное, т. е. что q = q - 2. Но тогда uj... uj+n < (q - 1)v < q (v1bn-1 + (v2 + 1)bn-2) - v < < qv1bn-1 + qv2bn-2 + bn-1 - v, § 10.3. Деление поскольку qbn-2 < bn-1 по определению q. Отсюда, с учетом (10.22), получим uj... uj+n < qv1bn-1 + (br + uj+2)bn-2 + bn-1 - v = = qv1bn-1 + (ujb2 + uj+1b + uj+2 - qv1b)bn-2 + bn-1 - v ujbn + uj+1bn-1 + uj+2bn-2, (10.23) поскольку bn-1 - v 0. Формула (10.23) означает, что uj... uj+n < < uj... uj+n, но это невозможно.

Итак, q равно q или q равно q + 1.

6 шаг. Находим разность uj... uj+n - qv1... vn (10.24) и заносим ее абсолютную величину в uj... uj+n, а знак в переменную.

7 шаг. qj := q. Если разность (10.24) неотрицательна, то уходим на 9 шаг.

8 шаг. Присваиваем qj := qj - 1 (та к ка к ра зность (10.24) в этом случае отрицательна, то q = q + 1), а также uj... uj+n := v1... vn - uj... uj+n.

9 шаг. К значению qj прибавляем величину lb из 3 шага.

Замечание 10.12. На 3-м шаге мы обеспечивали выполнение усло вий основной задачи, вычитая из исходного числа uj... uj+n число lbv.

Поэтому к найденному частному qj от деления нового (после 3 шага) числа uj... uj+n на v надо добавить lb. После этого значение qj уже не всегда будет цифрой в b-ичной системе счисления, оно может стать больше, чем b.

10 шаг. Сейчас в текущем значении числа uj... uj+n цифра uj рав на 0, так как в нем фактически стоит остаток от деления на n-разрядное число v1... vn. Присваиваем j := j + 1. Если j m, то возвращаемся на 3 шаг.

11 шаг. Искомое частное от деления u на v равно q := q0bm + q1bm-1 +... qm-1b + qm (здесь qj уже могут не быть цифрами в b-ичной системе счисления, см. за меча ние на ша ге 9). Оста ток от деления u на v равен um+1... um+n r = r1... rn :=, d где d из 1 шага алгоритма, um+1... um+n значение, полученное по — — сле последнего выполнения 10 шага.

Конец алгоритма.

270 Гл. 10. Целочисленная арифметика многократной точности Корректность работы алгоритма деления мы обосновали по ходу его описания.

Замечание 10.13. Описание некоторых алгоритмов для выполне ния арифметики многократной точности можно найти в книгах [101, гл. 9;

180, гл. 14]. Обзор арифметики многократной точности содер жится в работе [70].

§ 10.4. Некоторые алгоритмы модулярной арифметики В этом параграфе мы описываем некоторые алгоритмы для вычис ления в кольцах вычетов Z nZ.

/ Начнем с китайской теоремы об остатках. В Приложении мы привели формулировку этой теоремы о решении системы сравнений x a1 (mod m1),................. (10.25) x ak (mod mk), где (mi, mj) = 1 при i = j. Формулировка является конструктивной, т. е.

представляет собой метод решения (10.25). Однако в ряде случаев бо лее эффективным является алгоритм Гарнера, см. [25, § 4.3.2;

124;

180, гл. 14]. По сравнению с классической китайской теоремой об остатках он не требует приведения по модулю M = m1... mk.

Алгоритм Гарнера.

На входе алгоритма заданы числа a1,..., ak, m1,..., mk, (mi, mj) = = 1 при i = j, и число M = m1... mk. На выходе получается решение x системы (10.25), 0 x < M.

1 шаг. Для i = 2,..., k выполнить пункты 1) и 2):

1) ci := 1;

2) для j = 1,..., i - 1 выполнить: u := m-1 (mod mi) (нахождение j обратного элемента можно делать с помощью обобщенного бинарного алгоритма, см. Приложение), ci := uci (mod mi).

2 шаг. u := a1, x := u.

3 шаг. Для i = 2,..., k вычислить u := (ai - x)ci (mod mi) наи — меньший неотрицательный вычет по модулю mi, i- x := x + u mj.

j= § 10.4. Некоторые алгоритмы модулярной арифметики Полученное значение x является искомым решением.

Конец алгоритма.

Покажем, что алгоритм Гарнера выдает верный ответ, и что 0 x < M. Мы считаем, что 0 ai mi - 1, i = 1,..., k. Тогда по по строению k i- 0 x m1 - 1 + (mi - 1) mj = m1... mk - 1 = M - 1.

i=2 j= Далее, при i 2 ci (m1... mi-1)-1 (mod mi). Очевидно, что x a1 (mod m1). Обозначим через xi значение x в алгоритме, которое получается после выполнения 3 шага для значения переменной i (2 i k);

x1 = a1. Тогда i- xi = xi-1 + ((ai - xi-1)ci (mod mi)) mj, j= i- xi (mod mi) xi-1 (ai - xi-1) · ci mj (mod mi) ai (mod mi).

j= Поскольку итоговое значение x в алгоритме по построению удовлетво ряет сравнениям x xi (mod mi), i = 1,..., k, алгоритм Гарнера рабо тает верно.

Теперь опишем вкратце модулярное умножение и возведение в сте пень по Монтгомери, см. [101, гл. 9;

180, гл. 14;

191]. Зафиксируем натуральное число N > 1 и натуральное число R, R > N, (R, N) = 1.

Число R выбирается так, чтобы вычисления по модулю R были до статочно легкими (например, R размер машинного слова или степень — двойки). Пусть заданы R, N Z, такие, что 0 < R < N, RR - NN = (R и N можно найти с помощью обобщенного алгоритма Евклида, см. Приложение). Для целого числа T, 0 T < RN, можно быст ро найти наименьший неотрицательный вычет в классе вычетов TR (mod N) с помощью следующего алгоритма (фактически здесь R R-1 (mod N)).

Алгоритм REDC (приведение по Монтгомери).

1 шаг. m := T (mod R) наименьший неотрицательный вычет.

— 2 шаг. m := mN (mod R) наименьший неотрицательный вычет.

— 272 Гл. 10. Целочисленная арифметика многократной точности T + mN 3 шаг. t :=.

R 4 шаг. Если t N, то выда ть t - N, ина че выда ть t.

Конец алгоритма.

Покажем, что алгоритм работает верно. Поскольку значение m, по лучающееся на 2 шаге, удовлетворяет сравнению mN TN N -T (mod R), то значение t, определяемое на 3 шаге, будет целым числом. Да лее, tR T + mN T (mod N), т. е. t TR-1 (mod N). Наконец, 0 T + mN < RN + RN, откуда 0 t < 2N. Это завершает обоснование корректности алгоритма REDC.

Заметим, что поскольку мы считаем вычисления по модулю R (в том числе, деление на R) быстрыми, то сложность выполнения алгоритма REDC в основном заключается в двух умножениях целых чисел, по мо дулю не превосходящих R.

Аналогично можно описать приведение по Монтгомери для целых чисел многократной точности, умножение по Монтгомери (т. е. для x, y Z и N N мы находим xyR-1 (mod N)) и возведение в степень по Монтгомери (т. е. для x, N, e N вычисляется xe (mod N)), см. [101, гл. 9;

180, гл. 14;

191]. Возведение в степень по Монтгомери оказыва ется эффективным и рекомендуется для практического использования, см. также [69].

Еще один алгоритм для эффективного модулярного возведе ния в степень был предложен в работе [132]. Авторы этой рабо ты утверждают, что их алгоритм эффективнее алгоритма Монтго мери.

Для вычисления x (mod m) при заданных x и m эффективен ал горитм Баррета, см. [69;

180, гл. 14]. В [101, гл. 9] описаны быстрые алгоритмы для вычисления по модулям специального вида, например, по модулю N = 2q + c, c Z, q N, или по модулям Прота, имеющим вид N = k · 2q + c.

Ряд методов возведения в степень элементов конечных групп и спо собов записи и представления показателей описан в [180, § 14.6, 14.7].

Теперь опишем еще один алгоритм Монтгомери, который при за данном N N и заданных a1,..., ak Z находит b1..., bk Z такие, что aibi 1 (mod N), i = 1,..., k. Этот алгоритм описан в [89, гл. 10];

он может применяться в алгоритме факторизации целых чисел с помо щью эллиптических кривых, см. гл. 4. С его помощью можно работать одновременно с несколькими кривыми.

§ 10.4. Некоторые алгоритмы модулярной арифметики Алгоритм.

1 шаг. Присвоить c1 := a1 и для i = 2,..., k ci := ci-1 · ai (mod N).

2 шаг. С помощью обобщенного алгоритма Евклида или одной из его модификаций (см. Приложение) найти u, d, v такие, что uck + vN = d = НОД(ck, N).

3 шаг. Для i = k, k - 1,..., 2 сделать следующее:

1) bi := uci-1 (mod N);

2) выдать bi;

3) u := uai (mod N).

Полученное значение u искомая величина.

— Конец алгоритма.

Обоснуем правильность работы алгоритма в предположении, что (ai, N) = 1, i = 1,..., k, т. е. на 2 шаге алгоритма d = 1. Оче видно, что ci = a1... ai, i = 1,..., k. Поэтому после 2 шага u (a1... ak)-1 (mod N). Тогда на 3 шаге при i = k bk a-1 (mod N), k и за тем u = (a1... ak-1)-1 (mod N). Теперь очевидно, что и для всех i, 1 i k, bi a-1 (mod N).

i Ряд алгоритмов для вычисления в конечных полях и кольцах вы четов был предложен Ву, см. [287;

288;

289;

286]. В частности, в ра боте [287] предложено развитие метода Монтгомери для умножения и возведения в степень в полях GF(2m), а в работе [289] рассмат ривается приведение по Монтгомери для модулей специального вида, n + например, N = 2n - 2m - 1, 0 < m <.

18 О. Н. Василенко Глава 11. Решение систем линейных уравнений над конечными полями § 11.1. Введение В этой главе мы рассмотрим некоторые алгоритмы решения си стем линейных уравнений над конечными полями. Как мы видели в гл. 3 и 5, такие системы возникают в алгоритмах факторизации и дискретного логарифмирования, использующих факторные базы.

В алгоритмах факторизации это разреженные системы линейных урав нений над полем Z 2Z. В алгоритмах дискретного логарифмирования / по простому модулю p это системы линейных уравнений над кольцом вычетов Z (p - 1)Z, однако их решение сводится к решению систем / линейных уравнений над конечным простым полем. Действительно, пусть N aijxj bi (mod p - 1), i = 1,..., M, (11.1) j= система уравнений относительно неизвестных x1,..., xN, кото — t k рую мы хотим решить. Если p - 1 = q есть разложение p - k k= на простые множители, то по китайской теореме об остатках решение системы (11.1) сводится к решению систем N k aijxj bj (mod q ), j = 1,..., M, (11.2) k j= k для k = 1,..., t, т. е. к нахождению xj (mod q ). Представим для k k фиксированного k неизвестные значения xj (mod q ) в виде k k- k xj xj0 + xj1qk +... + xj, q (mod q ), (11.3) k- k k где 0 xjl qk - 1, l = 0, 1,..., k - 1. Редуцируя систему (11.2) § 11.2. Решение систем линейных уравнений в целых числах к модулюqk, мы получим систему линейных уравнений N aijxj0 bj (mod qk), j = 1,..., M, (11.4) j= над конечным простым полем Z qkZ. Если мы найдем все xj0, / j = 1,..., N, то, подставляя xj в виде (11.3) с известными xi0 в систе му (11.2), редуцируя ее к модулю q2 и затем поделив на qk, мы получим k систему линейных уравнений над полем Z qkZ относительно неизвест / ных xj1, j = 1,..., N, и так далее. В конечном счете, найдя значение k xj (mod q ) для всех k, мына йдемxj (mod p - 1) по китайской теореме k об остатках.

Далее в этой главе мы рассмотрим методы решения систем ли нейных уравнений, наиболее часто используемые в современных ал горитмах факторизации и дискретного логарифмирования. Кроме того, в § 11.2 мы опишем методы решения систем линейных уравнений в це лых числах.

§ 11.2. Решение систем линейных уравнений в целых ч ислах В этом параграфе мы рассмотрим два алгоритма решения систем линейных уравнений над кольцом целых чисел. По сути эти алгоритмы являются обобщениями алгоритма Евклида.

Сначала рассмотрим случай, когда система состоит из одного урав нения a1x1 +... + anxn = d, (11.5) где a1,..., an, d Z. Мы хотим описать алгоритм нахождения всех ре шений (11.5) в целых числах x1,..., xn. Для этого составим матрицу a1... an A =.1..............

0... размера (n + 1) n, у которой в первой строке стоят коэффициенты a1,..., an, а под ними единичная матрица. За один проход алгоритма мы выполняем следующие действия.

1) Выбираем в первой строке матрицы A наименьший по абсолютной величине ненулевой элемент ai.

2) Выбираем номер j = i такой, что aj = 0.

18* 276 Гл. 11. Решение систем линейных уравнений над конечными полями 3) Делим с остатком: aj = qai + r, 0 r < |ai|.

4) Вычитаем из j-го столбца матрицы A i-й столбец, умноженный на q.

В результате этих действий получится новая матрица A, у которой на месте элемента aj появится либо 0 (если r = 0), либо элемент, кото рый будет меньше модуля самого маленького по абсолютной величине ненулевого элемента первой строки у предыдущей матрицы A.

Очевидно, что после нескольких проходов алгоритма (т. е. несколь ких выполнений действий 1 4), исходная матрица A превратится — в матрицу 0... 0 0... 0...... c11... c1,s-1 c1s c1,s+1... c1n, (11.6)................................ = C cn1... cn,s-1 cns cn,s+1... cnn где, cij Z, = 0. Если d, то система (11.5) не имеет решений в це лых числах. Если же | d, то общее решение системы (11.5) в целых числах имеет вид x d...

= tc1 +... + ts-1cs-1 + cs + ts+1cs+1 +... + tncn, (11.7) xn где t1,..., ts-1, ts+1,..., tn пробегают все целые числа, а векторы c1,..., cn обозначают столбцы матрицы C из (11.6).

Докажем, что формула (11.7) действительно дает все решения си стемы (11.5) в целых числах. Очевидно, что в результате одного прохода алгоритма (т. е. выполнения действий 1 4) матрица A переходит в мат — рицу ADij, где у матрицы Dij размера n n на диагонали стоят единицы, элемент в i-й строке и j-м столбце равен -q, а все остальные эле менты равны 0. Матрица Dij является целочисленной с определителем det Dij = 1;

значит, обратная матрица D-1 также целочисленная. Запи ij шем уравнение (11.5) в векторном виде:

x...

(a1,..., an) = b.

xn Тогда x...

(a1,..., an)DijD-1 = b.

ij xn § 11.2. Решение систем линейных уравнений в целых числах Рассмотрим новые переменные y1 x......

= D-1.

ij yn xn Относительно этих переменных получим уравнение a y1 +... + a yn = b, 1 n где (a,..., a ) = (a1,..., an)Dij. Значения y1,..., yn являются цело 1 n численными тогда и только тогда, когда x1,..., xn Z.

Если мы выполнили k проходов алгоритма для значений индек сов i1, j1, i2, j2,..., ik, jk, то пришли к системе уравнений относительно неизвестных z1,..., zn, z1 x......

= D-1... D-1.

ikjk i1j zn xn Если при этом первая строка матрицы A стала равной (0,..., 0,, 0,..., 0) = (a1,..., an)Di j1... Di jk, 1 k то система уравнений примет вид z1 = b. (11.8) Если b, то решений нет, а если | b, то общее решение (11.8) имеет b вид (z1,..., zn) = t1,..., ts-1,, ts+1,..., tn, где t1,..., tn пробега ют все целые числа. Тогда t...

ts- x...

= Di,j1... Di,jk b.

/ 1 k ts+ xn...

tn Осталось лишь заметить, что матрица C из (11.6) ра вна Di,j1... Di-k,j, 1 k поскольку с остальными строками исходной матрицы A мы делали те же действия, что и с первой строкой, т. е. единичная (n n)-подматрица матрицы A последовательно умножалась на Di j1, Di j2,..., Di jk.

1 2 k 278 Гл. 11. Решение систем линейных уравнений над конечными полями Теперь рассмотрим произвольную систему линейных уравнений a x1 +... + a1nxn = b1,........................ (11.9) a x1 +... + amnxn = bm, m где aij, bl Z. Опишем алгоритм нахождения всех решений (11.9) в це лых числах. Составим матрицу A размера m n и матрицу B размера (m + n) (n + 1), в которой под матрицей A стоит единичная матрица размера n n:

-b A...

a11... a1n -bm.

.

A =..........., B = 1... 0 am1... amn.............

0... 1 Спервымиn столбцами матрицы B можно производить следующие дей ствия:

1) переставлять их;

2) вычитать из одного столбца другой, умноженный на целое число.

Также можно переставлять какие-либо из первых m строк матрицы B.

С помощью этих действий мы преобразуем матрицу B к ча стично треугольному виду u11 0... 0 0... 0 -b u21 u22... 0 0... 0 -b..................................................

uk1 uk2... ukk 0... 0 -b k uk+1,1 uk+1,2... uk+1,k 0... 0 -b k+ B1 =.................................................. (11.10) um1 um2... umk 0... 0 -b m c11 c12... c1k c1,k+1... c1n..................................................

cn1 cn2... cnk cn,k+1... cnn при некотором k 1, k min(m, n), и u11 = 0,..., ukk = 0. (Элементы b,..., b перестановка элементов b1,..., bm, которая получилась, — 1 m когда мы переставляли первые m строк матрицы B.) Для того что бы привести B к виду (11.10), надо сначала в первой строке B (без § 11.2. Решение систем линейных уравнений в целых числах последнего элемента -b1) обнулить все элементы, кроме одного (как в предыдущем алгоритме), и потом столбец, содержащий этот нену левой элемент, поставить на первое место. Затем так же поступить со второй строкой получившейся матрицы (не затрагивая ее первый столбец) и т. д.

После того как матрица B1 вида (11.10) построена, мы преобразуем ее к виду u11 0... 0 0... u21 u22... 0 0.............................................

uk1 uk2... ukk 0... uk+1,1 uk+1,2... uk+1,k 0... B2 =........................................... (11.11) um1 um2... umm 0... c11 c12... c1k c1,k+1... f1n..........................................

cn1 cn2... cnk cn,k+1... fnn Для этого мы умножаем первые k столбцов матрицы B1 на целые числа и прибавляем их к последнему столбцу. Точнее, сначала мы прибавля ем первый столбец B2, умноженный на число b u11, которое должно / быть целым, к последнему столбцу и получаем ноль в первом элемен те (n + 1)-го столбца. Затем с помощью второго столбца и элемен та u22 мы получаем ноль во втором элементе (n + 1)-го столбца и так далее.

Если такой переход от матрицы (11.10) к матрице (11.11) указанным способом невозможен, то система (11.9) не имеет решений в целых числах. Если же мы нашли матрицу B2 из (11.11), то общее решение системы (11.9) в целых числах имеет вид x1 f1 c1,k+1 c1n...... = + t1... +... + tn-k..., xn fn cn,k+1 cnn где t1,..., tn-k пробегают все множество целых чисел.

Обоснование данного алгоритма решения системы (11.9) аналогич но обоснованию алгоритма решения (11.5);

мы предлагаем читателю придумать это обоснование самостоятельно.

280 Гл. 11. Решение систем линейных уравнений над конечными полями § 11.3. Гауссово и структурированное гауссово исключение Пусть K произвольное поле. Рассмотрим систему линейных урав — нений n aijxj = bi, i = 1,..., m (11.12) j= над полем K. Общеизвестным методом решения этой системы являет ся гауссово исключение, т. е. приведение системы к треугольному виду.

Сложность этого метода составляет O(mn2) арифметических операций в поле K. С помощью приведения к треугольному виду можно также вычислять определитель квадратной матрицы размера n n за O(n3) арифметических операций, находить обратную матрицу, находить ядро и образ линейного отображения конечномерных линейных пространств.

Мы не приводим здесь соответствующие алгоритмы ввиду их очевидно сти и общеизвестности. При желании эти алгоритмы можно найти в [6;

19;

89, гл. 2].

Применительно к решению систем линейных уравнений, возникаю щих в алгоритмах дискретного логарифмирования, был разработан ме тод структурированного гауссова исключения, см. [210;

151;

150].

Этот метод применяется в случае, когда матрица системы уравнений является разреженной. Суть его заключается в следующем. Столбцы матрицы коэффициентов системы уравнений разбиваются на легкие « » (содержащие мало ненулевых элементов) и тяжелые. Неизвестные xj, « » соответствующие легким столбцам, мы также называем легкими, « » « » а соответствующие тяжелым тяжелыми неизвестными. Строки « » « » — матрицы (соответствующие линейным уравнениям) мы также разделяем на2 категории: на легкую и тяжелую часть матрицы. Первоначаль « » « » но в легкую часть матрицы мы относим все те уравнения, которые « » содержат какую-либо из переменных, встречающихся только в одном из уравнений системы (это означает, что такая переменная с помощью данного уравнения однозначно выражается через остальные). Столбец, соответствующий такой переменной, содержит лишь один ненулевой элемент;

мы объявляем его легким.

« » Далее, возьмем какой-либо из столбцов, не являющихся легки « ми, но такой, что в нем все же мало ненулевых элементов. При этом » столбец выбирается так, чтобы одна из строк, содержащих его нену левые элементы, содержала нули почти во всех других столбцах. То гда, вычитая строки матрицы, умноженные на подходящие числа, мы § 11.4. Алгоритм Ланцоша можем сделать так, чтобы в этом столбце все элементы, за исключени ем одного, соответствующего выбранной строке, стали равными нулю.

После этого данный столбец станет легким, и соответствующая его « » ненулевому элементу строка также объявляется легкой. Другие же « » столбцы в большинстве своем не утяжелятся ввиду выбора строки, ко торую мы вычитали из других. Переносим эту строку в легкую часть « » матрицы. Так мы получим еще несколько легких столбцов. Одна « » ко, поскольку мы вычитали строки матрицы, в ней появится некоторое количество новых ненулевых элементов. То есть матрица станет менее разреженной, чем была ранее. Тогда мы некоторые строки переносим в тяжелую часть матрицы. Эти строки мы выбираем так, чтобы они « » имели наибольшее количество ненулевых элементов в наиболее разре женных столбцах. В результате перенесения строк в тяжелую часть « » эти столбцы станут еще более разреженными в легкой части матри « » цы. Тогда мы сделаем некоторые из них легкими (описанным выше « » способом, т. е. вычитанием строк), и так далее.

Через некоторое время в нашей системе линейных уравнений вы делится подматрица, матрица которой уже не является разреженной, и переменные этой подсистемы являются тяжелыми (т. е. тяжелы « » « ми являются соответствующие им столбцы). Тогда мы решим эту си » стему каким-нибудь способом (например, гауссовым исключением или с помощью алгоритма Ланцоша). Найдя значения тяжелых перемен « » ных, мы затем с помощью легкой части матрицы найдем и легкие « » « » переменные.

Такова приблизительная схема метода структурированного гауссова исключения. Эффективность ее реализации во многом зависит от ква лификации программиста.

Структурированное гауссово исключение применялось не только в алгоритмах дискретного логарифмирования, но и при факторизации методом решета числового поля, см. [162;

159].

§ 11.4. Алгоритм Ланцоша Алгоритм Ланцоша впервые был описан в работе [153]. Впослед ствии этот алгоритм был модифицирован таким образом, чтобы приме няться для решения систем линейных уравнений, возникающих в алго ритмах факторизации и дискретного логарифмирования, см. [150;

104;

276]. В работе [193] описан блочный алгоритм Ланцоша, который яв ляется эффективным при решении линейных систем над полем GF(2).

282 Гл. 11. Решение систем линейных уравнений над конечными полями В работе [104] описана модификация алгоритма Ланцоша, допускаю щая распараллеливание.

Пусть K поле, A матрица размера n n над K, b n-мерный — — — вектор, b = 0. Мы хотим решить систему линейных уравнений Ax = b. (11.13) Предположим дополнительно, что матрица A симметричная, а век — тор b удовлетворяет условию bTAb = 0. Рассмотрим последователь ность Крылова S, состоящую из n-мерных векторов s0, s1, s2,..., где s0 = b, si = Aib = Asi-1, i = 1, 2,... (11.14) Лемма 11.1. Пусть m N, s0,..., sm-1 линейно независимы — над K, а s0,..., sm линейно зависимы. Тогда любой элемент — из множества S линейно выражается через s0,..., sm-1.

m- Доказательство. Поскольку sm = jsj, где j K, то в си j= m-2 m- лу (11.14) получа ем, что sm+1 = Asm = jsj+1 + m-1 jsj. Да ль j=0 j= нейшие рассуждения очевидны.

Везде далее параметр m из условия леммы 11.1.

— n Рассмотрим стандартное скалярное произведение (x, y) = xiyi, i= где x = (x1,..., xn), y = (y1,..., yn). Для векторов x и y положим (x, y)A = (x, Ay) = xTAy = (Ax, y) K;

выражение (x, y)A мы также будем называть скалярным произведением векторов.

Попробуем ортогонализировать последовательность Крылова отно сительно скалярного произведения (x, y)A методом Грама Шмидта, — т. е. найти последовательность векторов w0, w1, w2,..., удовлетворя ющую условию (wi, wj)A = 0 при i = j (11.15) и такую, что w0 = s0, w1 = s1 - 10w0,.......................... (11.16) w = si - i0w0 - - i,i-1wi-1,...

i.................................

§ 11.4. Алгоритм Ланцоша где ij K. При этом, если i > j и (wi, wj)A = 0, то коэффициент ij мы будем определять с помощью равенства (wi, wj)A = (si, wj)A - ij (wj, wj)A = 0.

Процесс ортогонализации можно продолжать до тех пор, пока мы не дойдем до номера k такого, что (wk, wk)A = 0. (11.17) Лемма 11.2. В процессе ортогонализации при некотором k m будет выполнено равенство (11.17).

Доказательство. В силу (11.16) векторы s0,..., si выража ются через векторы w0,..., wi с помощью треугольной матрицы, на диагонали которой стоят единицы. Поэтому векторы w0,..., wi линейно независимы тогда и только тогда, когда s0,..., si линей но независимы. Предположим, что мы нашли векторы w0,..., wm, т. е. при k < m равенство (11.17) не выполняется.Следовательно, век торы w0,..., wm-1 линейно независимы, а w0,..., wm зависимы, m- и поэтому wm = ciwi, ci K. Но отсюда в силу ортогональности i= 0 = (wm, wi) = ci, i = 0,..., m - 1, т. е. wm = 0.

Лемма 11.3. Пусть процесс ортогонализации закончился век тором wk. Если wk = 0, то k = m;

если же wk = 0, то k < m.

Доказательство. Из доказательства леммы 11.2 следует, что при k < m вектор wk не может быть равен нулю, так как s0,..., sk линейно независимы. Поэтому, если wk = 0, то k = m. Если же k = m, то wm = (см. доказательство леммы 11.2).

Вернемся к системе уравнений (11.13). Предположим, что ее реше ние имеет при некотором r 0 вид r x = ciwi, ci K. (11.18) i= r Так как Ax = ciAwi = b, то i= r (wi, b) = wi, cjAwj = ci (wi, wi)A.

j= При (wi, wi)A = 0 мы получим, что ci = (wi, b) (wi, wi)A. Теперь мы / 284 Гл. 11. Решение систем линейных уравнений над конечными полями можем предположить, что решение (11.13) имеет вид r (wi, b) x = wi. (11.19) (wi, wi) i= Лемма 11.4. Пусть процесс ортогонализации завершился при k = m, при этом были построены линейно независимые векторы w0,..., wm-1, а wm = 0. Тогда формула (11.19) при r = m - 1 дает решение (11.13).

Доказательство. Для вектора x из (11.19) выполняются равенства m- (wj, b) (wi, Ax) = (wi, Awj) = (wi, b), i = 0,..., m - 1.

(wj, wj)A j= Поэтому вектор Ax - b ортогонален (относительно стандартного ска лярного произведения) векторам w0,..., wm-1, и, значит, ортогонален линейному пространству =Lоб (S). Так как A, то для любого w выполнено равенство (Aw, Ax - b) = 0. (11.20) m- Поскольку b = s0 и Ax, то вектор Ax - b = iwi, i K.

i= Из (11.20) и симметричности матрицы A следует, что m-1 m- 0 = Awj, iwi = i (wj, wi)A = j (wj, wj)A, j = 0,..., m - 1.

i=0 i= Поэтому 0 =... = m-1 = 0, Ax = b, что и требова лось дока за ть.

Замечание 11.5. Если в процессе ортогонализации последователь ности Крыловамы получим нулевой вектор, то найдем решение системы уравнений (11.13).

Алгоритм Ланцоша основан на некоторой модификации процес са ортогонализации (11.16). Рассмотрим последовательность векторов w, w,..., удовлетворяющую равенствам 0 w = s0 = b, w = Aw - 10w, 1 0......................... (11.21) w Aw i- = - ijw, i i-1 j=0 j.........................

§ 11.4. Алгоритм Ланцоша (где K) и являющуюся ортогональной, т. е.

ij (w, w )A = 0 при i = j. (11.22) i j Коэффициенты находятся по формуле ij (Aw, w )A i-1 j =, (11.23) ij (w, w )A j j при условии, что (w, w )A = 0.

j j Лемма 11.6. Если для номера i векторы wi и w определены, i то w = wi.

i Доказательство. Для i = 0 выполняется равенство w = s0 = w0.

Предположим, что w = wi при всех i t, и пусть wt+1 и w опреде i t+ t лены. Тогда w = Awt - wj. Поскольку векторы wi удовле t+1 t+1,j j= t- творяют (11.16) и si = Aib, то Awt = At+1b - A tlwl = At+1b l= t - wl при некоторых K. Следовательно, w = At+1b tl tl t+ l= t - wl. Для вектора wt+1 из (11.16) выполняется аналогичное ра t+1,l l= t t венство wt+1 = At+1b - t+1,lwl. Тогдавектор w - wt+1 = lwl t+ l=0 l= (где l K) по предположению индукции ортогонален векторам w0,...

t..., wt. Значит, 0 = lwl, wj = j (wj, wj)A = 0 при j = 0,..., t.

l= A Так как (wj, wj)A = 0, то j = 0, j = 0,..., l, и w = wt+1.

t+ Из (11.21), (11.22) и леммы 11.6 получим, что если векторы wi и w i определены, то формула (11.23) может быть записана в виде (Awi-1, wj)A =, 0 j i - 1. (11.24) ij (wj, wj)A Следовательно, при j i - 1 выполнено равенство j (wi-1, Awj)A (wi-1, wj+1 + l=0 wl)A j+1,l = =.

ij (wj, wj)A (wj, wj)A 286 Гл. 11. Решение систем линейных уравнений над конечными полями Отсюда при j + 1 < i - 1 следует, что = 0. Это означает, что форму ij ла (11.21) имеет вид (wi-1, Awi-1)A (wi-1, Awi-2)A) wi = Awi-1 - wi-1 - wi-2, (11.25) (wi-1, wi-1)A (wi-2, Awi-2)A т. е. содержит лишь три слагаемых в правой части. Поэтому вычис ления по ней проводятся быстрее, чем непосредственно по форму лам (11.16).

Алгоритм Ланцоша работает следующим образом. Мы вычисляем последовательность векторов w0 = b, w1, w2,..., пользуясь формула ми (11.21), (11.23), (11.25) (в предположении, что выполнены условия леммы 11.6). Если на некотором шаге будет построен вектор wi = такой, что (wi, wi)A = 0, то мы не сможем найти решение (11.13) этим методом. Если же будет построен вектор wm = 0, то решение x мы находим по формуле (11.19) при r = m - 1. При этом следует сде лать проверку, поскольку мы предполагаем выполнение некоторых условий.

В алгоритмах факторизации и дискретного логарифмирования мат рица A системы (11.13) не является симметричной (и даже квадратной).

В этом случае предлагается случайным образом выбрать диагональную матрицу D и рассмотреть систему уравнений ATD2Ax = ATD2b. (11.26) Ее матрица ATD2A = (DA)TDA будет квадратной и симметрич ной, и к системе (11.26) мы затем применяем алгоритм Ланцоша.

Если алгоритм закончится неудачей либо найденный вектор x не будет решением (11.13), то следует выбрать другую мат рицу D.

Однородная система Ax = 0 может быть преобразована в неодно родную в предположении, что в ее решении (x1,..., xn) последняя ко ордината xn = 0. Положив тогда xn = 1, мы сможем перенести столбец соответствующих xn коэффициентов в правую часть и затем применить алгоритм Ланцоша.

Дальнейшее обсуждение деталей реализации алгоритма Ланцоша можно найти в прекрасной диссертации [104].

Заметим, что последние рекорды в области дискретного логариф мирования в простых полях были достигнуты с помощью алгоритма Ланцоша (см. выше гл. 5).

§ 11.5. Алгоритм Видемана § 11.5. Алгоритм Видемана В этом параграфе мы опишем алгоритм Видемана [281] для решения системы линейных уравнений Ax = b, b = 0, (11.27) над конечным полем K = GF(q). Матрица A предполагается раз реженной;

w обозначает число ненулевых элементов A. Мы будем считать, что A квадратная размера n n и невырожденная;

рассмот рение других случаев, а также алгоритм вычисления определителя матрицы можно найти в работе [281]. Полученные Видеманом оцен ки сложности алгоритмов являются наилучшими из известных, и их применение позволяет улучшать оценки сложности в других алгорит мах, использующих методы решения линейных систем. В частности, описываемый ниже алгоритм 2 является детерминированным и тре бует O(n(w + n log n log log n)) операций поля. Заметим, что первое время после появления работы [281] алгоритмы Видемана считались непрактичными и полезными лишь для получения наилучших оценок сложности. Однако в последние годы алгоритмы были реализованы на компьютере и использовались, например, для разложения много членов на множители над конечными полями, см. [139]. Появились различные модификации, в частности, блочный алгоритм Видемана, см. [96;

105;

138;

140;

177].

Вернемся к решению системы (11.27). Матрица A задает невы рожденное линейное отображение (которое мы также обозначаем A) на пространстве Kn. Рассмотрим пространство S, порожденное мно жеством векторов {Aib | i = 0, 1, 2,...}, и положим AS = A|S линей — ное отображение S на S. Обозначим f(z) K[z] минимальный мно — гочлен AS, т. е. ненулевой многочлен наименьшей степени, такой, что f(AS) нулевое отображение S. Мы считаем f(z) нормализованным — таким образом, что его свободный член равен 1. Заметим, что если g(z) K[z], то g(AS) нулевое отображение S тогда и только тогда, — когда g(A)b = 0. Кроме того, f(z) делит многочлен det(zIn - A), и по этому deg f(z) n.

d Обозначим d = deg f(z), f(z) = f [i]zi, где f [i] K коэффициенты — i= f(z). Если мы сможем найти f(z), то найдем и решение системы (11.27):

так как f(A)b = 0 и f [0] = 1, то d x = - f [i]Ai-1b. (11.28) i= 288 Гл. 11. Решение систем линейных уравнений над конечными полями Пусть u какой-либо фиксированный вектор из Kn;

(·, ·) стан — — дартное билинейное отображение Kn в K, n ((v1,..., vn), (w1,..., wn)) = viwi.

i= Поскольку f(A)b = 0, то последовательность (u, Aib), i = 0, 1, 2,... (11.29) удовлетворяет линейному рекуррентному соотношению, характеристи ческий многочлен которого равен f(z). Пусть fu(z) минимальный мно — гочлен для последовательности (11.29) (т. е. характеристический мно гочлен самого короткого рекуррентного соотношения). Тогда fu | f(z).

Действительно, если мы разделим с остатком f(z) = q(z)fu (z) + r(z), deg r(z) < deg fu(z), то из равенств 0 = (u, f(A)b) = (u, q(A)fu (A)b) + (u, r(A)b), (u, fu (A)Ajb) = 0, j = 0, 1, 2,..., и минимальности fu(z) будет следовать, что r(z) = 0. Поскольку сво бодный член f(z) равен 1, мы можем считать, что и свободный член fu равен 1.

Минимальный многочлен fu (z) для последовательности (11.29) мо жет быть вычислен с помощью алгоритма Берлекэмпа Месси (см. [7;

— 31, гл. 2;

175]) по первым 2n ее членам. Поэтому возможен следую щий метод решения (11.27): выбрать случайный вектор u, построить fu (z) и в предположении, что f(z) = fu (z), найти x по формуле (11.28).

Согласно [281], мы этим путем с достаточно высокой вероятностью найдем решение системы (11.27).

Рассмотрим другой подход к решению (11.27). Пусть b0 = b, f1 (z) = fu (z) для некоторого вектора u1. Если вектор b1 = f1 (A)b0 ра вен 0, то мы находим x по формуле (11.28) (та к ка к тогда f1 (z) = f(z)).

Если же b1 = 0, то повторяем процедуру, т. е. выбираем случайный вектор u2 и строим минимальный многочлен f2(z) = fu (z) для последо вательности (u2, Aib1). Если b2 = f2 (A)b1 = 0, то (как будет показано ниже) f(z) = f1 (z)f2 (z) и мы находим решение x по формуле (11.28), иначе выбираем u3 и т. д.

§ 11.5. Алгоритм Видемана Покажем, что если мы сделали k итераций, то f1 (z)... fk (z) де лит f(z). Действительно, выше было показано, что f1 (z) | f(z). Да лее, если мы предположим, что f1(z)... fk-1(z) делит f(z), то по скольку fk (z) минимальный многочлен для последовательности — f(z) {(uk, Aibk-1)}i = {(uk, fk-1 (A)...f1 (A)Ajb)}j, а многочлен f1 (z)... fk-1 (z) f(z) ее аннулирует, то fk (z), что и требовалось дока f1 (z)... fk-1 (z) зать.

Теперь очевидно, что если bk = fk (A)... f1(A)b = 0, то f(x) = f1 (x)...

... fk (x). Следовательно, как только будет построен нулевой вектор bk = fk (A)bk-1, мы сможем найти решение (11.27) по формуле (11.28).

Формализуем сказанное в виде алгоритма 1. Для произвольного g(z) - g(0) многочлена g(z) K[z] мы будем обозначать (z) =.

z Алгоритм 1.

1 шаг. Присвоить b0 := b, k := 0, y0 := 0, d0 := 0.

2 шаг. Если bk = 0, то решение (11.27) ра вно x = -yk, и алгоритм завершает работу.

3 шаг. Выбрать случайный вектор uk+1 Kn, uk+1 = 0.

4 шаг. Вычислить первые 2(n - dk) членов последовательности {(uk+1, Aibk)}i=0,1,2,...

5 шаг. С помощью алгоритма Берлекэмпа Месси вычислить ми — нимальный многочлен fk+1 (z) последовательности шага 4, нормализо ванный так, чтобы его свободный член равнялся единице.

6 шаг. Присвоить yk+1 := yk + f (A)bk, k+ bk+1 := b0 + Ayk+1, dk+1 := dk + deg fk+1(z).

7 шаг. Присвоить k := k + 1 и вернуться на 2 шаг.

Конец алгоритма.

Приведем обоснование корректности алгоритма. Заметим, что f(z) - f(0) f (z) = соответствует правой части формулы (11.28) (без зна ка z минус). При k = 0 мы выбираем u1, рассматриваем 2n членов последо вательности {(u1, Aib)}i=0,1,... и на ходимf1 (x) по алгоритму Берлекэм f1 (A) - па Месси. Тогда y1 = f (A)b, b1 = b0 + Ay1 = b + A b = f1(A)b, — A d1 = deg f1(z). Далее рассуждаем по индукции. Пусть после k проходов 19 О. Н. Василенко 290 Гл. 11. Решение систем линейных уравнений над конечными полями алгоритма выполнены равенства fk (A)... f1 (A) - yk = b, (11.30) A bk = fk(A)... f1(A) b. (11.31) Тогда после k + 1 прохода yk+1 = yk + f (A)bk = k+ fk (A)... f1 (A) - 1 fk+1 (A) - 1 fk+1 (A)... f1 (A) - = b + fk (A)... f1(A)b = b, A A A fk+1 (A)... f1 (A) - bk+1 = b + A b = fk+1 (A)... f1(A)b.

A То есть формулы (11.30) и (11.31) сохраняются. Корректность алгорит ма 1 следует теперь из сказанного выше перед его описанием.

Теперь опишем детерминированный алгоритм.

Алгоритм 2.

1 шаг. Вычислить Aib, i = 0, 1,..., 2n - 1.

2 шаг. Присвоить k := 0, g0(z) := 1.

3 шаг. Присвоить uk+1 := (0,..., 0, 1, 0,..., 0) (единица стоит на (k + 1)-м месте).

4 шаг. Используя результаты 1-го шага, вычислить последователь ность (uk+1, Aib), i = 0, 1,..., 2n - 1.

5 шаг. Вычислить последовательность (uk+1, gk (A)Aib), i = 0,..., 2n - 1 - deg gk (z) (здесь можно использовать дискретное преобразование Фурье, см. [281]).

6 шаг. Найти (с помощью алгоритма Берлекэмпа Месси) ми — нимальный многочлен fk+1 (z) для последовательности, полученной на 5-м шаге (свободный член fk+1 (z) ра вен 1).

7 шаг. Присвоить gk+1 (z) := fk+1 (z)gk (z).

8 шаг. Присвоить k := k + 1. Если deg gk (z) < n и k < n, то идти на 3 шаг.

9 шаг. Для многочлена f(z) = gk (z) с помощью найденных на 1 шаге значений Aib найти решение x системы (11.27) по формуле (11.28).

Конец алгоритма.

Обоснуем корректность алгоритма 2. Заметим, что фактически алго ритм 2 работает так же, как алгоритм 1, только векторы uk выбираются § 11.6. Другие методы. Заключение не случайно, а идет перебор единичных векторов (0,..., 0, 1, 0,..., 0).

Легко видеть, что gk (z) = fk (z)... f1(z), где fk (z) минимальный мно — гочлен для последовательности (uk, fk-1(A)... f1(A)Aib), i = 0,..., 2n - 1 - deg(fk-1(z)... f1 (z)).

Пусть алгоритм закончил работу при некотором значении параметра k.

Рассмотрим сначала случай k < n и deg gk (z) = n. Та к ка к deg f(z) n и gk (z) | f(z), то gk (z) = f(z). Следовательно, на 9 шаге действительно будет найдено решение (11.27).

Теперь предположим, что k = n. Поскольку мы перебрали все еди ничные векторы u1,..., un, то вектор gn (A)b ортогонален u1,..., un (очевидно по построению). Следовательно, gn (A)b = 0. Так как gn (z) | f(z) и f(z) минимальный, то gk (z) = f(z). Поэтому и в дан — ном случае алгоритм 2 работает корректно.

На этом мы закончим описание алгоритмов Видемана. Получение оценок сложности для них можно найти в работе [281].

§ 11.6. Другие методы. Заключение Обзор методов решения систем линейных уравнений примени тельно к алгоритмам факторизации и дискретного логарифмирования содержится в работе [150]. Отметим, в частности метод сопряженных градиентов (см. [97;

210]), работающий, согласно [151], пример но столько же времени, сколько и алгоритм Ланцоша. Оба эти алгоритма используют сравнительно небольшое пространство па мяти.

Другие методы решения линейных систем основаны на алгоритмах быстрого умножения матриц, таких, как алгоритмы Штрассена и Коп персмита Винограда (см. обзор [2]). В работе Коновальцева [26] — предложен алгоритм решения квадратной системы линейных уравне ний с n неизвестными над полем GF(q) за O(n3 logq n) арифметических / операций. Бриллхарт [78] предложил алгоритм решения линейных си стем над GF(2), являющийся, по сути, некоторой вариацией гауссова исключения;

см. также [212].

Обсуждение возможностей применения различных методов решения систем линейных уравнений в алгоритмах факторизации и дискретно го логарифмирования можно найти в недавних обзорах [74] и [209].

В последние годы предпочтение все же отдается методу Ланцоша (воз можно, в сочетании со структурированным гауссовым исключением для получения более плотной матрицы подсистемы).

19* Приложение. Сведения из теории чисел В данном Приложении мы приводим основные определения и факты из элементарной теории чисел, наиболее часто используемые в кни ге. Доказательства теорем можно найти в [18]. Также мы описываем ряд усовершенствований алгоритма Евклида;

их обоснование см. в [25, гл. 4.5.2;

60, гл. 4;

89, гл. 1].

Начнем с алгоритма Евклида. Пусть a Z, b N, имыхотимна й ти d = НОД(a, b). Разделим a на b с оста тком: a = q0b + r0, 0 r0 < b.

Если r0 > 0, то разделим b на r0: b = q1r0 + r1, 0 r1 < r0, и т. д. По лучим последовательность равенств с убывающими остатками rj:

rj-2 = qjrj-1 + rj, j = 0, 1, 2...,(1) где r-2 = a, r-1 = b. Если rk последний ненулевой остаток, то rk-1 = — = qk+1rk. Тогда справедливо равенство d = НОД(a, b) = rk. Вычисле ние последовательности (1) и есть алгоритм Евклида.

Теперь найдем представление d = rk в виде d = au + bv, где u, v Z.

Мы можем последовательно выражать rk из (1), поднимаясь снизу вверх: сначала через rk-1 и rk-2 из предпоследнего равенства в (1);

за тем, подставив rk-1 = rk-3 - qk-1rk-2, мывыра зимrk через rk-2 и rk-3, и так далее. В конце мы выразим rk через a и b.

Однако более удобен обобщенный алгоритм Евклида. Внем мы работаем с системой равенств u a + u2b = u3, v1a + v2b = v3, (2) t a + t2b = t3.

На 1 шаге полагаем (u1, u2, u3) := (1, 0, a), (v1, v2, v3) := (0, 1, b), (t1, t2, t3) := (0, 0, 0).

Затем при очередном проходе алгоритма мы проверяем условие v3 = 0.

Если оно выполнено, то искомые значения d, u, v равны u3, u1, u соответственно. Если же v3 = 0, то производим деление с остатком:

Приложение u3 = qv3 + r. Затем присваиваем:

(t1, t2, t3) := (v1, v2, v3), (v1, v2, v3) := (u1 - qv1, u2 - qv2, u3 - qv3), (u1, u2, u3) := (t1, t2, t3).

Поскольку значение v3 Z 0 монотонно убывает, то алгоритм закан чивает работу и выдает верный ответ. Заметим, что с переменными u2, v2, t2 можно не работать, поскольку их значения однозначно вос станавливаются по u1, u3, v1, v3, t1, t3 соответственно.

Теорема 1 (Ламе). Параметр k в формуле (1) удовлетворяет неравенству k 5([log10 b] + 1).

Следствие 2. Для выполнения алгоритма Евклида и обобщен ного алгоритма Евклида требуется O(log b) арифметических операций.

Замечание 3. В алгоритме Евклида можно использовать деление с выбором наименьшего по абсолютной величине остатка: при каждом делении какого-либо целого числа a на какое-либо натуральное чис ло b мы находим q, r Z такие, что a = q b + r, 0 |r | b 2. Это / ускоряет работу алгоритма Евклида.

Теперь перейдем к сравнениям.

Определение 4. Пусть a, b Z, m N. Мы говорим, что aсравни мо с b по модулю m (и обозначаем это a b (mod m)), если m | a - b, или, эквивалентно, a и b имеют одинаковые остатки от деления на m;

или, эквивалентно, a = b + mt, где t Z.

Если m фиксировано, то Z разбивается на классы 0, 1,..., m - чисел, имеющих остатки 0, 1,..., m - 1 от деления на m. Эти клас сы вычетов образуют Z mZ кольцо вычетов по модулю m. Для a Z / — символом a (mod m) мы обозначаем класс вычетов по модулю m, содер жащий a. Обратимые по умножению элементы Z mZ образуют муль / типликативную группу (Z mZ). Число a Z является элементом об / ратимого по умножению класса вычетов по модулю m тогда и только тогда, когда разрешимо уравнение ax 1 (mod m). (3) Уравнение (3) разрешимо тогда и только тогда, когда (a, m) = 1. Реше ние (3) можно найти с помощью обобщенного алгоритма Евклида: мы находим u, v Z такие, что au + mv = 1, и тогда a (mod m)u (mod m) 1 (mod m), т. е. u a-1 (mod m).

294 Приложение Полной системой вычетов по модулю m мы называем какой либо набор целых чисел a1,..., am, попарно не сравнимых по моду лю m. Приведенной системой вычетов по модулю m мы называем какой-либо набор целых чисел b1,..., bk, где k = |(Z mZ)|, попарно / не сравнимых по модулю m и взаимно простых с m.

Теперь определим функцию Эйлера (m): если m N, то (m) = = |(Z mZ)|. Эквивалентно, (m) равна количеству чисел в набо / ре {0, 1,..., m - 1}, взаимно простых с m. В частности, (1) = 1, (p) = p - 1, где p простое число. Справедлива следующая формула — k j для нахождения (m): если m = p разложение m на простые — j j= k множители, то (m) = m (1 - 1 pj).

/ j= Теорема 5 (Эйлер). Если (a, m) = 1, то a (m) 1 (mod m).

Теорема 6 (малая теорема Ферма). Если p простое число, p — не делит a, то ap-1 1 (mod p).

Теорема 7 (китайская теорема об остатках). Рассмотрим си стему сравнений x a1 (mod m1),.................

(4) x ak (mod mk), где (mi, mj) = 1 при всех i = j. Положим M = m1... mk;

Mi = M mi, / i = 1,..., k. Найдем (с помощью обобщенного алгоритма Евклида) числа b1,..., bk такие, что Mibi 1 (mod mi), i = 1,..., k. Тогда общее решение системы (4) в целых числах имеет вид k x Miaibi (mod M), i= k т. е. x = Miaibi + Mt, где t Z.

i= Теперь рассмотрим группу (Z mZ). Она является циклической то / гдаи только тогда, когда m = 1, 2, 4, pk, 2pk, где p обозначает нечетное простое число, k N. Число g Z такое, что класс вычетов g (mod m) является образующим (Z mZ) (в случае, когда эта группа цикличе / — ская), называется первообразным корнем по модулю m.

Приложение Теорема 8. Пусть p простое число, p > 2.

— k j 1) Пусть p - 1 = q есть разложение p - 1 на простые мно j j= жители. Число g является первообразным корнем по модулю p тогда и только тогда, когда j (g, p) = 1, g(p-1)/q 1 (mod p), j = 1,..., k.

2) Пусть g первообразный корень по модулю p, число g — равно тому из чисел g или g + p, которое удовлетворяет сравне нию xp-1 1 (mod p2). Тогда g1 является первообразным корнем по модулю p2.

3) Если число g2 является первообразным корнем по модулю p2, то g2 является первообразным корнем по модулю pk для всех k N.

Теорема 9. Справедливо равенство (Z 4Z) = 3 (mod 4) 2. Да / лее, при k 3 имеем (Z 2kZ) = -1 (mod 2k) 2 5 (mod 2k) 2k- / есть разложение (Z 2kZ) в прямое произведение циклических / групп.

1 k Если m = 2 p... p есть разложение m на простые множители, 1 k то можно указать полную систему образующих группы (Z mZ), зна я / i первообразные корни по модулям p, i = 1,..., k (см. [18, гл.6]).

i Если g первообразный корень по модулю m, a Z, (a, m) = 1, — то решение уравнения gx a (mod m) называется индексом элемента a по основанию g или дискретным логарифмом a по основанию g и обо значается indg a или logg a. Эта величина определена по модулю (m), т. е., indg a Z (m)Z.

/ Пусть m Z. Числовым характером по модулю m называется отображение : Z C со следующими свойствами:

1) (n) = 0 тогда и только тогда, когда (m, n) > 1;

2) (n + m) = (n) для всех n Z;

3) (n1n2) = (n1) (n2) для всех n1, n2 Z.

По сути является характером группы (Z mZ), естественным образом / продолженным на все множество Z.

Теперь рассмотрим символы Лежандра и Якоби.

Пусть p простое число, p > 2. Пусть a Z, (a, p) = 1. Число a — называется квадратичным вычетом по модулю p, если уравнение x2 a (mod p)(5) 296 Приложение разрешимо;

иначе оно называется квадратичным невычетом. Сим a вол Лежандра (где a Z) ра вен +1, если a квадратичный вычет — a p a по модулю p;

= -1, если a квадратичный невычет;

= 0, если — p p a 0 (mod p).

Символ Лежандра обладает следующими свойствами:

1) критерий Эйлера:

a a(p-1)/2 (mod p);

p a b 2) если a b (mod p), то = ;

p p 1 - (p-1) / 3) = 1, = (-1) ;

p p ab a b 4) = ;

p p p (p2-1) / 5) = (-1) ;

p 6) квадратичный закон взаимности Гаусса: если p, q нечет — ные простые числа, p = q, то q p (p-1) (q-1) / = (-1).

p q k j Если m N, m нечетное составное число и m = p есть раз — j j= a ложение m на простые множители, то для a Z символ Якоби m определяется равенством k a j a =.

m pj j= Свойства символа Якоби:

a b 1) если a b (mod m), то = ;

m m - (m-1) / 2) = 1, = (-1) ;

m m ab a b 3) = ;

m m m (m2-1) / 4) = (-1) ;

m 5) если m и n натуральные взаимно простые нечетные числа, то — m n (m-1) (n-1) / = (-1).

n m Приложение Нетрудно написать алгоритмы для вычисления символов Лежанд ра и Якоби, основываясь на их свойствах. Эти алгоритмы приведены, например, в [89, гл. 1].

Пусть m N, f(x) Z[x]. Если мы хотим решить уравнение f(x) 0 (mod m), то с помощью китайской теоремы об остатках мы можем свести нашу задачу к уравнению f(x) 0 (mod p ), где p простое — число, N (это называется редукцией). Если мы знаем решение a уравнения f(x) 0 (mod p ), то можем построить решение a1 уравнения f(x) 0 (mod p +1) (это подъем решения). О редукции и подъеме — решения см. [18, гл. 4]. Наиболее известные методы решения уравнений f(x) 0 (mod p) мы описали в гл. 6 нашей книги.

Теперь приведем определения и факты из теории непрерывных (или цепных) дробей, см., например, [29;

41]. Пусть n Z 0, a0 Z, a1,..., an N. n-членной непрерывной дробью [a0;

a1,..., an] на зывается рациональное число [a0;

a1,..., an] = a0 +.

a1 + a2 +... + an В частности, 0-членная непрерывная дробь [a0;

] = a0 это просто це — лое число.

Теорема 10. Любое рациональное число = 1 представи мо в виде = [a0;

a1,..., an] при некоторых n Z 0, a0 Z, a1,..., an N. Это представление единственно, если считать, что an > 1.

Замечание 11. Число = 1 = [1;

] = [0;

1] разложимо двумя спосо бами, и в каждом разложении последний элемент равен 1. Если = 1, = [a0;

a1,..., an], где an N, an > 1, то также представимо в ви де = [a0;

a1,..., an - 1, 1].

Подходящие дроби к = [a0;

a1,..., an] имеют вид pk qk = / = [a0;

a1,..., ak], k = 0, 1,..., n, причем pk Z, qk N, (pk, qk) = 1.

Для удобства положим p-1 = 1, q-1 = 0. Тогда справедливы соотноше ния p0 = a0, q0 = 1, pk = akpk-1 + pk-2, qk = akqk-1 + qk-2 при k 1, которые позволяют быстро вычислять подходящие дроби.

298 Приложение Подходящие дроби к числу обладают следующими свойствами:

1) pkqk-1 - pk-1qk = (-1)k-1, k = 0, 1,...;

2) pkqk-2 - pk-2qk = (-1)kak, k = 2, 3,...;

3) подходящие дроби с четными номерами возрастают, с нечетны ми убывают;

— 4) любая подходящая дробь с четным номером меньше любой под ходящей дроби с нечетным номером;

5) 1 = q0 q1 < q2 <... < qn;

pk 1 6) - ;

qk qk+1qk q k ak+ pk 7) -.

qk qk+2qk Если a0 Z, a1, a2,... N, то бесконечной непрерывной дробью [a0;

a1, a2,...] называется предел = [a0;

Pages:     | 1 |   ...   | 2 | 3 || 5 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.