Сборник задач по курсу «Логическое программирование»: Учебное пособие, страница 19

r1

r2

r3

r4

x1

1

0

0

1

x2

1

1

0

0

x3

0

1

1

0

x4

0

0

1

1

Рис. 2. Пример графа и его матрицы инцидентности

Модульная арифметика (арифметика вычетов)

Если оперировать только с целыми числами и приводить результаты по модулю M, то такая арифметическая система называется одномодульной арифметикой вычетов. Целое число M > 1 при этом называется модулем арифметической системы. Для трех основных арифметических операций в этой арифметике (сложения, умножения и вычитания) можно записать простые утверждения:

ü  X есть сумма чисел A и B в арифметике вычетов по модулю M, если X = (A + B) mod M;

ü  X есть произведение чисел A и B в арифметике вычетов по модулю M, если X = (A * B) mod M;

ü  X есть разность чисел A и B в арифметике вычетов по модулю M, если X = (A + M – B mod M) mod M.

Для осуществления деления в арифметике вычетов приходится прибегать к более громодкой процедуре. В обычной арифметике можно записать такое равенство A/B = A*B-1. Таким образом, для того чтобы поделить A на B, достаточно умножить A на обратное к B число. В арифметике вычетов именно так и поступают. X есть результат деления числа A на число B в арифметике вычетов по модулю M, если X = (A * B-1mod M) mod M. Для расчета обратного элемента (числа) к B по модулю M, т.е. B-1mod M, используется расширенный алгоритм Евклида. При произвольных значениях модуля для некоторых чисел обратный элемент может и не существовать. Если в качестве модуля арифметики брать простое целое число, то для любого числа в такой арифметике существует обратный элемент.

Расширенный алгоритм Евклида (как и обычный) предназначен для нахождения наибольшего общего делителя двух целых чисел a,b – НОД(a,b) = d. Однако, кроме решения этой «основной задачи» он позволяет находить целые числа x,y, являющиеся решениями уравнения ax + by = d. Псевдокод для этого алгоритма выглядит так.

НА ВХОДЕ: два неотрицательных числа a и b

НА ВЫХОДЕ: d=НОД(a,b) и целые x,y: ax + by = d.

1. Если b=0 положить d:=a, x:=1, y:=0 и возвратить (d,x,y)

2. Положить x1:=0, x2:=1, y1:=1, y2:=0

3. Пока b>0

    3.1 q:=[a/b], r:=a-qb, x:=x2-qx1, y:=y2-qy1

    3.2 a:=b, b:=r, x2:=x1, x1:=x, y2:=y1, y1:=y

4. Положить d:=a, x:=x2, y:=y2 и возвратить (d,x,y)

Если с помощью расширенного алгоритма Евклида требуется найти обратное по модулю n число для числа а, то достаточно в расширенном алгоритме Евклида положить b = n. При a < n и если n – простое число, алгоритм возвращает d = 1, а обратное к a целое число – либо x (если x>0), либо n + x (в противном случае).

Символы псевдографики

ASCII-коды символов в кодировке DOS, необходимость использования которых возникает при выполнении ряда задач этого пособия, представлены в таблице.

Таблица 1

ASCII-коды символов псевдографики в кодировке DOS (выборочно)

Код

179

180

191

192

193

194

195

196

197

217

218

Знак


СОДЕРЖАНИЕ

Предисловие. 3

Списки и строки. 4

Бинарные деревья. 15

Произвольные структуры (деревья) 24

Файлы и разделы базы данных. 33

Литература. 40

Приложение А. Подготовка к работе. 41

Приложение Б. Предикаты Arity/Prolog32. 42

Приложение В. Вспомогательные материалы.. 70

Редактор З.И. Сныкова

Компьютерная верстка Е.Л. Борисенко

ЛР № 020713 от 27.04.1998

Подписано к печати

Формат бумаги 60×84/16

Печать ризограф.

Бумага МВ

Печ. Л. 5,0

Заказ №

Тираж 50 экз.

Цена договорная

Отдел множительной техники ИАТЭ

249035, г. Обнинск, Студгородок, 1