Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Литература / Дискретная математика (пособие ЛЭТИ) / Дискретная математика (пособие ЛЭТИ)

.pdf
Скачиваний:
702
Добавлен:
16.04.2013
Размер:
527.71 Кб
Скачать
Замечание 1.3.

Числа ak в p-ичной записи называются цифрами и обычно обозначаются отдельными символами, например 10 = A, 11 = B и т. д.

Теорема 1.8. Каждое натуральное число имеет единственную p-ич- ную запись.

Доказательство. Пусть s имеет две различные p-ичные записи:

anan−1...a1a0 è bmbm−1...b1b0. Тогда

s= pnan +pn−1an−1 +· · ·+pa1 +a0 = p pn−1an + · · · + a1 +a0 = ps1 +a0 =

=pmbm + pm−1bm−1 + · · ·+ pb1 + b0 = p pm−1bm + · · · + b1 + b0 = ps2 + b0.

Так как частное и остаток при делении на p определяются однозначно,

a0 = b0 è s1 = pn−1an + · · · + a1 = pm−1bm + · · · + b1 = s2.

Применяя аналогичные рассуждения к s1 è s2, получим a1 = b1 è ò. ä.

Замечание 1.4. Существуют и другие способы позиционной записи натуральных чисел, т. е. представление их упорядоченными наборами

öèôð.

Пример 1.4 (факториальная запись).

s = (anan−1 · · · a1)! s = ann! + an−1(n − 1)! + · · · + a1 · 1!,

ãäå 0 6 ak 6 k, an 6= 0.

Упражнение 1.2. Доказать единственность факториальной запи си натуральных чисел.

1.6.Алгоритмы арифметических действий

с p-ичными записями натуральных чисел

Алгоритмы сложения, вычитания, умножения столбиком и деления

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

p-ичной арифметике.

Алгоритм 1. Сложение p-ичных чисел a = (an · · · a0)p è b = (bm · · · b0)p. Результат число c = (ck · · · c0)p.

ÅÑËÈ n < m ÒÎ

a ↔ b; n ↔ m; (тем самым длина числа a станет не меньше длины b)

KE

10

i : = 0; s : = 0;

(i номер разряда,

 

s величина переноса в старший разряд)

ÖÈÊË-ÏÎÊÀ i 6 m

 

ci : = (ai + bi + s) mod p; (вычисление очередной с конца цифры результата)

s : = (ai + bi + s) ÷ p;

(вычисление величины межразрядного переноса)

i : = i + 1

(переход к следующему разряду)

ÊÖ

 

ÖÈÊË-ÏÎÊÀ i 6 n

(продолжение сложения числa после прохождения

ci : = (ai + s) mod p;

старшего разряда числа меньшей длины)

s : = (ai + s) ÷ p;

 

i : = i + 1

 

ÊÖ

 

ÅÑËÈ s > 0 ÒÎ

(формирование старшего разряда результата,

cn+1 : = s

если длина результата больше длины слагаемых)

KE

 

Пример 1.5 (таблицы сложения и умножения для 5-ичных чисел).

(+)5

0

1

2

3

4

 

(×)5

0

1

2

3

4

0

0

1

2

3

4

 

0

0

0

0

0

0

1

1

2

3

4

10

 

1

0

1

2

3

4

2

2

3

4

10

11

 

2

0

2

4

11

13

3

3

4

10

11

12

 

3

0

3

11

14

22

4

4

10

11

12

13

 

4

0

4

13

22

31

Результат

a = (an · · · a0)p на цифру b = (b0)p.

Алгоритм 2а. Умножение числа

 

 

a · b = c = (cm · · · c0)p.

 

 

s := 0

 

 

ÖÈÊË ÏÎ i ÎÒ 0 ÄÎ n

 

 

ci := (ai · bi + s) mod p;

s := (ai · bi + s) ÷ p

ÊÖ;

 

 

ÅÑËÈ s > 0, ÒÎ m := n + 1;

cm := s ИНАЧЕ m := n

Алгоритм 2б. Умножение числа a = (an...a0)p на число pk (сдвиг на

k разрядов). Результат apk = c = (cm · · · c0)p.

 

m = n + k;

 

 

ÖÈÊË ÏÎ i ÎÒ n ÄÎ 0

ci+k := ak

ÊÖ

ÖÈÊË ÏÎ i ÎÒ k − 1 ÄÎ 0 ci := 0;

ÊÖ

11

Алгоритм 2. Умножение p-ичных чисел a = (an · · · a0)p è b = (bk · · · b0)p. Результат ab = c = (cm · · · c0)p.

c := 0;

 

ÖÈÊË ÏÎ i ÎÒ 0 ÄÎ k

 

c := c + (abi)pi;

(поразрядное умножение со сдвигом

ÊÖ

выполняется по алгоритмам 2а и 2б)

Задание 1.1. Написать алгоритмы вычитания и деления нацело, основываясь на таблицах вычитания и деления p-ичных чисел.

Задание 1.2. Для двоичных чисел алгоритмы арифметических опе раций можно упростить. Сделать это.

Задание 1.3. Сформулировать алгоритмы сложения и умножения натуральных чисел в факториальной записи.

1.7.Алгоритмы перевода p-ичной записи натурального числа в q-ичную

Первый из алгоритмов перевода использует p-ичную арифметику, вто рой q-ичную. В основе первого алгоритма лежит та же идея, что и в доказательстве единственности p-ичной записи натурального числа.

Алгоритм 1. Перевод чисел из p-ичной записи (an · · · a0)p â q-ичную (bm · · · b0)q â p-ичной арифметике.

i := 0;

ÖÈÊË-ÏÎÊÀ a 6= 0

bi := a mod q; (деление a íà q выполняется в p-ичной арифметике) a := a ÷ q

i := i + 1

ÊÖ

m := i − 1

Второй алгоритм основан на так называемой схеме Горнера (см. 4.2):

a= (anan−1 · · · a0)p = anpn + an−1pn−1 + · · · + a1p + a0 = = ((...((anp + an−1)qp + an−2)qp + · · · + a1)qp + a0)q.

Алгоритм 2. Перевод чисел из p-ичной (an · · · a0)p записи в (bm · · · b0)q â q-ичной арифметике.

(1.4)

q-ичную

12

b := 0;

 

ÖÈÊË ÏÎ i ÎÒ n ÄÎ 0

 

b := bp + ai;

(действия выполняются в q-ичной арифметике)

ÊÖ

 

Замечание 1.5. При p > q применение последнего алгоритма подра зумевает предварительный перевод всех цифр в q-ичную запись. Анало гично, при p < q алгоритм 1 подразумевает дополнительные действия по переводу цифр порождаемой записи из p-ичной записи в q-ичную.

1.8.Алгоритм эффективного возведения числа в натуральную степень

Схема Горнера (1.4) может быть применена для построения эффектив ного алгоритма возведения числа a в натуральную степень m. Рассмотрим

двоичную запись числа m:

m = (bn · · · b0)2 = 2nbn + · · · + 2b1 + b0,

 

am = a2m1+b0 = (am1 )2 ab0 =

(am1 )2

ïðè

(am1 )2 a

ïðè

b0 = 0, b0 = 1.

c = am.

a

 

m = (bn · · · b0)2. Результат

Алгоритм. Возведение числа

 

в степень

 

c := 1;

ÖÈÊË ÏÎ i ÎÒ n ÄÎ 0

ÅÑËÈ bi = 0 ÒÎ c := c2 ИНАЧЕ c := c2a ÊÅ

ÊÖ

Замечание 1.6. Предложенный алгоритм легко модифицируется для возведения a в степень m в кольце Z/(k). Для этого достаточно

операцию умножения осуществлять в кольце вычетов по модулю k (см. теорему 3.4).

Задание 1.4. Сколько операций умножения (возведение в квадрат это тоже операция умножения) делает алгоритм при вычислении: а) a2k ;

á) a2k−1 .

Задание 1.5. Доказать, что количество умножений в алгоритме возведения числа в степень m не превышает 2 [log2 m] .

Задание 1.6. Найти формулу, выражающую число умножений в алгоритме возведения a в степень m через l число цифр в двоичной

записи m и r число нулей в двоичной записи m.

13

Øàã 1.

2.Алгоритм Евклида и цепные дроби

2.1.Классический алгоритм Евклида

Вернемся к ранее поставленному вопросу об эффективном алгоритме

вычисления D(a, b). Будем считать, что a > b > 0. Идея алгоритма Евкли да очень проста:

Åñëè a = bq + r, тогда D(a, b) = D(a − bq, b) = D(b, r). (2.1)

Таким образом, для нахождения D(a, b) получаем последовательность

действий, называемую классическим алгоритмом Евклида :

b = r0q1 + r1,

 

 

a = bq0 + r0,

 

r0 = r1q2 + r2,

 

 

 

 

 

 

(2.2)

 

 

 

 

 

 

 

 

 

 

 

 

· · · · · · · · · · · · · · ·

 

rk−2 = rk−1qk + rk,

 

rk 1 = rkqk+1.

 

 

 

 

 

 

 

 

 

 

rk+1 =

 

 

 

 

 

Замечание 2.1. Очевидно, что начиная с некоторого номера = 0, так как

r0 > r1 > r2 > · · · > rk > rk+1 = 0. Ïðè ýòîì, â ñèëó (2.1):

D(a, b) = D(b, r0) = D(r0, r1) = · · · = D(rk−2, rk1 ) = D(rk−1, rk) = rk.

Пример 2.1 (на классический алгоритм Евклида). Найти

D(76501, 29719). Сoгласно (2.2) имеем:

76501

= 29719 · 2

+ 17063 ,

29719

= 17063 · 1

+ 12656 ,

17063

= 12656 · 1

+ 4407 ,

12656

= 4407 ·

2

+ 3842 ,

4407

= 3842 ·

1

+ 565 ,

3842

= 565 ·

6

+ 452 ,

565

= 452 ·

1

+ 113 ,

452

= 113 ·

4 .

 

Схему (2.2) легко записать в виде алгоритма.

Шаг 1. (Проверка окончания) Если b = 0, то D(a, b) = a и алгоритм закан чивает работу.

Øàã 2. a = bq + r, полагаем a = b, b = r. Возвращаемся на

14

2.2.Бинарный алгоритм Евклида

Классический алгоритм Евклида не всегда является наилучшим спосо бом для нахождения наибольшего общего делителя. Сравнительно недавно для решения этой задачи был предложен совсем иной алгоритм, не требу ющий операции деления. Основанный исключительно на операциях вычи тания, он проверяет, является ли число четным или нет, и сдвигает впра во двоичное представления четного числа (деление пополам). Бинарный

алгоритм нахождения D(a, b) основан на нескольких простых свойствах положительных целых чисел a è b:

1)

a è b четны, тогда D(a, b) = 2D

 

2,

2

;

 

 

 

 

 

 

a

b

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

a четно и b нечетно, тогда D(a, b) = D

 

, b

;

2)

 

 

2

 

3) D(a, b) = D(a − b, b)

4)Åñëè a è b нечетны, то a − b четно;

5)|a − b| < max{a, b}.

Замечание 2.2. Свойство 3 уже использовалось в схеме (2.2) (cì. (2.1)).

Рассмотрим работу алгоритма по шагам. Введем следующие обозначения: k счетчик для степени двоек, выделяемых по свойству 1;

tmp рабочая переменная алгоритма.

Øàã 1. (Инициализация) k = 0. Åñëè a è b четны, тогда полагаем

k = k + 1, a = a/2, b = b/2. Повторяем эту процедуру, пока оба числа

четны. (Используем свойство 1 для выдавливания из a, b общей сте пени двойки.)

Øàã 2. (Продолжение инициализации) По крайней мере одно из чисел a, b нечетно. Если a нечетно, то полагаем tmp = −b. В противном случае tmp = a. Переходим на Øàã 4.

Øàã 3. (Дихотомия tmp) tmp = tmp/2. (Используем свойство 2.) Øàã 4. Åñëè tmp четно, возвращаемся на Øàã 3.

Øàã 5. (Смена максимума) Если tmp > 0, то полагаем a = tmp, иначе b = −tmp. (Используя свойство 5 заменяем max{a, b} íà |a − b|. Ïðè

ýòîì çíàê tmp определяет большее из чисел a, b. По свойству 3 D(a, b) при этом не изменится.)

15

Øàã 6. (Вычитание) tmp = a − b. Åñëè tmp 6= 0, то переходим на Øàã 3. В противном случае алгоритм заканчивает работу.

Имеем: D(a, b) = a · 2k.

Пример 2.2 (на бинарный алгоритм Евклида). Рассмотрим ра

боту алгоритма с данными из примера 2.1.

1)

a = 76501

b = 29719

tmp = −29719

2)

a = 76501

b = 29719

tmp = 46782 → 23391

3)

a = 23391

b = 29719

tmp = −6328 → −31684 → −1582 → −791

4)

a = 23391

b = 791

tmp = 22600 → 11300 → 5650 → 2825

5)

a = 2825

b = 791

tmp = 2034 → 1017

6)

a = 1017

b = 791

tmp = 226 → 113

7)

a = 113

b = 791

tmp = −678 → −339

8)

a = 113

b = 339

tmp = −226 → −113

9)

a = 113

b = 113

tmp = 0

Имеем: D(76501, 29719) = 113.

2.3.Линейное представление наибольшего общего делителя

Действуя в схеме (2.2) обратным ходом снизу вверх получаем пред ставление D(a, b) через a, b:

rk = rk−2 − rk−1qk = rk−2 − (rk−3 − rk−2qk−1)qk =

=−rk−3qk + rk−2(1 + qkqk−1) =

=−rk−3qk + (rk−4 − rk3 qk−2)(1 + qkqk−1) =

=rk−4(1 + qkqk−1) + rk−3(−qk − qk−2(1 + qkqk−1)) = · · · = ax + by.

Таким образом, справедливо следующее утверждение.

Утверждение 2.1. Для любых a, b Z уравнение ax + by = D(a, b) всегда имеет решение.

Нетрудно получить рекуррентные формулы для вычисления x, y. Введем последовательность {yi} следующим образом:

16

y0 = 0, y1 = 1,

yi+1 = yi−1 − qk+1−iyi,

i = 1, 2, · · · , k + 1.

(2.3)

Тогда D(a, b) = ayk+1 + byk+2.

 

 

 

 

 

 

 

Пример 2.3. Найдем линейное представление для наибольшего обще

го делителя из примера 2.1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y0

y1

 

y2

y3

y4

y5

y6

y7

y8

 

 

 

0

1

 

−1

7

−8

23

−31

54

−139

 

 

Таким образом, 76501 · 54 − 29719 · 139 = 113.

2.4.Разложение числа в цепную(непрерывную) дробь

Запишем схему (2.2) в виде

 

a

 

r

 

 

 

 

 

 

= q0 +

0

,

 

 

b

 

b

 

b

 

= q1 + r1 ,

 

 

 

 

 

 

 

r0

 

r0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2.4)

 

 

 

 

 

 

 

 

 

 

 

 

· · ·

2

· · · · · · · · ·

 

 

 

rk

 

rk

 

 

 

 

 

 

= qk + rk−1 ,

 

rk−1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

rk−1

 

 

 

 

 

 

 

rk

 

= qk+1 .

 

Из (2.4) получаем

a

1

 

 

 

1

 

 

= · · ·

 

 

 

1

 

 

 

 

 

 

 

= q0 +

 

 

= q0 +

 

 

 

 

 

= q0 +

 

 

 

 

 

 

 

.

(2.5)

 

b

 

b

 

 

1

 

 

1

 

 

 

 

 

 

 

 

 

q1

+

 

 

 

 

 

q1 +

 

 

 

 

 

 

 

 

 

 

 

 

r0

 

r0

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

q2 +

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r1

 

 

 

· · ·

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

qk+1

 

Определение 2.1. Выражение

(2.5) называется цепной или непре

рывной дробью. Дроби, возникающие при разложении

(2.5), называют

ся подходящими дробями. Последняя подходящая дробь равна

a/b. Числа

q0, q1, q2, . . . , qk+1 называются звеньями дроби. Более коротко

(2.5) çàïè

сывают в виде

 

 

a

= (q0, q1, q2, . . . , qk+1) .

 

 

 

 

 

 

(2.6)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b

 

 

 

 

 

 

Замечание 2.3. Заметим, что q0 в представлении (2.6) есть целая часть дроби a/b. Легко показать следующее:

17

íà÷è

1)Если 0 < a < b, т. е. a/b правильная положительная дробь, то представление (2.6) для нее имеет вид (0, q1, q2, . . . , qk+1).

2)Если дробь a/b < 0, то a/b = (−(K + 1), q1, q2, . . . , qk+1), где K целая часть дроби a/b.

3)Любое a Z является цепной дробью с одним звеном (a).

Таким образом, справедлива следующая теорема.

Теорема 2.1. Для любых a, b Z, b 6= 0 дробь a/b можно одним и только одним способом представить в виде (2.6), где все звенья qi

íàÿ ñ q1 положительны и последнее звено qk+1 > 1.

Замечание 2.4. Условие qk+1 > 1 в теореме обеспечивает единствен ность разложения (2.6), òàê êàê (q0, q1, · · · , qk+1) = (q0, q1, · · · , qk+1−1, 1). Действительно, последнее уравнение в схеме (2.2) rk−1 = rkqk+1 можно

записать в виде

(

rk−1

= rk(qk+1 − 1) + rk,

rk

= rk · 1.

Пример 2.4. Рассмотрим дробь из примера 2.1. Используя резуль таты примера 2.1 получаем представление (2.6):

7650129719 = (2, 1, 1, 2, 1, 6, 1, 4).

Заметим, что если полученную цепную дробь снова привести к обычной,

то получится

 

дробь: 76501

 

677

 

несократимая

 

 

=

 

 

.

 

29719

263

2.5.Свойства подходящих дробей и их вычисление

Введем обозначения для подходящих дробей, определенных в 2.4 при разложении (2.5):

def

 

def

1

 

def

 

1

 

· · · .

 

δ0 = q0

,

δ1 = q0

+

 

,

δ2 = q0

+

 

 

(2.7)

q1

1

 

 

 

 

 

 

 

 

q1 +

 

 

 

 

 

 

 

 

 

 

 

 

q2

 

 

 

Обозначим числитель и знаменатель δk через Pk è Qk соответственно. По лучим рекуррентные формулы для вычисления последовательностей чис

лителей {Pk} и знаменателей {Qk}. Полагая P−1 = 1, Q−1 = 0, далее имеем

18

 

q0

 

 

P0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

δ0 =

 

=

 

 

 

 

(полагаем P0 = q0, Q0 = 1) ,

 

 

 

 

1

Q0

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

δ1 =

q0 +

 

 

=

q0q1 + 1

=

q1P0 + P−1

=

 

P1

 

 

 

 

 

q1

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

q1 + 0 q1Q0 + Q−1

 

Q1

 

 

 

 

 

q2P1 + P0

 

 

P2

 

qsPs−1 + Ps−2

 

Ps

 

δ2 =

q2Q1 + Q0

 

=

Q2

, · · · , δs =

qsQs−1 + Qs−2

=

Qs

.

 

Становятся очевидными рекуррентные соотношения для Pk è Qk:

 

 

 

 

 

 

 

 

 

 

 

 

(Qs

= qsQs1

+ Qs 2 .

(2.8)

 

 

 

 

 

 

 

 

 

 

 

 

Ps

= qsPs 1

+ Ps−2

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример 2.5. Рассмотрим дробь из примера 2.1. Используя резуль таты примера 2.1 получим последовательность подходящих дробей.

 

 

 

 

s

1

0

 

1

2

3

 

4

5

 

 

 

6

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

qs

 

2

1

 

1

2

 

1

6

 

 

 

1

4

 

 

 

 

 

 

 

 

 

 

Ps

1

2

3

 

5

13

 

18

121

139

677

 

 

 

 

 

 

 

 

 

Qs

0

1

1

 

2

5

 

7

47

 

 

54

263

 

 

 

 

 

Таким образом,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

13

 

18

 

121

139

δ0 = 2,

δ1 = 3,

δ2 =

 

,

 

δ3 =

 

,

δ4 =

 

,

δ5 =

 

,

δ6 =

 

,

2

 

5

7

47

54

677

76501

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

δ7 =

 

=

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

263

29719

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Установим важное свойство подходящих дробей. Рассмотрим разность двух соседних подходящих дробей. Имеем

δs − δs−1 =

Ps

Ps−1

=

PsQs−1 − Ps−1Qs

=

hs

,

ãäå

Qs

Qs−1

QsQs−1

QsQs−1

 

hs = PsQs−1 − Ps−1Qs = (qsPs−1 + Ps−2)Qs−1 − (qsQs−1 + Qs−2)Ps−1 = = −(Ps−1Qs−2 − Ps−2Qs−1) = −hs−1.

Таким образом, hs = −hs−1, íî h0 = P0Q−1 − P−1Q0 íî, hs = (−1)s+1 и доказана следующая лемма.

Лемма 2.1. Справедливо равенство

Ps Ps−1 = (−1)s+1 . Qs Qs−1 QsQs−1

= −1, следователь

(2.9)

19