Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Формализация алгоритмов поразрядного умножения

Алгоритмы умножения будем рассматривать для n разрядной РС, предназначенной для отображения целых чисел без знака. Обозначим такую РС как РСЦБЗn.

В произведении A´B множитель B представим в виде (6.1):

 

B = å(bi2i) = bn-12n-1 + bn-22n-2 +...+ b222 + b121 +b020 (6.1)

 

Простейшие алгоритмы поразрядного умножения можно получить на основе тождественных преобразований выражения (6.2):

 

A´B = A´å(bi2i) (6.2)

Вариант 1 тождественных преобразований выражения (6.2):

 

A´B = A´å(bi2i) = å(A´bi2i) = å(A´2i)bi =

= (A´2 n-1)bn-1+ (A´2 n-2)bn-2+...+(A´2 2)b2+(A´2 1) b1+(A´2 0)b0 (6.3)

Обозначим:

Ai = A´2i – это двоичный код A, сдвинутый влево на i разрядов.

Тогда:

 

A0 = A;

Ai+1 = Ai´2 = L1(Ai· 0); (6.4)

Ai-1 = Ai/2 = R1(0 · Ai-1), для i > 0,

 

где · - символ операции конкатенации (склеивания) кодов;

- Lm обозначает операцию сдвига кода влево (Left) на m разрядов;

- Rm обозначает операцию сдвига кода вправо (Right) на m разрядов.

Вычисляя слагаемые выражения (6.3) с учетом (6.4) в том порядке как они записаны (слева - направо), мы реализуем алгоритм умножения старшими разрядами вперед со сдвигом множимого вправо:

 

A´B = ((…((A n-1 bn-1)+ A n-2 bn-2)+...+A2 b2)+A1 b1 )+A0 b0 (6.5)

 

Вычисления слагаемых выражения (6.3) в порядке обратном (то есть справа - налево) реализует алгоритм умножения младшими разрядами вперед со сдвигом множимого влево:

 

A´B = (An-1 bn-1+(A n-2 bn-2+(...+(A2 b2+(A1 b1+(A0 b0 )))…))) (6.6)

 

Алгоритм 6.1. Поразрядное умножение старшими разрядами вперед со сдвигом множимого вправо.

Алгоритм следует из выражения (6.5). Рассмотрим простейший его вариант.

Даны: коды A и B чисел на РСЦБЗn.

Требуется вычислить произведение C=A´B.

Обозначим:

i – количество обработанных разрядов кода множителя.

1. Подготовка переменных:

1.1. C:= 0 (- подготовка к накапливанию суммы)

1.2. A:= Lm(A· 0…0), где m = n-1 (- сдвиг кода множимого влево на n-1 разряд с занесением в разрядную сетку нулей справа)

1.3. i := 0 (- пока не обработано ни одного разряда кода множителя)

2. Циклическая часть алгоритма:

2.1. Если bn-1=1 (- проверка старшего разряда множителя),
то C:= C+A

2.2. B := L1(B); (- сдвиг кода множителя влево на 1 разряд)

A := R1(0· A); (- сдвиг кода множимого вправо на 1 разряд)

i := i+1 (- обработан еще один разряд кода множителя)

2.3. Если i < n,

то (- не все разряды множителя обработаны) перейти к 2.1.

3. Конец алгоритма (Код C задает искомое произведение)

 

Отметим основные недостатки алгоритма 6.1.

1. Для выполнения шага 1.2 алгоритма РС для представления кода числа A должна содержать не менее чем 2n-1 разряд, то есть, должна иметь практически удвоенную длину. Как следствие, для представления кодов произведения так же необходима разрядная сетка удвоенной длины: длиной 2n разрядов.

2. В операции суммирования C+A участвуют коды двойной длины, что определяет разрядность кодов на входе сумматора.

В алгоритме не определена цифра, вдвигаемая в РС числа B при выполнении сдвига B:= L1(B). Это нормально, поскольку, как следует из примера в таблице 6.2, значение этой цифры несущественно.

Заметим, что если в операции B:= L1(B) снять неопределенность, заменив ее на B:= L1(B· 0), то исполнение алгоритма можно в некоторых случаях завершить досрочного по признаку B = 0.

Алгоритм 6.2. Поразрядное умножение младшими разрядами вперед со сдвигом множимого влево.

Алгоритм следует из (6.6). Рассмотрим простейший его вариант.

Даны: коды A и B чисел на РСЦБЗn.

Требуется вычислить произведение C=A´B.

Обозначим:

i – количество обработанных разрядов кода множителя.

 

1. Подготовка переменных:

1.1. C := 0 (- подготовка к накапливанию суммы)

1.2. i := 0 (- пока не обработано ни одного разряда кода множителя)

2. Циклическая часть алгоритма:

2.1. Если b0 =1, (- проверка младшего разряда множителя)

то C := C+A

2.2. B := R1(B); (- сдвиг кода множителя вправо на 1 разряд)

A := L1(A· 0); (- сдвиг кода множимого влево на 1 разряд)

i := i+1 (- обработан еще один разряд кода множителя)

2.3. Если i < n,

то (- не все разряды множителя обработаны) перейти к 2.1

3. Конец алгоритма (Код C задает искомое произведение)

 

Недостатки алгоритма 6.2 совпадают с отмеченными недостатками алгоритма 6.1. Здесь, по аналогии с алгоритмом 6.1, замена операции B:= R1(B) на операцию B:= R1(0· B) позволяет увеличить быстродействие алгоритма за счет его досрочного завершения по признаку B = 0.

Заметим, что оба рассмотренных алгоритма можно ускорить, приняв во внимание возможное нулевое значение каждого из сомножителей. Такой анализ разумно проводить после присвоения переменной C начального значения, равного нулю, то есть после шага 1.1 обоих алгоритмов.

Вариант 2 тождественных преобразований выражения (6.2).

Обозначим:

 

Pi = A´ bi. (6.7)

 

Тогда выражение (6.2) можно преобразовать к виду (6.8):

A´B = A´å(bi2i) = å(A´bi2i) = åPi2i =

= Pn-1´2 n-1 +Pn-2´2 n-2+...+P2´2 2+P1´2 1+P0 (6.8)

 

Вынесением за скобки общих множителей равных 2, выражение (6.8) преобразуем к виду (6.9):

 

A´B = åPi2i = ((…((0´2+Pn-1)´2 +Pn-2)´2+...+P2)´2+P1)´2+P0 (6.9)

 

Последовательность действий, определяемую выражением (6.9), следует понимать такой:

- начальное значение накопленной суммы равно 0;

- накопленная сумма умножается на 2 сдвигом влево на один разряд;

- к результату сдвига прибавляется очередное произведение Pi.

Вычисление произведения A´B по выражению (6.9) реализует алгоритм умножения старшими разрядами вперед со сдвигом накопленной суммы частичных произведений влево.

При разработке алгоритма 6.3 умножения учтем, что, как следует из (6.7), Pi=0, если bi=0, и Pi= A, если bi= 1.

Алгоритм 6.3. Поразрядное умножение старшими разрядами вперед со сдвигом суммы частичных произведений влево.

Алгоритм следует из (6.9). Рассмотрим простейший его вариант.

Даны: коды A и B чисел на РСЦБЗn.

Требуется вычислить произведение C=A´B.

Обозначим:

i – количество обработанных разрядов кода множителя.

 

1. Подготовка переменных:

1.1. C := 0 (- подготовка к накапливанию суммы)

1.2. i := 0 (- пока не обработано ни одного разряда кода множителя)

2. Циклическая часть алгоритма:

2.1. C:= L1(C· 0) (- сдвиг накопленной суммы влево на 1 разряд)

2.2. Если bn-1=1, (- проверка старшего разряда множителя)

то C:= C+A

2.3. B := L1(B); (- сдвиг кода множителя влево на 1 разряд)

i := i+1 (- обработан еще один разряд кода множителя)

2.4. Если i < n,

то (- не все разряды множителя обработаны) перейти к 2.1

3. Конец алгоритма (Код C задает искомое произведение)

 

Отметим некоторые особенности алгоритма 6.3.

1. В отличие от алгоритмов 6.1 и 6.2, здесь код множимого не сдвигается, поэтому для его представления достаточно РС длиной n разрядов.

2. В операции суммирования C+A участвует код C двойной длины.

 

Вариант 3 тождественных преобразований выражения (6.2).

Выражение (5.2) можно преобразовать к следующему виду:

 

A´B = A´å(bi2i) =A´å(2n-1´bi2-(n-1)+i) = å( A´2n-1´bi´2-(n-1)+i) (6.10)

 

Обозначим:

 

Pi = A´2n-1´ bi. (6.11)

 

Тогда выражение (6.10) можно преобразовать к виду (6.12):

 

A´B = å(Pi´2-(n-1)+i) =

= Pn-1´2 0+Pn-2´2 -1+...+P2´2–(n-3)+P1´2–(n-2)+P0´2–(n-1) (6.12)

 

В выражении (6.12) вынесем за скобки общие множители равные 2-1:

 

A´B=Pn-1+(Pn-2+...+(P2+(P1+(P0+0´2–1)´2–1)´2–1)´2–1…)´2–1 (6.13)

Как видно, в (6.13) после прибавления последнего слагаемого, равного Pn-1, операция умножения на 2–1 не выполняется. Поэтому последовательность действий, задаваемую выражением (1.46), следует понимать такой:

- начальное значение накопленной суммы произведений равно 0;

- накопленная сумма произведений умножается на 2–1, то есть сдвигается вправо на один разряд;

- к результату сдвиг прибавляется очередное (i возрастает) произведение Pi.

Именно в соответствии с таким пониманием последовательности действий и с целью исключения особого случая обработки произведения P0 во внутренних скобках выражения (6.13) вставлено слагаемое равное 0´2–1.

Вычисление произведения A´B по выражению (6.13) реализует алгоритм умножения младшими разрядами вперед со сдвигом накопленной суммы частичных произведений вправо.

При разработке алгоритма 1.12 умножения учтем, что, как следует из (1.44), Pi=0, если bi=0, и Pi= A´2n-1, если bi= 1.

Алгоритм 6.4. Поразрядное умножение младшими разрядами вперед со сдвигом суммы частичных произведений вправо.

Алгоритм следует из выражения (6.13). Рассмотрим простейший его вариант, учитывая, что операция A´2n-1 эквивалентна сдвигу кода A влево на n-1 разряд.

Даны: коды A и B чисел на РСЦБЗn.

Требуется вычислить произведение C=A´B.

Обозначим:

i – количество обработанных разрядов кода множителя.

 

1. Подготовка переменных:

1.1. C:= 0 (- подготовка к накапливанию суммы)

1.2. A:= Lm(A· 0…0), где m = n-1 (- сдвиг кода множимого влево на n-1 разряд с занесением в разрядную сетку нулей)

1.3. i := 0 (- пока не обработано ни одного разряда кода множителя)

2. Циклическая часть алгоритма:

2.1. C := R1(0· C); (- сдвиг суммы вправо на 1 разряд)

2.2. Если b0 =1, (- проверка младшего разряда множителя)

то C:= C+A

2.3. B := R1(B); (- сдвиг кода множителя вправо на 1 разряд)

i := i+1 (- обработан еще один разряд кода множителя)

2.4. Если i < n,

то (- не все разряды множителя обработаны) перейти к 2.1

3. Конец алгоритма (Код C задает искомое произведение)

 

Отметим основные особенности алгоритма 6.4.

1. Код произведения C представляется на РС двойной длины, то есть на РСЦБЗ2n, и имеет вид C = c2n-1c2n-2…cn-1cn-2…c1c0.

2. Перед суммированием в результате шага 2.1 алгоритма старшая цифра c2n-1 кода C становится равной нулю. Поэтому в операции суммирования участвует код C следующей структуры:

C = 0c2n-2…cn-1cn-2…c1c0.

3. Слагаемое A в операции накапливания суммы C:= C+A после операции A:= Lm(A· 0…0), выполненной на шаге 1.2 алгоритма, имеет следующую структуру: A = 0a2n-2…an-10…0.

Как следует из структур слагаемых, в операции накапливания суммы участвуют коды, показанные в таблице 6.3:

 

Таблица 6.3

C = 0 c2n-2 cn cn-1 cn-2 c1 c0
A = 0 a2n-2 an an-1 0 0 0

 

Как видно из содержимого таблицы 6.3 младшие разряды кода суммы можно получить простым переписыванием соответствующих разрядов слагаемого C. Поэтому складывать необходимо только n разрядные составляющие кодов слагаемых: c2n-2…cn-1 и a2n-2…an-1. Этот факт используется при проектировании аппаратной реализации рассматриваемого алгоритма. При этом для выполнения суммирования используется суммирующее устройство (сумматор) с n разрядными кодами слагаемых, а шаг 1.2 рассматриваемого алгоритма реализуется за счет того, что цифра a0 исходного кода множимого складывается с цифрой cn-1 кода C. Поэтому операция A:= Lm(A· 0…0) из шага 1.2 оказывается выполненной автоматически без выполнения шагов сдвига кода A.

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...