
- •Модульная арифметика, основные свойства.
- •2. Понятие простого числа, алгоритмы нахождения. Решето Эратосфена
- •Решето Сундарама
- •Решето Аткина
- •Нод, нок, Расширенный алгоритм Эвклида. Доказательство.
- •4. Функция Эйлера
- •Свойства
- •Вычисление функции Эйлера
- •Свойства
- •5. Битовые операции
- •Побитовое отрицание (not)
- •Побитовое и (and)
- •Побитовое или (or)
- •6. Асимптотический анализ алгоритмов, способы оценки алгоритмов.
- •7. Длинная арифметика
Модульная арифметика, основные свойства.
Пусть m – некоторое натуральное число. Не все натуральные числа делятся на m. Возможными остатками от деления являются 1, 2, …, m – 1, 0 (последний при делении нацело). По модулю m каждое натуральное число воcпринимается как остаток от деления этого числа на m: 25mod 3=1, 9mod 7=2, 100mod 26=22, 100mod 32=4 и т.п. Два числа a и b называются сравнимыми по модулю m, если при делении на m они дают одинаковые остатки, т.е. если amod m=bmod m. В этом случае пишут a≡b (mod m) («a сравнимо с b по модулю m»). Так, например, 5≡11(mod 3), 25≡0(mod 5), 48≡6(mod 7).
На множестве чисел 1, 2, …, m – 1, 0 вводится сложение по модулю m: в качестве результата берется остаток от деления обычной суммы слагаемых на модуль m, т.е. a+mb=(a+b)mod m. Например, при сложении по модулю 2 получаем 0+20=1+21=0 и 0+21=1+20=1. Составим таблицу сложения по модулю 3:
-
+3
0
1
2
0
0
1
2
1
1
2
0
2
2
0
1
Как видим, 2+32 = (2+2) mod 3 = 4 mod 3 = 1.
При вычитании по модулю m для соответствующих чисел осуществляют обычное вычитание и, если в результате получится отрицательное число, к нему прибавляют m. Например, по модулю 5 имеем: 1 –5 4 = -3 mod 5 = 2.
Если некоторый алфавит имеет мощность m (т.е. в нем m букв), то сложение и вычитание по модулю m можно истолковывать как сложение и вычитание букв с соответствующими номерами. Так, при m=32 (русский алфавит) имеем: Й-Ц=10-3223=-13mod32=19=Т, Т+Т=19+3219=38mod32=6=Е и т.п.
При таком истолковании модульных операций сложения и вычитания, шифрование по Виженеру – это сложение блока открытого текста с ключом по модулю мощности алфавита.
В дальнейшем понадобится и умножение по модулю m: оно выполняется аналогично сложению – в качестве результата берется остаток от деления на m обычного произведения сомножителей. Например, для умножения по модулю 4 получаем следующую таблицу:
×4 |
0 |
1 |
2 |
3 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
2 |
3 |
2 |
0 |
2 |
0 |
2 |
3 |
0 |
3 |
2 |
1 |
2. Понятие простого числа, алгоритмы нахождения. Решето Эратосфена
Считаем простыми числами все целые числа, принадлежащие последовательности натуральных чисел, которые делятся нацело, без дробного остатка, только на самих себя и на 1. Причем, число 1 не относим к простым числам. Числа, которые делятся без остатка не только на самих себя и 1, но и на некоторые другие числа из последовательности натуральных чисел, считаем составными
Эратосфеново решето
Греческий математик Эратосфен (275-194 гг. до н.э.) предложил интересный метод нахождения простых чисел в интервале [2; n]. Он написал на папирусе, натянутом на рамку, все числа от 2 до 10000 и прокалывал составные числа. Папирус стал, как решето, которое “просеивает” составные числа, а простые оставляет. Поэтому такой метод называется Эратосфеновым решетом. Рассмотрим подробнее этот метод.
Пусть написаны числа от 2 до n:
2 3 4 5 6 7 8 9 10 11 12 . . .
Первое неперечеркнутое число в строке является простым. Таким образом, 2 – простое число. Начинаем “просеивание” с него, перечеркивая все числа, которые делятся на 2:
2
3 4 5 6 7 8 9 10 11 12 .
. .
Далее берем следующее по порядку неперечеркнутое число и перечеркиваем все числа, кратные ему и т. д. Таким образом, мы перечеркнем все составные числа, а простые останутся неперечеркнутыми:
2
3 4 5 6 7 8 9 10 11 12 .
. .
Все числа указанного интервала можно рассматривать как множество и в дальнейшем из этого множества будем исключать (отсеивать) все составные числа.
Нахождение простых чисел с помощью решета Эратосфена.
Для нахождения всех простых чисел не больше заданного числа n, следуя методу Эратосфена, нужно выполнить следующие шаги:
Выписать подряд все целые числа от двух до n (2, 3, 4, …, n).
Пусть переменная p изначально равна двум — первому простому числу.
Считая от p шагами по p, зачеркнуть в списке все числа от 2p до n кратные p (то есть числа 2p, 3p, 4p, …)
Найти первое незачеркнутое число, большее чем p, и присвоить значению переменной p это число.
Повторять шаги 3 и 4 до тех пор, пока
не станет больше, чем n
Теперь все не зачеркнутые числа в списке — простые.
На
практике, алгоритм можно несколько
улучшить следующим образом. На шаге №
3, числа можно зачеркивать, начиная сразу
с числа
,
потому что все составные числа меньше
его уже будут зачеркнуты к этому времени.
И, соответственно, останавливать алгоритм
можно, когда
станет
больше, чем
.[1]
Можно
показать, что сложность
алгоритма составляет
операций
в модели вычислений RAM,
или
битовых операций,[2][3] при
условии вычисления и зачеркивания
каждого кратного числа за время
,
например при использования массивов с прямым
доступом.