Смекни!
smekni.com

Быстрые вычисления с целыми числами и полиномами (стр. 4 из 5)

*(xx0) + a0. (6)

Теперь рассмотрим, как находятся постоянные a в формуле Ньютона. Их можно определить, находя «разделённые разности» и сводя вычисления в следующую таблицу (иллюстрирующую случай n = 3):

y0

(y1y0)/(x1x0) = y¢1

y1 (y2y’1)/(x2x0) = y¢¢2

(y2y1)/(x2x1) = y¢2 (y’’3y’’2)/(x3x0) = y¢¢¢3

y2 (y3y’2)/(x3x1) = y¢¢3

(y3y2)/(x3x2) = y¢3

y3 (7)

Можно доказать, что a0 = y0, a1 = y1, a2 = y2, и т. д. Следовательно, для нахождения величин может быть использована следующая вычислительная процедура (соответствующая таблице (7)):

Начать с того, что установить (a0, a1, …, an) ¬ (y0, y1, … , yn); затем для k = 1, 2, …, n (именно в таком порядке) установить yj¬ (yjyj1)/(xjxjk)для j = n, n – 1, …, k (именно в таком порядке).

Если мы хотим вычислить многочлен u(x) степени nсразу для многих значений x, образующих арифметическую прогрессию (т. е. хотим вычислить u(x0), u(x0 + h), u(x0 + 2h),…), то весь процесс можно после нескольких первых шагов свести к одному только сложению вследствие того факта, что n-я разность от многочлена есть постоянная.

1 Найти коэффициенты bn, …, b1, b0 представления нашего многочлена в виде интерполяционного многочлена Ньютона

u(x) = bn / n! hn(x x0 – (n – 1)h)…(x x0h)(x x0) +…+ b2/ 2! h2**(x x0h)(x x0) + b1/ h2 (x x0) + b0. (8)

(Это можно сделать, беря повторные разности, в точности так же, как мы определяли выше постоянные a в (5) (надо принять xj = x0 + jh), с тем исключением, что все деления на xjxjk из вычислительной процедуры устраняются.)

2 Установить x¬x0.

3 Теперь значением u(x) является b0.

4 Установить bj¬bj + bj + 1 для j= 0, 1, …, n – 1 (именно в таком порядке). Увеличить xна hи вернуться в шаг 3.

4. Дискретное логарифмирование

Пусть p – простое число. Ещё Эйлер знал, что мультипликативная группа кольца циклична, т. е. существуют такие целые числа а, что сравнение

axºb (mod p) (2)

разрешимо относительно x при любом bÎZ, не делящимся на p. Числа а с этим свойством называются первообразными корнями, и количество их равно j(p – 1), где j – функция Эйлера. Целое х, удовлетворяющее сравнению (2), называется индексом или дискретным логарифмом числа b.

Выше мы описали алгоритм, позволяющий по заданному числу xдостаточно быстро вычислять ахmodp. Обратная же операция – вычисление по заданному b его дискретного логарифма, вообще говоря, является очень сложной в вычислительном отношении задачей. Именно это свойство дискретного логарифма и используется в его многочисленных криптографических применениях. Наиболее быстрые (из известных) алгоритмы решения этой задачи, основанные на так называемом методе решета числового поля, требуют выполнения exp(c(lnp)1/3(lnlnp)2/3) арифметических операций, где cнекоторая положительная постоянная. Это сравнимо со сложностью наиболее быстрых алгоритмов разложения чисел на множители. Конечно, указанная оценка сложности получена при условии справедливости ряда достаточно правдоподобных гипотез.

Говоря о сложности задачи дискретного логарифмирования, мы имели в виду «общий случай». Ведь и большое целое число легко может быть разложено на простые сомножители, если все эти сомножители не очень велики. Известен алгоритм, позволяющий быстро решать задачу дискретного логарифмирования, если p – 1 есть произведение малых простых чисел.

Пусть q – простое число, делящее р – 1. Обозначим сºа(p – 1)/q (modp), тогда классы вычетов 1, с, с2, … , сq – 1 все различны и образуют полное множество решений уравнения хq = 1 в поле Fp = Z/Zp. Если q не велико и целое число d удовлетворяет сравнению хqº 1 (modp), то показатель k, 0 £k < q, для которого выполняется dºck (modp), легко может быть найден, например, с помощью перебора. Именно на этом свойстве основан упомянутый выше алгоритм.

Допустим, что р – 1 = qkh, (q,h) = 1. Алгоритм последовательно строит целые числа uj, j = 0,1,…,k, для которых выполняется сравнение

º 1 (modp). (3)

Так как выполняется сравнение º 1 (modp), то найдётся целое число u0, для которого º (modp). При таком выборе сравнение (3) с j = 0, очевидно, выполняется. Предположим, что найдено число uj, удовлетворяющее сравнению (3). Тогда определим t с помощью сравнения

ºct (mod p), (4)

и положим. Имеют место сравнения

ºº 1 (modp), (5)

означающие справедливость (3) при j + 1.

При j = k сравнение означает в силу (2), что º 1 (modp). Целое число а есть первообразный корень по модулю р, поэтому имеем (xuk)hº 0 (modp – 1) и

xºuk (mod qk).

Если , где все простые числа qj малы, то указанная процедура позволяет найти вычеты xmod, i = 1,…,s, и, с помощью китайской теоремы об остатках, вычет xmodp – 1, т. е. решить сравнение (2).

В случае обычных логарифмов в поле действительных чисел имеется специальное основание e = 2,171828…, позволяющее достаточно быстро вычислять логарифмы с произвольной точностью. Например, это можно делать с помощью быстро сходящегося ряда

ln(1+x)/(1 – x) = 2(x + x3/3 + x5/5 + …), |x| < 1. (6)

Логарифмы по произвольному основанию с могут быть вычислены с помощью тождества

logc x = ln x/ ln c. (7)

В случае дискретных логарифмов нет основания, по которому логарифмы вычислялись бы столь же быстро, как натуральные в поле действительных чисел. Вместе с тем, последняя формула, связывающая логарифмы с различными основаниями, остаётся справедливой и позволяет выбирать основание удобным способом. Единственное условие для этого состоит в том, чтобы логарифм нового основания Logc был взаимно прост cp - 1. Тогда в формуле (7) возможно деление по модулю р – 1. Заметим, что это условие будет выполнено, если и только если с – первообразный корень. Из расширенной гипотезы Римана следует, что наименьший первообразный корень по модулю р ограничен величиной O(log6p). Поэтому в дальнейшем для простоты изложения мы будем предполагать, что основание а в (2) невелико, именно а = O(log6p).

Так как поле Fp неполно, вычисление дискретных логарифмов не может использовать предельный переход и основано на иных принципах. Прежде всего, нужный дискретный логарифм logb вычисляется не сам по себе, а вместе с совокупностью логарифмов ряда других чисел. Заметим, что всякое сравнение вида

º (mod p), (8)

где qi, ki, miÎZ приводит к соотношению между логарифмами

(k1m1)Log q1 + … + (ksms)Log qsº 0 (mod p – 1). (9)

А если выполняются сравнения

aº(mod p – 1) bº(mod p),
то

r1Log q1 +…+ rsLog qsº 1 (mod p – 1) (10)

и

Log bº x1Log q1 +…+ xsLog qs (mod p – 1) (11)

Имея достаточно много векторов k1,…,ks,m1,…,ms с условием (8), можно найти решение соответствующей системы сравнений (9), (10). Если эта система имеет единственное решение, то им как раз и будет набор логарифмов Logq1,…,Logqs. Затем с помощью (11) можно найти Logb.