Реферат: Быстрые вычисления с целыми числами и полиномами
--PAGE_BREAK--Справедливость этого алгоритма вытекает из сравнения ai ºa2i-1ad
2^i+…+di
(mod m),
легко доказываемого индукцией по i.
Так как каждое вычисление на шаге 2 требует не более трёх умножений по модулю mи этот шаг выполняется r
£log2 mраз, то сложность алгоритма может быть оценена величиной O(lnm).
2.2 Дихотомический алгоритм возведения в степень.
В общем виде дихотомический алгоритм позволяет вычислить n–ю степень в моноиде. Будучи применён к множеству целых чисел с операцией сложения, этот метод позволяет умножать два целых числа и более известен как египетское умножение.
Классический алгоритм возведения в степень посредством последовательного умножения характерен, главным образом, своей неэффективностью в обычных обстоятельствах – его время работы линейным образом зависит от показателя степени.
<img width=«57» height=«49» src=«ref-1_286924154-271.coolpic» v:shapes="_x0000_s1077">Возьмём моноид М с операцией умножения и рассмотрим некоторый элемент xиз М, а также произвольное натуральное число n. Для того, чтобы вычислить , представим nв двоичной системе счисления:
n= bt2t + bt – 12t – 1+ … +
b121+ b20,
предполагая, что n0 содержит (t+ 1)двоичных цифр (т. е. что bt¹0 и bt
+ 1= 0). В этих условиях вычисляемое выражение может быть записано:
<img width=«374» height=«96» src=«ref-1_286924425-698.coolpic» v:shapes="_x0000_s1078">
или же .
<img width=«57» height=«49» src=«ref-1_286924154-271.coolpic» v:shapes="_x0000_s1079"><img width=«303» height=«332» src=«ref-1_286925394-2171.coolpic» hspace=«12» alt=«Блок-схема: процесс: function DExp(x, n: LongInt): LongInt; label 25, 99; var c: LongInt;begin if n mod 2 ¹ 0 then c: = x else c: = 1;25: n: = n div 2; if n = 0 then goto 99; x:= x*x; if n mod 2 ¹ 0 then c: = c*x; goto 25;99: DExp: = c;end;» v:shapes="_x0000_s1080">Если задана последовательность (xi)0 £i£t, первый элемент которой есть xи xiдля iÎ[1,t] определено соотношением xi= xi
– 12, то можно записать = P{xi| 0 £i£t, bi¹0}. Чтобы завершить построение алгоритма и иметь возможность получить значение предыдущего произведения, необходимо вычислить биты biчисла n. Для последовательности (ni) 0 £i
£t+1(с начальным элементом n), определённой соотношением ni= [ni
–1/2] для любого iÎ[1, t+ 1], бит biравен нулю, если niчётно, и равен единице в противном случае. Первое значение индекса i, для которого niравно нулю, есть t+ 1.
Ясно, что число итераций, необходимых для выполнения алгоритма, зависит только от показателя n.
2t £n £2t + 1 или t £log2n < t + 1.
Первая часть этого свойства может быть выражена следующим образом: [n/2t
+ 1] = 0 и [n/2t] ¹0, что позволяет точно определить число совершаемых делений n, равное числу итераций алгоритма при заданном значении n. Очевидно, нужно совершить t+ 1 итераций, чтобы выполнить алгоритм, т. е. [log2n] + 1 итераций. Следовательно, трудоёмкость алгоритма есть O(logn).
Третий алгоритм – это классический алгоритм Евклида вычисления наибольшего общего делителя целых чисел. Мы предполагаем заданными два натуральных числа aи bи вычисляем их наибольший общий делитель (a,b).
2.3 Алгоритм Евклида
1. Вычислим r
– остаток от деления числа a
на b, a= bq+r, 0 £r
< b.
2. Если r= 0, то bесть искомое число.
3. Если r¹0, то заменим пару чисел (a,b) парой (b,r) и перейдём к шагу1.
Не останавливаясь на объяснении, почему алгоритм действительно находит (a,b), докажем некоторую оценку его сложности.
Теорема 1.При вычислении наибольшего общего делителя (a
,
b
) с помощью алгоритма Евклида будет выполнено не более 5p
операций деления с остатком, где
p
есть количество цифр в десятичной записи меньшего из чисел
a
и
b.
Доказательство.Положим r
= a> bи определим r
1,r
2,…,rn— последовательность делителей, появляющихся в процессе выполнения шага 1 алгоритма Евклида. Тогда
r1 = b,…, 0£
ri+1 < ri, i = 0,1,…,n — 1.
Пусть также u
= 1,u
1
= 1,uk
+1
= uk
+
uk
-1,k
³1, — последовательность Фибоначчи. Индукцией по iот i= n— 1 до i= 0 легко доказывается неравенство ri
+1
³un
-
i. А так как un³10(n-1)/5, то имеем неравенства 10p> b= r1³un³10(n-1)/5и n< 5p+1.
Немного подправив алгоритм Евклида, можно достаточно быстро решать сравнения axº1 (modm) при условии, что (a,b) = 1. Эта задача равносильна поиску целых решений уравнения ax+ by= 1.
<img width=«41» height=«39» src=«ref-1_286927565-262.coolpic» v:shapes="_x0000_s1032">2.4 Алгоритм решения уравнения ax
+
by
= 1
0. Определим матрицу E=
1. Вычислим r– остаток от деления числа aна b, a= bq+ r, 0 £r< b.
2. <img width=«66» height=«39» src=«ref-1_286927827-308.coolpic» v:shapes="_x0000_s1038">Если r= 0, то второй столбец матрицы Е даёт вектор (x
y) решений уравнения.
3. Если r¹0, то заменим матрицу Е матрицей
4. Заменим пару чисел (a,b) парой (b,r) и перейдём к шагу 1.
Если обозначить через Еkматрицу Е, возникающую в процессе работы алгоритма перед шагом 2 после kделений с остатком (шаг 1), то в обозначениях из доказательства теоремы 1 в этот момент выполняется векторное равенство (a,b)*Ek= (rk-1,rk). Его легко доказать индукцией по k. Поскольку числа a и b взаимно просты, имеем rn= 1, и это доказывает, что алгоритм действительно даёт решение уравнения ax + by = 1. Буквой n мы обозначили количество делений с остатком, которое в точности такое же, как и в алгоритме Евклида.
Полиномиальные алгоритмы в теории чисел – большая редкость. Да и оценки сложности алгоритмов чаще всего опираются на какие-либо не доказанные, но правдоподобные гипотезы, обычно относящиеся к аналитической теории чисел.
Для некоторых задач эффективные алгоритмы вообще не известны. Иногда в таких случаях всё же можно предложить последовательность действий, которая, «если повезёт», быстро приводит к требуемому результату. Существует класс так называемых вероятностных алгоритмов, которые дают правильный результат, но имеют вероятностную оценку времени работы. Обычно работа этих алгоритмов зависит от одного или нескольких параметров. В худшем случае они работают достаточно долго. Но удачный выбор параметра определяет быстрое завершение работы. Такие алгоритмы, если множество «хороших» значений параметров велико, на практике работают достаточно эффективно, хотя и не имеют хороших оценок сложности.
продолжение
--PAGE_BREAK--3. Полиномиальная арифметика
Рассмотрим вероятностный алгоритм, позволяющий эффективно находить решения полиномиальных сравнений по простому модулю. Пусть p– простое число, которое предполагается большим, и f(x)ÎZ[x] – многочлен, степень которого предполагается ограниченной. Задача состоит в отыскании решений сравнения
f(x) º0 (mod p). (1)
Например, речь может идти о решении квадратичных сравнений, если степень многочлена f(x) равна 2. Другими словами, мы должны отыскать в поле Fp = Z/pZ все элементы, удовлетворяющие уравнению f(x) = 0.
Согласно малой теореме Ферма, все элементы поля Fpявляются однократными корнями многочлена xp — x. Поэтому, вычислив наибольший общий делитель d(x) = (xp — x, f(x)), мы найдём многочлен d(x), множество корней которого в поле Fpсовпадает с множеством корней многочлена f(x), причём все эти корни однократны. Если окажется, что многочлен d(x) имеет нулевую степень, т. е. лежит в поле Fp, это будет означать, что сравнение (1) не имеет решений.
Для вычисления многочлена d(x) удобно сначала вычислить многочлен c(x)ºxp(mod f(x)), пользуясь алгоритмом, подобным описанному выше алгоритму возведения в степень (напомним, что число p предполагается большим). А затем с помощью аналога алгоритма Евклида вычислить d(x) = (c(x) – x, f(x)). Всё это выполняется за полиномиальное количество арифметических операций.
Таким образом, обсуждая далее задачу нахождения решений сравнения (1) мы можем предполагать, что в кольце многочленов Fp[x] справедливо равенство
f(x) = (x – a1)*…*(x – an), aiÎFp, ai¹aj.
3. 1 Алгоритм нахождения делителей многочлена
f
(
x
) в кольце
Fp
[
x
]
1. Выберем каким-либо способом элемент d ÎFp.
2. Вычислим наибольший общий делитель
g(x) = ( f(x), (x + d)(p-1)/2 – 1).
3. Если многочлен g(x) окажется собственным делителем f(x), то многочлен f(x) распадается на два множителя и с каждым из них независимо нужно будет проделать все операции, предписываемые настоящим алгоритмом для многочлена f(x).
4. Если окажется, что g(x) = 1 или g(x) = f(x), следует перейти к шагу 1 и, выбрав новое значение d, продолжить выполнение алгоритма.
Количество операций на шаге 2 оценивается величиной O(lnp), если вычисления проводить так, как это указывалось выше при нахождении d(x). Выясним теперь, сколь долго придётся выбирать числа d, пока на шаге 2 не будет найден собственный делитель f(x).
Количество решений уравнения (t+ a
1)(p– 1)/2= (t+ a
2)(p– 1)/2в поле Fpне превосходит (p-3)/2. Это означает, что подмножество DÌFp, состоящее из элементов d, удовлетворяющих условиям
(d + a1)(p – 1)/ 2 ¹(d + a2)(p – 1)/ 2, d¹-a1, d
¹
-a2,
состоит не менее чем (p– 1)/2 из элементов. Учитывая теперь, что каждый ненулевой элемент bÎFp удовлетворяет одному из равенств b(p– 1)/2 = 1, либо b(p– 1)/2 = –1, заключаем, что для d
ÎDодно из чисел a1, a2 будет корнем многочлена (x + d)(p– 1)/2– 1, а другое – нет. Для таких элементов dмногочлен, определённый на шаге 2 алгоритма, будет собственным делителем многочлена f(x).
Итак, существует не менее (p–1)/2 «удачных» выборов элемента d, при которых на шаге 2 алгоритма многочлен f(x) распадается на два собственных множителя. Следовательно, при «случайном» выборе элемента d
ÎFp, вероятность того, что многочлен не разложится на множители после k повторений шагов алгоритма 1-4, не превосходит 2-k. Вероятность с ростом k убывает очень быстро. И действительно, на практике этот алгоритм работает достаточно эффективно.
Заметим, что при оценке вероятности мы использовали только два корня многочлена f(x). При n > 2 эта вероятность, конечно, ещё меньше. Более тонкий анализ с использованием оценок А. Вейля для сумм характеров показывает, что вероятность для многочлена f(x) не распасться на множители при однократном проходе шагов алгоритма 1-4 не превосходит 2-n + O(p-1/2). Здесь постоянная в O(.) зависит от n. В настоящее время известно элементарное доказательство оценки А. Вейля.
Если в сравнении (1) заменить простой модуль p составным модулем m, то задача нахождения решений соответствующего сравнения становится намного более сложной. Известные алгоритмы её решения основаны на сведении сравнения к совокупности сравнений (1) по простым модулям – делителям m, и, следовательно, они требуют разложения числа m на простые сомножители, что, как уже указывалось, является достаточно трудоёмкой задачей.
3.2 Произведение и возведение в степень многочленов, заданных массивами
Условимся представлять многочлены массивами, индексированными, начиная с 0, в которых элемент с индексом iозначает коэффициент многочлена степени i
type
Polynome=array[1..Nmax]of Ring_Element;
Следующий алгоритм даёт функцию умножения двух многочленов и, где многочлен степени (который даёт результат в конце алгоритма) должен быть предварительно инициализирован нулём.
fori:= 0 to degP do
forj:= 0 to degQ do
R[i+j]:=R[i+j]+P[i]*Q[i];
Изучая предыдущий алгоритм, устанавливаем, что его сложность как по числу перемножений, так и сложений, равна произведению высот двух многочленов: (deg
P+ 1)(degQ+ 1), но в этом алгоритме, который не учитывает случай нулевых коэффициентов, можно рассматривать высоту многочлена как число всех коэффициентов. Значит, возможно улучшить предыдущий алгоритм, исключив все ненужные перемножения:
fori:= 0 to degP do
if P[i] ¹0then
forj:= 0 to degQ do
if Q[j] ¹0then
R[i+j]:=R[i+j]+P[i]Q[i];
Очень просто вычислить сложность алгоритма возведения в степень последовательными умножениями, если заметить, что когда P– многочлен степени d, то Pi– многочлен степени id. Если обозначить Cmul(n) сложность вычисления Pn, то рекуррентное соотношение Cmul(i
+ 1) = Cmul(i) + (d+1)(id+1) даёт нам:
<img width=«544» height=«100» src=«ref-1_286928135-955.coolpic» v:shapes="_x0000_s1138">
Cmul(n) = =
<img width=«23» height=«35» src=«ref-1_286929090-220.coolpic» v:shapes="_x0000_s1139"><img width=«38» height=«36» src=«ref-1_286929310-251.coolpic» v:shapes="_x0000_s1140">Что касается возведения в степень с помощью дихотомии (т.е. повторяющимися возведениями в квадрат), вычисления несколько сложнее: зная , вычисляем с мультипликативной сложностью. Как следствие имеем:
<img width=«444» height=«85» src=«ref-1_286929561-843.coolpic» v:shapes="_x0000_s1141">
C
sqr(2l) = = =
<img width=«243» height=«53» src=«ref-1_286930404-552.coolpic» v:shapes="_x0000_s1142">
=
Предварительное заключение, которое можно вывести из предыдущих вычислений, складывается в пользу дихотомического возведения в степень: если nесть степень двойки (гипотеза ad hoc), этот алгоритм ещё выдерживает конкуренцию, даже если эта победа гораздо скромнее в данном контексте (n2d2/3 против n2d2/2), чем когда работаем в Z/pZ(2log2
nпротив n).
<img width=«77» height=«37» src=«ref-1_286930956-245.coolpic» v:shapes="_x0000_s1151"><img width=«77» height=«37» src=«ref-1_286931201-302.coolpic» v:shapes="_x0000_s1150">Но мы не учли корректирующие перемножения, которые должны быть выполнены, когда показатель не является степенью двойки. Если n = 2l+1 – 1, нужно добавить к последовательным возведениям в квадрат перемножения всех полученных многочленов. Умножение многочлена степени (2i-1)d на многочлен степени 2i
d вносит свой вклад из ((2i – 1)d + 1)( 2id + 1) умножений, которые, будучи собранными по всем корректирующим вычислениям, дают дополнительную сложность:
<img width=«480» height=«77» src=«ref-1_286931503-828.coolpic» v:shapes="_x0000_s1160">
= =
<img width=«333» height=«53» src=«ref-1_286932331-669.coolpic» v:shapes="_x0000_s1161">
=
<img width=«305» height=«64» src=«ref-1_286933000-613.coolpic» v:shapes="_x0000_s1146"><img width=«138» height=«64» src=«ref-1_286933613-270.coolpic» v:shapes="_x0000_s1137"><img width=«81» height=«50» src=«ref-1_286933883-315.coolpic» v:shapes="_x0000_s1147">Теперь можно заключить, что дихотомическое возведение в степень не всегда является лучшим способом для вычисления степени многочлена с помощью перемножений многочленов. Число перемножений базисного кольца, которые необходимы, C
sqr(n), — в действительности заключено между ( ) и т.е. между n2d2/3 и 2n2d2/3, тогда как простой алгоритм требует всегда n2d2/2 перемножений. В частности, если исходный многочлен имеет степень, большую или равную 4, возведение в степень наивным методом требует меньше перемножений в базисном кольце, чем бинарное возведение в степень, когда nимеет форму 2l– 1.
Можно довольно просто доказать, что если n
имеет вид 2l+2l
– 1+ c(выражения, представляющие двоичное разложение n), то метод вычисления последовательными перемножениями лучше метода, использующего возведение в квадрат (этот последний метод требует корректирующего счёта ценой, по крайней мере, n2d2/9). Всё это доказывает, что наивный способ является лучшим для этого класса алгоритмов, по крайней мере, в половине случаев.
Действительно, МакКарти [3] доказал, что дихотомический алгоритм возведения в степень оптимален среди алгоритмов, оперирующих повторными умножениями, если действуют с плотными многочленами (антоним к разреженным) по модулю m, или с целыми и при условии оптимизации возведения в квадрат для сокращения его сложности наполовину (в этом случае сложность действительно падает приблизительно до n2d2/6 + n2d2/3 = n2d2/2).
3.3 Небольшие оптимизации для произведений многочленов
В принципе вычисление произведения двух многочленов степеней nи mсоответственно требует (n+1)(m+1) элементарных перемножений. Алгоритм оптимизации возведения в квадрат состоит просто в применении формулы квадрата суммы:
<img width=«475» height=«74» src=«ref-1_286934198-988.coolpic» v:shapes="_x0000_s1162">
что даёт n+1 умножений для первого члена и n(n+1)/2 – для второго, или в целом (n+1)(n+2)/2 умножений, что близко к половине предусмотренных умножений, когда nбольшое.
Для произведения двух многочленов первой степени P
=
aX
+b
иQ
=cX
+
dдостаточно легко находим формулы U
=ac, W
=bd, V= (a
+ b)(c+ d) и PQ= =UX2+ (V– U– W)X+W, в которых появляются только три элементарных умножения, но четыре сложения. Можно рекурсивно применить этот процесс для умножения двух многочленов Pи Qстепени 2l– 1, представляя их в виде и применяя предыдущие формулы для вычисления PQв зависимости от A, B, Cи D, где каждое произведение AB, CDи (A+ B)(C+ D) вычисляется с помощью рекурсивного применения данного метода (это метод Карацубы). Всё это даёт мультипликативную сложность M(2l)и аддитивную сложность A(2l)такие, что:
<img width=«273» height=«42» src=«ref-1_286935186-494.coolpic» v:shapes="_x0000_s1149">M(2l) = 3M(2l
– 1),…, M(2) = 3M(1),M(1) = 1,
A(2l) =3A(2l
– 1) + 3*2l,…, A(2) = 3A(1) + 6,A(1) = 1.
В этой последней формуле член 3*2l представляет собой число элементарных сложений, необходимых, чтобы сделать два сложения многочленов степени 2l – 1 – 1 (a + b и c + d) и два вычитания многочленов степени 2l – 1 (U – V – W). Суммируя каждое из этих выражений, находим для n, являющегося степенью двойки:
M(n) = nlog3/log2»n1,585 и A(2) =7nlog3/log2 – 6n.
К сожалению, этот принцип остаётся теоретическим, и на его основе нужно построить итерационный алгоритм, чтобы получить разумную эффективность (цена управления рекурсией очень велика).
3.4 Вычисление многочленов
Рассмотрим общую задачу вычисления многочлена n-й степени
u(x) = unxn + un – 1xn – 1 +… + u1x + u0, un ¹0, (1)
3.4.1 Схема Горнера
u(x) = (…(unx+ un– 1)x+ …)x+ u. (2)
Весь этот процесс требует nумножений и nсложений.
Было предложено несколько обобщений схемы Горнера. Посмотрим сначала, как вычисляется в случае, когда – комплексное число, а коэффициенты вещественны. Комплексное сложение и умножение можно очевидным образом свести к последовательности обычных операций над вещественными числами:
вещественное + комплексное требует 1 сложение,
комплексное + комплексное требует 2 сложения,
вещественное *комплексное требует 2 умножения,
комплексное *комплексное требует 4 умножения и 2 сложения
или 3 умножения и 5 сложений.
Следовательно, схема Горнера (2) требует 4n– 2 умножений и 3n– 2 сложений или 3n– 1 умножений и 6n– 5 сложений для вычисления u(z), когда zкомплексное. Вот другая процедура для вычисления u(x+ iy):
a1= un, b1 = un – 1, r = x + x, s = x2 + y2; (3)
aj= bj – 1 + raj –1, bj = un – j – saj–1, 1 < j £n.
Легко доказать индукцией по n, что u(z) = zan+ bn. Эта схема требует 2n+ 2 умножений и 2n+ 1 сложений, так что при n³3 она лучше схемы Горнера.
Рассмотрим процесс деления многочлена u(x) на многочлен x– x. В результате такого деления мы получаемu(x) = (x– x)q(x) + r(x); здесь deg(r) < 1, поэтому r(x) есть постоянная, не зависящая от xи u(x) = 0*q(x) + r= r. Анализ этого процесса деления показывает, что вычисления почти те же самые, что в схеме Горнера для определения u(x). Аналогично, когда мы делим u(z) на многочлен (z– z)(z– z) = z2– 2xz+ x2+ y2, то соответствующие вычисления эквивалентны процедуре (3); мы получаем
<img width=«11» height=«2» src=«ref-1_286935680-151.coolpic» v:shapes="_x0000_s1136"><img width=«11» height=«2» src=«ref-1_286935831-152.coolpic» v:shapes="_x0000_s1135">u(z) = (z– z)(z– z)q(z) + anz+ bn;
следовательно,
u(z) = anz+ bn.
Вообще, когда мы делим u(x) на, f(x) получая u(x) = f(x)q(x) + r(x), то из равенства f(x) = 0 следует u(x) = r(x); это наблюдение ведёт к дальнейшим обобщениям правила Горнера. Мы можем положить, например, f(x) = x2 – x2; это даст нам схему Горнера «второго порядка»
u(x) = (…(u2ën/2 ûx2 + u2ën/2 û– 2)x2 + u0 +
+((….u2én/2 ù — 1 x2 + u2én/2 ù — 3)x2+ … +)x2u1)x. (4)
3.4.2 Интерполяционная формула Ньютона и табулирование значений многочлена
Рассмотрим специальный случай вычисления многочлена. Интерполяционный многочлен Ньютона степени n, определяемый формулой
u[n](x) = an(x – x0) (x – x1)…(x – xn– 1) +…+ an(x – x0) (x – x1) + a1(x – x0) + a, (5)
является единственным многочленом степени £nот x, который принимает предписанные значения y, y1, …, yn
в заданных n+ 1 различных точках x, x1, …, xnсоответственно. После того, как значения постоянных aнайдены, интерполяционная формула Ньютона становится удобной для вычислений, так как мы можем, обобщив правило Горнера, записать
u[n](x) = ((…(an(x – xn– 1) + an– 1)(x – xn– 2) + …)(x – x1) + a1)*
*(x– x) + a. (6)
Теперь рассмотрим, как находятся постоянные aв формуле Ньютона. Их можно определить, находя «разделённые разности» и сводя вычисления в следующую таблицу (иллюстрирующую случай n= 3):
y
(y1 – y0)/(x1 – x0) = y¢1
y1 (y2 – y’1)/(x2 – x0) = y¢¢2
(y2 – y1)/(x2 – x1) = y¢2 (y’’3 – y’’2)/(x3 – x0) = y¢¢¢3
y2 (y3 – y’2)/(x3 – x1) = y¢¢3
(y3 – y2)/(x3 – x2) = y¢3
y3 (7)
Можно доказать, что a= y, a1= y
’1, a2= y
’2, и т. д. Следовательно, для нахождения величин может быть использована следующая вычислительная процедура (соответствующая таблице (7)):
Начать с того, что установить (a, a1, …, an) ¬(y, y1, …, yn); затем для k= 1, 2, …, n(именно в таком порядке) установить yj¬(yj
– yj
– 1)/(xj
– xj
–
k)для j
= n, n– 1, …, k(именно в таком порядке).
Если мы хотим вычислить многочлен u(x) степени n
сразу для многих значений x, образующих арифметическую прогрессию (т. е. хотим вычислить u(x), u(x+ h), u(x+ 2h),…), то весь процесс можно после нескольких первых шагов свести к одному только сложению вследствие того факта, что n-я разность от многочлена есть постоянная.
1 Найти коэффициенты bn, …, b1, bпредставления нашего многочлена в виде интерполяционного многочлена Ньютона
u(x) = bn / n! hn(x – x0– (n – 1)h)…(x – x0– h)(x – x0) +…+ b2/ 2! h2**(x – x0– h)(x – x0) + b1/ h2 (x – x0) + b. (8)
(Это можно сделать, беря повторные разности, в точности так же, как мы определяли выше постоянные aв (5) (надо принять xj= x+ jh), с тем исключением, что все деления на xj– xj
–
k
из вычислительной процедуры устраняются.)
2 Установить x
¬
x.
3 Теперь значением u(x) является b.
4 Установить bj ¬ bj+ bj+ 1 для j
= 0, 1, …, n– 1 (именно в таком порядке). Увеличить x
на h
и вернуться в шаг 3.
продолжение
--PAGE_BREAK--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), легко может быть найден, например, с помощью перебора. Именно на этом свойстве основан упомянутый выше алгоритм.
<img width=«194» height=«49» src=«ref-1_286935983-410.coolpic» v:shapes="_x0000_s1116">Допустим, что р – 1 = qkh, (q,h) = 1. Алгоритм последовательно строит целые числа uj, j= 0,1,…,k, для которых выполняется сравнение
<img width=«57» height=«49» src=«ref-1_286936393-274.coolpic» v:shapes="_x0000_s1117"> º1 (modp). (3)
<img width=«57» height=«49» src=«ref-1_286936667-231.coolpic» v:shapes="_x0000_s1119"><img width=«57» height=«49» src=«ref-1_286936898-284.coolpic» v:shapes="_x0000_s1118">Так как выполняется сравнение º1 (modp), то найдётся целое число u, для которого º (modp). При таком выборе сравнение (3) с j= 0, очевидно, выполняется. Предположим, что найдено число uj, удовлетворяющее сравнению (3). Тогда определим tс помощью сравнения
<img width=«125» height=«49» src=«ref-1_286937182-413.coolpic» v:shapes="_x0000_s1121">
ºct(mod p), (4)
<img width=«132» height=«49» src=«ref-1_286937595-422.coolpic» v:shapes="_x0000_s1122"><img width=«125» height=«49» src=«ref-1_286938017-320.coolpic» v:shapes="_x0000_s1123">и положим. Имеют место сравнения
º º1 (modp), (5)
<img width=«86» height=«49» src=«ref-1_286938337-309.coolpic» v:shapes="_x0000_s1126">означающие справедливость (3) при j+ 1.
При j= kсравнение означает в силу (2), что º1 (modp). Целое число а есть первообразный корень по модулю р, поэтому имеем (x– uk)hº0 (modp– 1) и
<img width=«221» height=«49» src=«ref-1_286938646-435.coolpic» v:shapes="_x0000_s1124">xºuk (mod qk).
<img width=«90» height=«49» src=«ref-1_286939081-288.coolpic» v:shapes="_x0000_s1125">Если , где все простые числа 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).
<img width=«143» height=«49» src=«ref-1_286939369-378.coolpic» v:shapes="_x0000_s1128"><img width=«143» height=«49» src=«ref-1_286939747-381.coolpic» v:shapes="_x0000_s1127">Так как поле Fpнеполно, вычисление дискретных логарифмов не может использовать предельный переход и основано на иных принципах. Прежде всего, нужный дискретный логарифм logbвычисляется не сам по себе, а вместе с совокупностью логарифмов ряда других чисел. Заметим, что всякое сравнение вида
º (mod p), (8)
где qi, ki, miÎZприводит к соотношению между логарифмами
(k1 – m1)Log q1 + … + (ks – ms)Log qs º0 (mod p – 1). (9)
продолжение
--PAGE_BREAK--
еще рефераты
Еще работы по математике
Реферат по математике
Определитель матрицы 2
20 Июня 2015
Реферат по математике
Матрицы и определители 3
20 Июня 2015
Реферат по математике
Доказательство утверждения частным случаем которого является великая теорема Ферма
2 Сентября 2013
Реферат по математике
Знаходження мінімального остовом дерева Порівняння алгоритму Прима і алгоритму Крускала
2 Сентября 2013