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

Основы модулярной арифметики. Практикум

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Практическая работа 8
pp2p3p4p
5
aa2a3a4a
bb2b3b4b
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 -
Спутниковые и радиорелейные системы передачи данных
pp2p3p4p
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
aa2a3a4a
5
bb2b3b4b
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 -
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]