Алгоритам множења

С Википедије, слободне енциклопедије

Алгоритам множења је алгоритам (или метода) за множење два броја. У зависности од величине бројева, могу се користити различити алгоритми. Ефикасни алгоритми множења постоје још од појаве децималног система.

Метод мреже (грид метод)[уреди | уреди извор]

Метод мреже или метод кутије је уводни метод за множење вишецифрених бројева, и често се учи у основној школи. То је стандардни део националног плана и програма за математику у основним школама у Енглеској и Велсу од касних 1990-их година. Оба фактора (броја) су подељена на стотине, десетице и јединице, и производи делова се затим рачунају експлицитно у релативно једноставној фази множења, пре него што се на крају саберу да би се добио коначни резултат.[1]

Пример је множење 34x13, може се израчунати коришћењем мреже:

  300
   40
   90
 + 12
 ————
  442
× 30 4
10 300 40
3 90 12

а затим се сабирају да би се добило 442, било у једној суми, или кроз формирање ред по ред збирова (300 + 40) + (90 + 12) = 340 + 102 = 442.

Овај приступ рачунања (мада не обавезно са експлицитним аранжманом мреже) је такође познат и као алгоритам делимичних производа. Његова суштина је одвојено рачунање једноставних множења, при чему се сабирање оставља за крајњу фазу.

Метод мреже се у принципу може применити на факторе било којих величина, иако број потпроизвода може постати јако велики како се повећава број цифара. Свакако представља корисни експлицитни метод као увод за идеју множења вишецифрених бројева; и у доба када се већина рачунања врши помоћу дигитрона, ово може бити једини алгоритам множења који ће ученицима икад бити потребан.

Дуго множење[уреди | уреди извор]

Ако се користи позициони систем бројева, природан начин множења који се учи у школама је метод дугог множења, некад називан и стандардним алгоритмом: помножити множеник сваком цифром множиоца и онда их сабрати све исправно. Овај начин захтева меморисање таблице множења за једноцифрене бројеве.

Ово је уобичајени алгоритам за множење већих бројева на папиру, чија је основа 10. Компјутери су на почетку користили сличан алгоритам померања и додавања бројева чија је основа 2, али модерни процесори имају оптимизована кола за брза множења користећи ефикасније алгоритме, по цени сложеније хардверске реализације. Особа која ради дуго множење на папиру ће записати све производе и затим их сабрати, али особа која користи абакус ће сабирати производе након сваког рачунања.

Пример[уреди | уреди извор]

Овај пример користи дуго множење да би се помножио 23 958 233 (множеник) са 5830 (множилац), и добија се 139 676 498 390 (резултат).

      23958233
 ×         5830
 ———————————————
       00000000 ( =      23,958,233 ×     0)
      71874699  ( =      23,958,233 ×    30)
    191665864   ( =      23,958,233 ×   800)
 + 119791165    ( =      23,958,233 × 5,000)
 ———————————————
   139676498390 ( = 139,676,498,390        )

Испод се налази псеудокод који описује процес множења наведен изнад. У њој се налази само један ред који одржава суму која ће на крају бити финални резултат. Обратити пажњу да се оператор += користи да означи суму постојеће вредности и сачува операцију, као у програмским језицима C и Јава.

multiply(a[1..p], b[1..q], base) // Operandi na desnoj poziciji sadrže cifru 1
  product = [1..p+q]                                        //Dodeliti prostor za rezultat
  for b_i = 1 to q                                          // za sve cifre u b
    carry = 0
    for a_i = 1 to p                                        //za sve cifre u a
      product[a_i + b_i - 1] += carry + a[ai] * b[bi]
      carry = product[ai + bi - 1] / base
      product[a_i + b_i - 1] = product[ai + bi - 1] mod base
    product[b_i + p] += carry                               // poslednja cifra dolazi  iz konačnog prenosa
  return product

Множење решетком[уреди | уреди извор]

Множење решетком или ситом је алгоритамски еквивалент дугог множења. Захтева пипрему решетке, тј мреже нацртане на папиру која води рачунање и раздваја множења од сабирања. Први пут је коришћен у Европи 1202. године у Фибоначијевој "Либер Абаци". Леонардо описује ову операцију као менталну, користећи и десну и леву руку како би преносио прелазна рачунања. Матракци Насух је представио 6 различитих варијанти ове методе у књизи из 16.века "Умдет-ул Хисаб". Коришћена је у Ендерун школама широм Отоманског царства. Напијерове шипке или кости су такође користиле ове методе.

Као што је приказано у примеру, множеник и множилац су написани изнад и десно од решетке или сита. Током фазе множења, решетка се попуњава двоцифреним производима одговарајућих цифара које означавају сваки ред и колону. Десетице иду у горњи леви угао.

Током фазе сабирања, решетка се сабира на дијагоналама. На крају, ако је неопходна фаза померања, решење приказано на левим и доњим странама решетке се конвертује у нормалну форму преносом цифара десетица као у алгоритму дугог множења.

Пример[уреди | уреди извор]

Прво, поставити мрежу тако да се прво обележе редови и колоне са бројевима који ће бити помножени. Онда попунити кутије са десетицама у горњим троугловима и јединицама у доњим.
На крају, сабрати бројеве дуж дијагонала и пренети колико треба да би се добио резултат.

Слика на десној страни показује како израчунати 345 × 12 користећи множење решетком. Као сложенији пример можемо размотрити слику испод која приказује множење 23 958 233 са 5830, резултат је 139 676 498 390. Обратити пажњу да је 23 958 233 на врху решетке а 5830 је са десне стране. Производи попуњавају решетку или суме тих производа (на дијагонали) су дуж левих и доњих страна. Затим су те суме израчунате, као што је приказано.

     2   3   9   5   8   2   3   3
   +---+---+---+---+---+---+---+---+-
   |1 /|1 /|4 /|2 /|4 /|1 /|1 /|1 /|
   | / | / | / | / | / | / | / | / | 5
 01|/ 0|/ 5|/ 5|/ 5|/ 0|/ 0|/ 5|/ 5|
   +---+---+---+---+---+---+---+---+-
   |1 /|2 /|7 /|4 /|6 /|1 /|2 /|2 /|
   | / | / | / | / | / | / | / | / | 8
 02|/ 6|/ 4|/ 2|/ 0|/ 4|/ 6|/ 4|/ 4|
   +---+---+---+---+---+---+---+---+-
   |0 /|0 /|2 /|1 /|2 /|0 /|0 /|0 /|
   | / | / | / | / | / | / | / | / | 3
 17|/ 6|/ 9|/ 7|/ 5|/ 4|/ 6|/ 9|/ 9|
   +---+---+---+---+---+---+---+---+-
   |0 /|0 /|0 /|0 /|0 /|0 /|0 /|0 /|
   | / | / | / | / | / | / | / | / | 0
 24|/ 0|/ 0|/ 0|/ 0|/ 0|/ 0|/ 0|/ 0|
   +---+---+---+---+---+---+---+---+-
     26  15  13  18  17  13  09  00
 01
 002
 0017
 00024
 000026
 0000015
 00000013
 000000018
 0000000017
 00000000013
 000000000009
 0000000000000
 —————————————
  139676498390
= 139,676,498,390

Бинарно множење[уреди | уреди извор]

За бројеве чија је основа 2, дуго множење се своди на тривијалну операцију. За сваки бит јединицу у мултиплиер, померити мултиплицанд за одговарајући износ, а затим сабрати померене вредности. У зависности од архитектуре процесора рачунара и избора мултиплиера, мозе бити брже кодирати овај алгоритам коиристећи хардверско померање и сабирање битова него зависити од инструкција за множење, када је мултиплиер фиксиран и број сабирања је мали.

Овај алгоритам се назива још и сељачко множење, јер је био у широкој употреби међу онима који нису били школовани и самим тим нису упамтили таблицу множења које захтева дуго множење. Овај алгоритам се такође користио и у древном Египту.

На папиру, запишите у једној колони бројеве које добијете када више пута преполовите мултиплиер, игноришући остатак. у колони поред њега у више наврата удвостручити мултиплицанд. Прецртати сваки ред у коме је последња цифра првог броја парна, и додајте преостале бројеве у другу колону како би се добио резултат.

Главне предности ове методе су те да може да се научи брзо, меморисање није потребно, и може се извести коришћењем токена као сто су чипови за покер ако папир и оловка нису доступни. Међутим, има више корака од дугог множења тако да може да буде незграпно када су у питању велики бројеви.

Примери[уреди | уреди извор]

Овај пример користи бинарно множење да помножи 11 са 3, при чему се добија резултат 33.

Decimalno:     Binarno:
11   3       1011  11
5    6       101  110
2   12       10  1100
1   24       1  11000
    ——         ——————
    33         100001

Експлицитни опис корака: 11 и 3 су написани на врху. 11 је преполовљено на 5.5 а 3 је удвостручено на 6. Фракциони део, тј. део иза децимале се одбацује. 5 је преполовљено на 2.5 а 6 је дуплирано на 12. Децимални део се одбацује.

Број у левој колони је паран, тако да се део у десној колони одбацује. 2 се полови а 12 се дуплира.

Све непрецртане вредности се саберу: 3+6+24=33.

Овај метод ради јер је множење дистрибутивна операција, тако да

Компликованији пример, са коришћењем претходно наведених цифара (23 958 233 и 5 830):

Decimal:             Binary:
5830  23958233       1011011000110  1011011011001001011011001
2915  47916466       101101100011  10110110110010010110110010
1457  95832932       10110110001  101101101100100101101100100
728  191665864       1011011000  1011011011001001011011001000
364  383331728       101101100  10110110110010010110110010000
182  766663456       10110110  101101101100100101101100100000
91  1533326912       1011011  1011011011001001011011001000000
45  3066653824       101101  10110110110010010110110010000000
22  6133307648       10110  101101101100100101101100100000000
11 12266615296       1011  1011011011001001011011001000000000
5  24533230592       101  10110110110010010110110010000000000
2  49066461184       10  101101101100100101101100100000000000
1  98132922368       1  1011011011001001011011001000000000000
  ————————————          1022143253354344244353353243222210110 (before carry)
  139676498390         10000010000101010111100011100111010110

Остали алгоритми множења[уреди | уреди извор]

Види још[уреди | уреди извор]

Референце[уреди | уреди извор]

Спољашње везе[уреди | уреди извор]

  1. "ББЦ - бацк то сцхоол фор парентс"
  2. "ББЦ - Wхy парентс цан'т до матх тодаy" Архивирано на сајту Wayback Machine (4. март 2016)
  3. Новел Метходс оф Интегер Мултиплицатион анд Дивисион
  4. Qуартер Таблес Ревиситед: Еарлиер Таблес, Дивисион оф Лабор ин Табле Цонструцтион, анд Латер Имплементатионс ин Аналог Цомпутерс
  5. Фаст Фоуриер трансформатионс: а туториал ревиеw анд а стате оф тхе арт
  6. Фастер интегер мултиплицатионс