Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы модулярной арифметики. Практикум
.pdf
Практическая работа 8
pp2p3p4p
5
aa2a3a4a
bb2b3b4b
5
41 3 17 29 43 67 1 16 8 0 37 2 14 4 5 26
42 5 11 31 43 59 1 1 13 1 43 0 4 6 0 55
43 5 17 23 53 71 0 10 15 35 35 1 4 20 8 54
44 7 17 29 43 67 6 4 18 25 12 5 6 5 19 46
45 2 19 29 43 71 0 2 9 21 64 1 1 14 34 23
46 3 19 29 43 59 0 16 24 25 14 2 18 13 25 52
47 3 17 23 41 67 0 15 8 14 66 2 7 18 32 9
48 2 19 37 47 59 0 6 13 8 6 0 4 21 44 28
49 2 13 37 47 71 1 10 23 12 24 0 5 35 36 31
50 7 17 37 53 67 3 16 36 6 28 4 10 4 7 41
51 3 19 23 43 61 0 4 6 3 30 1 0 0 24 18
52 2 11 31 43 67 0 6 19 28 62 0 3 7 18 51
53 2 17 29 47 67 0 2 22 36 50 0 11 16 43 36
54 7 11 31 43 71 5 7 5 18 60 1 2 23 24 46
55 3 17 37 43 71 0 9 14 31 40 1 8 3 23 61
56 3 17 23 43 61 0 3 0 42 54 2 11 5 29 18
57 5 11 37 53 61 2 10 33 9 16 2 4 21 36 21
58 3 13 23 41 71 2 2 4 8 6 1 2 5 7 43
59 3 17 23 47 67 1 9 1 15 43 2 14 18 41 58
60 2 19 31 43 67 1 7 7 3 40 1 15 8 23 37
61 3 11 29 53 61 0 5 11 36 27 1 0 26 45 55
62 3 17 29 47 59 1 0 22 38 54 2 11 13 5 6
63 7 19 37 41 71 6 2 28 13 60 0 16 31 22 24
3 13 37 41 67 1 7 6 20 2 0 0 21 2 51
64
65 3 13 37 47 71 0 7 20 33 42 0 10 36 15 26
66 2 13 29 43 61 0 5 17 35 7 1 3 19 3 56
67 2 13 37 47 61 0 6 13 10 56 1 5 9 11 0
68 5 19 37 43 71 1 17 16 39 51 2 12 5 22 65
69 5 17 29 47 59 2 14 4 30 9 0 11 21 8 43
70 5 13 29 41 61 1 10 23 37 47 2 12 27 11 42
71 7 13 29 47 67 6 3 10 20 30 0 5 8 28 36
72 7 17 37 43 71 0 15 11 37 35 4 15 4 40 24
73 7 17 23 41 71 1 14 6 1 18 1 9 14 29 67
74 5 17 37 53 71 2 6 0 4 29 1 16 2 32 20
75 5 13 37 47 61 2 12 6 5 38 1 10 19 41 55
76 5 13 31 53 61 3 8 23 29 37 1 10 24 44 12
5
- 81 -

Спутниковые и радиорелейные системы передачи данных
pp2p3p4p
77 7 11 29 47 59 5 4 23 40 42 4 1 20 41 27
78 2 13 31 41 67 0 1 11 9 44 0 0 25 6 48
79 3 11 23 43 61 0 9 6 42 54 1 2 21 22 56
80 5 17 31 43 71 2 2 18 30 48 4 13 7 34 13
81 2 11 37 47 67 1 3 5 26 44 1 6 4 33 43
82 3 17 37 43 61 2 12 4 24 46 0 4 25 16 32
83 3 19 31 47 61 0 1 27 30 2 2 4 27 36 0
84 2 11 31 41 67 0 9 7 6 4 0 3 27 21 5
85 7 17 31 47 71 3 6 4 38 9 1 9 21 4 13
86 3 19 29 53 59 0 8 26 17 43 2 14 6 4 33
87 3 13 23 47 67 2 8 6 22 24 0 3 13 35 64
88 5 17 37 47 71 4 7 2 2 68 3 15 30 32 8
89 2 17 29 43 61 1 1 9 27 5 1 8 11 4 58
90 2 19 29 41 71 0 8 21 24 18 0 17 18 7 17
91 5 17 29 53 61 4 8 6 7 44 0 6 23 20 23
92 7 13 29 43 71 5 0 15 0 45 0 11 13 27 40
93 5 11 37 53 59 2 9 22 18 28 3 7 19 46 33
94 5 13 31 53 59 0 2 28 32 23 2 1 4 43 16
95 3 19 23 41 59 2 0 12 12 32 0 11 2 31 7
96 2 19 37 43 61 1 2 12 20 2 0 13 32 32 1
97 7 13 23 47 61 6 10 5 41 15 2 0 15 11 27
98 2 11 23 53 71 0 1 7 1 42 1 1 16 25 33
99 5 19 23 43 71 1 14 17 10 53 2 8 16 29 30
100
2 19 31 41 71 0 14 21 34 60 1 8 6 13 33
5
aa2a3a4a
5
bb2b3b4b
5
Контрольные вопросы
1. Обоснуйте сложность операции сравнения чисел в СОК.
2. Как сравнить числа в СОК методом перевода их в ПСС?
3. Как сравнить числа в СОК методом перевода их в ОПСС?
4. Что такое циклическое переполнение диапазона представления чисел в СОК?
5. Выгода от введения технического основания по модулю 2.
6. Опишите алгоритм сравнения чисел в СОК, основанный
на переполнении диапазона.
7. Как проверить СОК-чисел на равенство?
- 82 -

Практическая работа 9
Цель занятия: изучение методов деления с остатком чисел
в СОК.
Знания и умения, приобретаемые студентом в результате осво-
ения темы, формируемые компетенции или их части: ПК-1, ПК-7.
В результате освоения темы обучающийся должен
• знать: о некорректности операции деления в СОК в общем случае, как заменить операцию деления умножением на обратный мультипликативный элемент, случай деления нацело СОК-чисел, методы формального деления
чисел в СОК, метод масштабирования числа в СОК, методы нахождения остатка от деления СОК-чисел, методы
корректного деления СОК-чисел.
• уметь: делить с остатком числа в СОК.
• владеть: знаниями, умениями и навыками деления с
остатком чисел в СОК.
Теоретическая часть
Операция «целочисленное деление с остатком» всегда считалась вычислительно трудной даже в ПСС. В СОК операция
деления с остатком является немодульной, то есть не поддающейся эффективному распараллеливанию.
Операция деления, а точнее ее эквивалент – умножение на
мультипликативный обратный элемент, в СОК выполняется корректно только в случае кратности делимого делителю.
Пример (СОК с основаниями p
= 3, p2 = 5, p3 = 7).
1
A = 88 = (1, 3, 4),
B = 11 = (2, 1, 4).
A:B = 88:11 = 8 = (2, 3, 1).
Выполним операции в СОК.
A:B = (1, 3, 4):(2, 1, 4) = (1, 3, 4)*inv(2, 1, 4) =
= (1, 3, 4)*(2, 1, 2) = (2, 3, 1).
где inv – это операция нахождения обратного мультипликативного элемента.
- 83 -

Спутниковые и радиорелейные системы передачи данных
Если делимое и делитель дополнительно кратны одному из
оснований СОК, то возможно получение правильного ответа
ценой сокращения диапазона представления ответа. Суть проблемы состоит в отсутствии обратного мультипликативного элемента у числа нуль.
Пример (СОК с основаниями p
= 3, p2 = 5, p3 = 7).
1
A = 80 = (2, 0, 3),
B = 20 = (2, 0, 6),
A:B = 80:20 = 4 = (1, 4, 4).
Выполним операции в СОК.
(2, 0, 3):(2, 0, 6) = (2, 0, 3)*inv(2, 0, 6) =
= (2, 0, 3)*(2, –, 6) = (1, –, 4).
Видно, что в ответе остаток от деления на p
= 5 является не-
2
определенной величиной из-за отсутствия обратного мультипликативного элемента у числа нуль (второй компонент представления числа 20 в СОК). Тем не менее, если отбросить второй разряд
вообще, то ответ получается правильный: (1 mod 3, 4 mod 7) = 4
в СОК с основаниями p
= 3, p2 = 7.
1
Если делимое не кратно делителю, то способ деления путем
умножения на обратный мультипликативный элемент делителя
дает ошибочный результат в любом случае.
Пример (СОК с основаниями p1 = 3, p2 = 5, p3 = 7).
A = 88 = (1, 3, 4),
B = 13 = (1, 3, 6).
A:B = 88:13 = 6 (остаток 10).
Выполним операции в СОК.
A:B = (1, 3, 4):(1, 3, 6) = (1, 3, 4)*inv(1, 3, 6) =
= (1, 3, 4)*(1, 2, 6) = (1, 1, 3) = 31.
Даже по смыслу решения задачи деления с остатком, в ответе
должно получиться не одно, а два числа – неполное частное Q
и остаток R.
С другой стороны, если выполнить проверку:
6 (правильное неполное частное) + 10(правильный остаток)/13 в СОК, то получается, что
6 = (0, 1, 6),
- 84 -

Практическая работа 9
10/13(формальное деление) =
= (1, 0, 3)*inv(1, 3, 6) = (1, 0, 3)*(1, 2, 6) = (1, 0, 4)
6 + 10/13 = (0, 1, 6) + (1, 0, 4) = (1,1,3).
То есть остаток оказывается каким-то образом «спрятанным»
внутри частного, полученного формальным делением в СОК.
Специфической для СОК является операция масштабирования – деление числа на одно из оснований СОК. В этом случае
нам заранее известен остаток от деления – соответствующий
разряд числа в СОК. Вычитая данный остаток (точнее его представление в СОК) из исходного числа, получим число, нацело
делящееся на заданное основание-делитель, то есть оказывается
возможным применить алгоритм деления чисел нацело в СОК.
Пример (СОК с основаниями p1 = 3, p2 = 5, p3 = 7).
A = 88 = (1, 3, 4),
B = p2 = 5 = (2, 0, 5) – второе основание СОК.
A:B = 88:5 = 17 (неполное частное Q) =
= (2, 2, 3) и 3 (остаток R) = (0, 3, 3).
Выполним операции в СОК.
1) определим остаток от деления A на p2. Это второй компонент A = (1, 3, 4) в заданной СОК, т. е. R = 3.
2) переведем остаток R в СОК: R = 3 = (0, 3, 3).
3) вычтем число R = 3 = (0, 3, 3) из делимого A = (1, 3, 4).
(1, 3, 4) – (0, 3, 3) = (1, 0, 1).
4) полученное число (1,0,1) гарантированно делится нацело
на B = p2 = 5 = (2, 0, 5), так как его остаток от деления на
p2 = 5 равен нулю.
(1, 0, 1) : (2, 0, 5) = (1, 0, 1)*inv(2, 0, 5) =
= (1, 0, 1)*(2, –, 3) = (2, –, 3).
Произошла потеря точности (неизвестно значение разряда по
основанию p2 = 5 у частного в СОК), тем не менее, ответ правильный: (2, 3) = 17 в СОК с оставшимися основаниями p1 = 3
и p3 = 7.
Восстановление значения утраченного разряда (в данном примере по основанию p2 = 5) было разобрано при изучении ОПСС.
Рассмотрим теперь методы решения задачи общего случая
деления с остатком в СОК.
- 85 -

Спутниковые и радиорелейные системы передачи данных
Во-первых, если диапазон СОК мал, то можно использовать
табличную выборку ответа. Потребуется две таблицы – таблица всевозможных неполных частных и таблица всевозможных
остатков от деления СОК-делимого на СОК-делитель. Размер
этих таблиц может оказаться весьма большим. Например, для
СОК с основаниями p
= 3, p2 = 5, p3 = 7 (диапазон P = 105),
1
таблица всевозможных неполных частных будет иметь размер
105*105 = 11025 упорядоченных троек, точно такой же размер
будет иметь и таблица остатков от деления. Главным достоинством этого метода, конечно, будет его скорость.
Во-вторых, можно перевести делимое и делитель из СОК в
двоичную систему счисления, выполнить операцию деления с
остатком в ПСС, а затем перевести ответ (неполное частное и
остаток) обратно в СОК. Как ни странно, данный способ оказывается одним из самых быстрых и малозатратных в смысле
потребления памяти.
В-третьих, владея операцией сравнения чисел в СОК, можно
воспроизвести работу любого популярного алгоритма деления с
остатком, например последовательного вычитания делителя из
делимого или школьного алгоритма деления «столбиком», выполняя при этом все промежуточные шаги в СОК. Эксперименты показали, что деление в этом случае осуществляется очень
медленно.
Несколько быстрее проходит деление столбиком в ОПСС.
В данном способе сначала осуществляется перевод СОК-делимого и СОК-делителя в ОПСС, деление осуществляется в
ОПСС, а окончательный ответ (неполное частное Q и остаток R)
переводятся обратно в СОК.
Рассмотрим теперь способ, который хоть и не является самым быстрым, но интересен в силу своей оригинальности.
Суть способа состоит в том, чтобы найти остаток R от деления A на B, вычесть этот остаток из A и после этого спокойно
найти правильное неполное частное Q умножением откорректированного A на обратный мультипликативный элемент к B.
Чтобы найти остаток от деления СОК-делимого A на СОК-де-
литель B, разобьем A на сумму чисел, для каждого из которых
будет просто найти остаток от его деления на B.
- 86 -

Практическая работа 9
Выберем такими слагаемыми – степени числа 2. То есть,
фактически, переведем A в двоичную систему счисления (ДСС).
Эта операция, хоть и не является модульной, решается достаточно быстро и хорошо.
Каждый бит ДСС-делимого будет указывать, прибавлять или
нет остаток от деления соответствующей степени двойки на B в
аккумулятор итогового СОК-остатка R (разумеется, с проверкой
R >= B и вычитанием B из R в случае обнаружения такого превышения).
Как же быстро находить остатки от деления степеней числа
2 на B? Для этого воспользуемся свойствами модулярной арифметики.
Прежде всего, заметим, что минимальная (нулевая) степень
числа 2 равна единице. Сравним ее с B. Если единица окажется
равной или больше B, то вычтем из нее B. Понятно, что такая
ситуация выглядит несколько надуманной, но она, как ни странно, иногда возникает. Если младший бит ДСС-делимого равен
единице, то поместим в R эту единицу или результат операции
вычитания R – B.
Удвоим единицу или результат операции вычитания и сравним полученное число с B. Если получили равенство или превышение B, то вычтем B. Посмотрим на второй младший бит
ДСС-делимого. Если он равен единице, то нарастим с контролем
превышения B, аккумулятор остатка R.
Продолжим операции удвоения (фактически, это сложение
числа с самим собой) остатков от деления степеней двойки на B,
контроля превышения нового остатка, наращивания R по соответствующему биту ДСС-делимого.
Как только будет отработан старший бит ДСС-делимого, в R
окажется истинный СОК-остаток от деления A на B.
Вычтем R из A. Теперь можно корректно выполнить операцию формального деления и получить верное значение Q.
Пример (СОК с основаниями p1 = 3, p2 = 5, p3 = 7).
A = 88 = (1, 3, 4),
B = 13 = (1, 3, 6).
A:B = 88:13 = 6 (остаток 10).
- 87 -

Спутниковые и радиорелейные системы передачи данных
Переведем A = (1, 3, 4) в двоичную систему счисления.
A = (1, 3, 4) = «1011000».
Обозначим СОК-остаток от деления текущей степени двойки
на B буквой S.
1. Нулевая степень числа 2.
S = (1, 1, 1) = 1, S < B, (коррекция S не требуется).
Так как младший бит делимого равен 0, то R не модифи-
цируем.
2. Первая степень числа 2.
S = S + S = (1, 1, 1) + (1, 1, 1) =
(2, 2, 2) = 2 < B (коррекция S не требуется).
Так как второй младший бит делимого равен 0, то R не
модифицируем.
3. Вторая степень числа 2.
S = S + S = (2, 2, 2) + (2, 2, 2) =
= (1, 4, 4) = 4 < B (коррекция S не требуется).
Так как третий младший бит делимого равен 0, то R не
модифицируем.
4. Третья степень числа 2.
S = S + S = (1, 4, 4) + (1, 4, 4) =
= (2, 3, 1) = 8 < B (коррекция S не требуется).
Так как четвертый младший бит делимого равен 1, то на-
ращиваем R с контролем его равенства или превышения B.
R = R + S = (0, 0, 0) + (2, 3, 1) =
= (2, 3, 1) = 8 < B (коррекция R не требуется).
5. Четвертая степень числа 2.
S = S + S = (2, 3, 1) + (2, 3, 1) =
= (1, 1, 2) = 16 > B (требуется коррекция S)
S = S – B = (1, 1, 2) – (1, 3, 6) = (0, 3, 3).
Так как пятый младший бит делимого равен 1, то нара-
щиваем R с контролем его равенства или превышения B.
R = R + S = (2, 3, 1) + (0, 3, 3) =
= (2, 1, 4) = 11 < B (коррекция R не требуется).
6. Пятая степень числа 2.
S = S + S = (0, 3, 3) + (0, 3, 3) =
= (0, 1, 6) = 6 < B (коррекция S не требуется).
Так как шестой младший бит делимого равен 0, то R не
модифицируем.
- 88 -

Практическая работа 9
7. Шестая степень числа 2.
S = S + S = (0, 1, 6) + (0, 1, 6) =
= (0, 2, 5) = 12 < B (коррекция S не требуется).
Так как седьмой младший бит (старший бит) делимого
равен 1, то наращиваем R с контролем его равенства или
превышения B.
R = R + S = (2, 1, 4) + (0, 2, 5) =
= (2, 3, 2) = 18 > B (требуется коррекция R).
R = R – B = (2, 3, 2) – (1, 3, 6) = (1, 0, 3) =10
(правильное значение остатка от деления A на B).
Вычитаем остаток R из делимого A.
A = A – R = (1, 3, 4) – (1, 0, 3) = (0, 3, 1).
Откорректированное значение A делится нацело на B, поэтому применяем формальное деление (умножение на обратный
мультипликативный элемент).
Q = (0, 3, 1)*inv(1, 3, 6) = (0, 3, 1)*(1, 2, 6) =
= (0, 1, 6) = 6 (правильное значение неполного частного).
Все промежуточные операции сравнения чисел в данном
примере приведены в ПСС, но при реализации алгоритма в виде
программы для ЭВМ или аппаратной прошивки, разумеется используются СОК-специфичные алгоритмы сравнения чисел без
их перевода в ПСС.
Если произведение делимого A и делителя B не превышает
диапазона СОК P и среди оснований СОК есть техническое основание p0 = 2, то более эффективным окажется следующий алгоритм деления с остатком.
Будем искать неполное частое Q методом половинного деления диапазона его возможных значений [q1; q2], где q1 и q2 – числа в СОК, большие нуля и меньшие либо равные A.
В качестве стартовых значений q1 = 1 (в СОК), q2 = A (в СОК).
Найдем середину qc = (q1 + q2)/2 отрезка [q1; q2]. Это легко
вычислить, имея техническое основание p0 = 2. Действительно,
если сумма q1 + q2 – есть число четное, то для деления его на 2
достаточно умножить сумму q1 + q2 на обратный мультипликативный элемент числа 2 в заданной СОК. Если q1 + q1 – есть число нечетное, то для правильного деления на 2 нужно из суммы
- 89 -

Спутниковые и радиорелейные системы передачи данных
q1 + q2 вычесть 1 и после этого умножить получившуюся четную
разность на обратный мультипликативный элемент числа 2. Ответ получится с округлением вниз.
После умножения на обратный мультипликативный элемент
необходимо будет восстановить остаток от деления на 2 по техническому основанию p0 = 2, что делается хотя и без естественного параллелизма СОК, но тоже достаточно быстро.
Вычислим значения произведений a1 = q1*B, ac = qc*B
и a2 = q2*B.
Заметим, что a1 < A (если это не так, то Q = 0, но если a1 = A,
то Q = 1), a2 > A (если это не так, то Q = B).
Сравним ac с A (имея техническое основание p0 = 2, это можно сделать достаточно эффективно).
Если ac = A, то Q = qc.
Если ac < A, то выполняем присваивание q1 = qc, иначе q2 = qc.
Таким образом, диапазон поиска Q сужается в 2 раза.
Повторяем вычисление qc = (q1 + q2)/2 и последующее сужение диапазона [q1; q2] до тех пор, пока q1 и q2 не перестанут
меняться (при этом q1 = q2 или q2 – q1 = 1).
Делаем вывод, что Q = q1.
Остаток от деления вычисляется по формуле R = A – B*Q.
Пример (СОК с основаниями p0 = 2, p1 = 3, p2 = 5, p3 = 7, p4 = 11).
P = 2*3*5*7*11 = 2310.
A = 88 = (1, 3, 4),
B = 13 = (1, 3, 6).
A:B = 88:13 = 6 (остаток 10).
A*B = 88*13 = 1144 < P,
то есть можем применить «быстрый» алгоритм.
Inv(2) = (–, 2, 3, 3, 4, 6) – обратный мультипликативный элемент числа 2
Инициализация.
q1 = 1,
q2 = A = 88,
qc = (q1 + q2)/2 = (1 + 88)/2 = 89 (нечетное)/2 = (89 – 1)/2 = 88/2 = 44.
a1 = q1*B = 1*13 = 13 < A – случай Q = 0 и Q = 1 исключен.
a2 = q2*B = 88*13 = 1144 > A – случай Q = B исключен.
- 90 -
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
