Мамаева Светлана Олеговна, Степуленок Денис Олегович
РЕАЛИЗАЦИЯ АЛГОРИТМОВ НАД ЦЕЛЫМИ ЧИСЛАМИ В EXCEL «БЕЗ ПРОГРАММИРОВАНИЯ»
Обучение дискретной математике обычно начинается с изучения алгоритмов над целыми числами. Это естественно, ведь с первого класса учителя начинают знакомить учеников с ними. Сначала это алгоритмы «поразрядного» сложения и выгаита-ния, затем умножение «столбиком», деление «уголком» и т.д. Эти алгоритмы являются основой более сложных алгоритмов дискретной математики, среди них алгоритм Евклида, решение диофантовых уравнений, нахождение числа по его остаткам.
Обычно для решения подобных задач используется один из следующих подходов:
a) Реализовать алгоритм на известном алгоритмическом языке программирования.
b) Решить задачу вручную, на листочке бумаги.
В то же время почти каждый старшеклассник или студент вуза знаком с одной из самых простых в применении «электронных таблиц» - Excel. Кроме удобных методов работы с табличными данными, электронная таблица позволяет легко осуществлять многие алгоритмы над целыми числами без применения программирования.
Покажем, как можно с помощью электронных таблиц решить эти задачи и получить правильный результат за считанные минуты.
1. МЕТОДЫ НАХОЖДЕНИЯ НАИБОЛЬШЕГО ОБЩЕГО ДЕЛИТЕЛЯ (НОД) НЕСКОЛЬКИХ ЧИСЕЛ.
1.1. АЛГОРИТМ ЕВКЛИДА С ВЫЧИТАНИЯМИ
Алгоритм Евклида позволяет находить наибольший общий делитель чисел, решать линейные уравнения в целых чис-
лах. Он применяется и для быстрого сокращения дробей (найти НОД числителя и знаменателя, затем разделить числитель и знаменатель на НОД).
Алгоритм Евклида с вычитаниями основан на следующем факте: если а > b, то НОД (а, Ь)=НОД(а - b, b), если а < b, то НОД(а, ^=НОД(а, b - а), . Теперь возьмем, вместо пары чисел (а, b), пару чисел (а - b, b) или (а, b - а) и применим правило еще раз. После применения правила некоторое количество раз оба числа станут равными -это и есть НОД(а, b).
Для нескольких чисел алгоритм можно сформулировать так. Из набора натуральных чисел выбираются любые два ненулевых числа, и большее из них (или любое, если они равны) заменяется разностью этих чисел. Это повторяется до тех пор, пока не останется одно ненулевое число. Оно и будет НОД исходного набора.
Реализация в Excel:
Для реализации этого алгоритма в Excel необходимо создать таблицу следующего содержания.
1. Допустим, мы хотим найти НОД чисел 5 и 3. Любые две соседние ячейки
отведем под исходные числа. Пусть это будут ячейки А1 и В1. Внесем в них числа 5 и 3, соответственно.
А В
1 5 3
2 2 3
3 2 1
4 1 1
5 0 1
2. С помощью конструктора формул или «вручную» для ячейки А2 зададим формулу «=ЕСЛИ(А 1 >=В 1; А1 -В 1; А1)».
3. Выделим и скопируем ячейку А2 в ячейку В2.
4. Отредактируем ячейку В2. Заменим в формуле знак больше или равно на больше, ячейку В1 - на А1, а А1 - на В1. Тогда получится: «=ЕСЛИ(В 1>А1 ;В 1 -А1 ;В 1)».
5. Выщелим ячейки А2:В2. И будем копировать их несколько раз, каждый раз спускаясь на одну строку вниз, пока одно из чисел в очередной строке не станет нулем. Ненулевое число в последней строке и будет являться НОД.
1.2. АЛГОРИТМ ЕВКЛИДА С ДЕЛЕНИЕМ
Алгоритм Евклида с делением работает быстрее алгоритма с вычитанием. Единственный его недостаток - применение более «сложной» операции деления с остатком вместо вычитания.
Идея метода:
Возьмем два ненулевых числа из набора, и большее из них (или любое в случае равенства) заменим остатком от деле-
ния на меньшее. Далее будем действовать так же, как и в случае 1.1.
Реализация в Excel:
1. Опять отведем любые две соседние ячейки под исходные числа. Пусть это будут ячейки D1 и E1. Внесем в них для теста числа 123 и 23, соответственно.
D E
123 23
8 23
8 7
1 7
1 0
2. Введем в ячейку Э2 формулу «=ОСТАТ(Э1;Б1)».
3. Выщелим и скопируем ячейку Э2 в ячейку Е2.
4. Отредактируем ячейку Е2. Поменяем местами в формуле ячейки Е1 и Э1. Получится «=ОСТАТ(Е1;Э1)».
5. Выщелим Э2:Е2 и будем копировать до тех пор, пока в одной из ячеек не получится ноль, ненулевой элемент в последней строке будет являться решением.
2. РАСШИРЕННЫЙ АЛГОРИТМ ЕВКЛИДА
В качестве примера задачи решаемой при помощи расширенного алгоритма Евклида можно привести следующую. Есть несколько ведер с различными емкостями. Разрешается этими ведрами добавлять или вычерпывать воду из бочки. Сначала бочка пуста. Необходимо налить в бочку 1 литр воды, имея в распоряже-
нии «ведра» емкостью 123 и 23 литра. Как это можно сделать? Как это сделать поскорее (за возможно меньшее количество переливаний)? Эту же задачу можно поставить на языке уравнений: найти целые решения уравнения 123х + 23y = 1. Такие уравнения называются диофантовы-ми. Положительные значения неизвестных обозначают число добавляемых вёдер, отрицательные - вычерпываемых.
Идея алгоритма - в «координатном» представлении целых чисел, с которыми выполняются операции обычного алгоритма Евклида: число а представляется набором (1;0), а число b - набором (0;1). Тогда, если а при делении на b дает остаток r и частное q, то остаток в координатной форме будет вычисляться следующим образом: так как а = bq + r то r = а -- bq = (1; 0) -(0; 1) q = (1; -q). В общем случае, если делимое имеет координаты (xp yx), а делитель (x2; y2), то остаток будет r = (xx; -q(x2; y2) = (xx - qx2; qy2).
Реализация в Excel:
1. Отведем две ячейки, например A7 и A8 для коэффициентов уравнения. Столбцы B и С задействуем для решения. Например 123=1*123+0*23, следовательно B7=1, а C7=0; 23=0*123+1*23.
A B C D
7 123 1 0
8 23 0 1
9 8 1 -5 5
10 7 -2 11 2
11 1 3 -16 1
12 0 -123 123 7
2. Введем в ячейку А9 формулу «=ОСТАТ(А7;А8)».
3. Введем в ячейку Э9 формулу «=ЦЕЛОЕ(А7/А8)».
4. Введем в ячейку В9 формулу «=В7-Э9*В8».
5. Скопируем ячейку В9 в ячейку С9. Исправим в формуле Е9 на Э9. Получится «=С7-09*С8».
6. Скопируем строку 9 в строку 10, затем - в строку 11 и так далее, пока в первом столбце не образуется 0.
7. Смотрим в предыдущую строку, там коэффициенты 3 и -16 напротив 1. Следовательно, 1=3*123-16*23, и мы получили одно из решений уравнения 123х + 23 у = 1.
3. НАХОЖДЕНИЕ ЧИСЛА ПО НАБОРУ ЕГО ОСТАТКОВ
При работе с «большими» целыми числами встает проблема представления их в памяти машины. Поэтому часто удобнее пользоваться не десятичным представлением «большого» числа, а так называемым китайским кодом, который представляет из себя набор остатков от деления данного числа на числа, образующие систему модулей. Модули должны быть взаимно просты для однозначного восстановления исходного числа по набору остатков.
При таком представлении операция сложения «больших чисел» сводится к сложению соответствующих остатков по соответствующим модулям. Операция умножения «больших чисел» - к умножению остатков по этим модулям. Аналогично выполняются операции вычитания и деления.
Китайская теорема об остатках дает метод, позволяющий по набору остатков восстановить целое число.
КИТАЙСКАЯ ТЕОРЕМА ОБ ОСТАТКАХ
Постановка задачи: есть набор остатков от деления (неизвестного нам) числа на числа из системы взаимно простых модулей. Надо найти неизвестное число.
Теорема:
Если даны натуральные, попарно взаимно простые числа т1...тп и целые числа
имела па Набору его оойоЛка^
rl...rn, такие, что для любого i, 0 < r < m., то на промежутке [0; m1m2...mn-l] существует единственное число K, такое, что для всех i, остаток от деления K на mi равен r.. Причем, K = c1d1r1+ c2d2r2+...+ cndnrn mod m,
m
m.
, а d. выбира-
где m = m m ... m ; c
" 12 n' i
ется так, чтобы при умноЖении на с. получилось число, дающее остаток 1 при делении на m..
i
Реализация в Excel:
Для примера возьмем взаимно простые модули {3,5,7}. Пусть остатки от деления на данные модули будут соответственно {2,2,3}. Создадим таблицу:
А B C D E F
14 mi ri ci di ricidi ci mod mi
15 3 2
16 5 2
17 7 3
18 105
Подсчитаем m = П m.. Для этого пе-
i=1 1
реместим курсор в ячейку A18 и вызовем
вставку функции с помощью кнопки fx
3. В появившемся окне «Мастер функций» выберем категорию «Математические», затем выберем функцию «ПРОИЗ-ВЕД». Подтвердим выбор кнопкой «OK».
4. Нажмем кнопку в графе «Чис-ло1». Выделим с помощью мыши ячейки A15:A17. Нажмем Enter. Нажмем «OK». В ячейке A18 окажется формула «=ПРОИЗВЕД(А15:А17)».
m
5. Теперь заполним столбец с. = —.
i mi
Для этого надо перейти в ячейку C15 и нажать кнопку | = |, затем подвести курсор мыши к ячейке A18 и щелкнуть по левой кнопке. В строке формулы окажется «=А18». Введем с клавиатуры знак «/». Подведем курсор к ячейке A15 и щелкнем еще раз. В строке формулы - «=А18/А15». Нажмем Enter.
6. Выделим ячейку «С15». Скопируем ее (Ctrl+C). Выделим ячейки С16:С17. Нажмем Ctrl+V (Вставка). Выделим С16 и исправим в ней А19 на А18. Выделим C17, исправим А20 на А18.
7. Теперь надо найти di , поскольку c.d. должно давать остаток 1 при делении на m., то c.d. = km.+ 1. Заметим, что, вместо с., можно рассматривать его остаток от деления на m.: c. mod m.. Таким образом, поиск di сводится к решению дио-фантова уравнения m.k +(c.modm.)d. = 1. В этой формулировке второй коэффициент всегда меньше первого. Получим столбец «ci mod mi». Выделим ячейку F15 и вызовем вставку функции. В категории «Математические» выберем функцию «ОСТАТ». В качестве первого числа выберем C15, в качестве второго А15. Нажмем «OK». Скопируем ячейку F15 в F16:F17.
8. Решаем диофантовы уравнения с помощью полученной ранее таблицы. В качестве первого коэффициента берем m. , в качестве второго с.. В столбец «di» вставляем ответ. Если очередное «d>> получается отрицательным, добавляем к нему «mi» до тех пор, пока оно не станет положительным.
9. Вычисляем произведения cidiri . Выбираем ячейку E15, вызываем вставку функции, выбираем категорию «Математические», функцию «ПРОИЗВЕД». Затем выбираем в качестве первого числа ячейки B15-D15. Нажимаем «OK». Копируем ячейку E15 в E16:E17.
10. Выделяем ячейки E15:E17 и на-
жимаем кнопку
. В ячейке E18 появ-
ляется сумма ячеек E15:E17.
А B C D E F
22 mi ri ci di ricidi ci mod mi
23 3 2 35 2 140 2
24 5 2 21 1 42 1
25 7 3 15 1 45 1
26 105 227
27 17
11. Выбираем ячейку Е19. Вызываем вставку функции. Выбираем категорию «10 недавно использовавшихся», функцию «ОСТАТ». Нажимаем «ОК». В качестве первого числа выберем Е18, в качестве второго - А18. Нажмем «ОК». В выделенной ячейке Е19 находится ответ.
Разобранные нами алгоритмы подробно описаны в первом занятии Заоч-
ной школы современного программирования (Журнал КИО N1 1999 год. В.Петров, С.Поздняков «Занятие 1. Алгоритмы над целыми числами»).
В номере 6 за 2001 год в статье С.С.Лаврова «Цепные дроби» описаны алгоритмы работы с цепными дробями. Все эти алгоритмы также можно реализовать с помощью Excel. Попробуйте! Желаем удачи!
Мамаева Светлана Олеговна, студентка СПбГЭТУ,
Степуленок Денис Олегович, студент III курса СПбГЭТУ, руководитель студенческого клуба программистов, методист ЗШСП.
© Наши авторы: 2002. Our authors, 2002.