---
ОПИСАНИЕ:
Това е алтернативен алгоритъм за умножение на числа, който е по-подходящ за големи числа. При имплементация се счита за по-ефективен от традиционния начин за умножение (имащ сложност О(n^2)).
При този алгоритъм използваме само умножение и деление на 2 и събиране. Също така, алгоритъмът е доста удобен при работа с двоична бройна система (понеже можем да заменим умноженията и деленията на 2 с побитови операции изместване наляво и надясно, които са доста бързи).
АЛГОРИТЪМ:
1) Направете таблица с 3 колони:
- в първата напишете първото число
- във втората - второто
- третата остава празна засега.
2) Започнете да делите първото число на 2, като взимате само цялата част.
Записвайте резултатите последователно в първата колонка докато не стигнете до 1.
3) Умножете второто число по 2, толкова пъти колкото сте разделили първото.
Отново записвайте резултатите последователно.
4) В третата колонка прехвърлете всички резултати от втората колонка,
     които стоят до НЕЧЕТНО число от първата колона. 
5) Съберете числата от третата колона и това е вашият резултат.
ПРИМЕР:
455 * 259 = ?
Първата стъпка е да си създадем таблицата. В началото тя ще изглежда така:
 
 
 
 
5) Съберете числата от третата колона и това е вашият резултат.
ПРИМЕР:
455 * 259 = ?
Първата стъпка е да си създадем таблицата. В началото тя ще изглежда така:
| 
  Колона 1 | 
  
  Колона 2 | 
  
  Колона 3 | 
 
| 
   
455 
 | 
  
   
259 
 | 
  
   | 
 
Следващата стъпка подсказва, че предстои да работим с първата колонка. Делим 455 на 2 и вземаме цялата част от това деление. Записваме резултата отдолу. Продължаваме да делим този резултат на 2 и записваме новия резултат отдолу. Така продължаваме докато не стигнем резултат 1 (т.е. на последния ред на 1-вата колона трябва да стои стойността 1):
След като приключим с тази стъпка от алгоритъма, таблицата ни ще изглежда така:
| 
   
Колона 1 
 | 
  
   
Колона 2 
 | 
  
   
Колона 3 
 | 
 
| 
   
455 
 | 
  
   
259 
 | 
  
   | 
 
| 
   
455 / 2 = 227 
 | 
  
   | 
  
   | 
 
| 
   
227 / 2 = 113 
 | 
  
   | 
  
   | 
 
| 
   
113 / 2 = 56 
 | 
  
   | 
  
   | 
 
| 
   
56 / 2 = 28 
 | 
  
   | 
  
   | 
 
| 
   
28 / 2 = 14 
 | 
  
   | 
  
   | 
 
| 
   
14 / 2 = 7 
 | 
  
   | 
  
   | 
 
| 
   
7 / 2 = 3 
 | 
  
   | 
  
   | 
 
| 
   
3 / 2 = 1 
 | 
  
   | 
  
   | 
 
Сега започваме работа с втората колонка! Просто умножаваме 259 по 2, след това умножаваме резултата по 2 и така продължаваме докато не добавим стойност на последния ред (до 1-цата от колона 1).
След като приключим с тази стъпка от алгоритъма, таблицата ни ще изглежда така:
| 
   
Колона 1 
 | 
  
   
Колона 2 
 | 
  
   
Колона 3 
 | 
 
| 
   
455 
 | 
  
   
259 
 | 
  
   | 
 
| 
   
455 / 2 = 227 
 | 
  
   
259 * 2 = 518 
 | 
  
   | 
 
| 
   
227 / 2 = 113 
 | 
  
   
518 * 2 = 1036 
 | 
  
   | 
 
| 
   
113 / 2 = 56 
 | 
  
   
1036 * 2 = 2072 
 | 
  
   | 
 
| 
   
56 / 2 = 28 
 | 
  
   
2072 * 2 = 4144 
 | 
  
   | 
 
| 
   
28 / 2 = 14 
 | 
  
   
4144 * 2 = 8288 
 | 
  
   | 
 
| 
   
14 / 2 = 7 
 | 
  
   
8288 * 2 = 16576 
 | 
  
   | 
 
| 
   
7 / 2 = 3 
 | 
  
   
16576 * 2 = 33152 
 | 
  
   | 
 
| 
   
3 / 2 = 1 
 | 
  
   
33152 * 2 = 66304 
 | 
  
   | 
 
Нищо сложно! Сега остава да преместим стойностите от Колона 2, които стоят до нечетна стойност от Колона 1, в Колона 3. 
Виждаме, че това са стойностите: 
- 259 (стои до 455, което е нечетно число)
- 518 (до 227)
- 1036 (до 113)
- 16576 (до 7)
- 33152 (до 3)
- 66304 (до 1)
След като приключим с тази стъпка от алгоритъма, таблицата ни ще изглежда така:
| 
   
Колона 1 
 | 
  
   
Колона 2 
 | 
  
   
Колона 3 
 | 
 
| 
   
455 
 | 
  
   
259 
 | 
  
   
259 
 | 
 
| 
   
455 / 2 = 227 
 | 
  
   
259 * 2 = 518 
 | 
  
   
518 
 | 
 
| 
   
227 / 2 = 113 
 | 
  
   
518 * 2 = 1036 
 | 
  
   
1036 
 | 
 
| 
   
113 / 2 = 56 
 | 
  
   
1036 * 2 = 2072 
 | 
  
   | 
 
| 
   
56 / 2 = 28 
 | 
  
   
2072 * 2 = 4144 
 | 
  
   | 
 
| 
   
28 / 2 = 14 
 | 
  
   
4144 * 2 = 8288 
 | 
  
   | 
 
| 
   
14 / 2 = 7 
 | 
  
   
8288 * 2 = 16576 
 | 
  
   
16576 
 | 
 
| 
   
7 / 2 = 3 
 | 
  
   
16576 * 2 = 33152 
 | 
  
   
33152 
 | 
 
| 
   
3 / 2 = 1 
 | 
  
   
33152 * 2 = 66304 
 | 
  
   
66304 
 | 
 
Приключихме с работата си по таблицата! Сега просто остава да съберем всички стойности от Колона 3 и това ще е нашият краен резултат:
259 + 518 + 1036 + 16576 + 33152 + 66304 = 117845
=> 455 * 259  = 117845
ИМПЛЕМЕНТАЦИЯ (Java):
Следващата имплементация може да бъде значително оптимизирана. 
Тя е просто пример как бихме представили алгоритъма като програмен код.
---
Това е за днес! Сигнализирайте ако видите някоя неточност!

Няма коментари:
Публикуване на коментар