Категории: ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника |
Формализация алгоритмов поразрядного умноженияАлгоритмы умножения будем рассматривать для 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 (- проверка старшего разряда множителя), 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
Как видно из содержимого таблицы 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. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда... |