Problem
Mamy x=(1001)2y=(1011)2
Chcemy dostać x⋅y wykorzystując metodę „divide and conquer”.
Concept
Możemy podzielić liczby x oraz y na dwie części: x=22n⋅xL+xRy=22n⋅yL+yR gdzie n to liczba bitów, aL,aR to lewa oraz prawa połowa część bitów liczby a∈{x,y}.
Wówczas mamy x⋅y=(22n⋅xL+xR)⋅(22n⋅yL+yR)==2n⋅xLyL+22n⋅(xLyR+xRyL)+xRyR
Wiemy, że xLyR=(xL+xR)(yL+yR)−xLyL−xRyR więc będziemy wykonywać tylko 3 2n-bitowe pod-problemy:
- xLyL
- xRyR
- (xL+xR)(yL+yR)
Rozwiązanie
n=4
x=(1001)2=22n⋅xL+xR=22⋅(10)2+(01)2y=(1011)2=22n⋅yL+yR=22⋅(10)2+(11)2 Part1=Part2=Part3= xL⋅yL= xR⋅yR= (xL+xR)⋅(yL+yR)=(10)2(01)2(11)2⋅(10)2⋅(11)2⋅(101)2
x⋅y=Part1⋅24+(Part3−Part1−Part2)⋅22n+Part2
Najpierw musimy rozwiązać jednak ∀i=1,2,3 Parti.
Part1:
Lokalne n=2 Part1=(10)2⋅(10)2 Taka sama sytuacja, więc x=21⋅(1)2+(0)2y=21⋅(1)2+(0)2 Tutaj mamy do czynienia z liczbami jedno-bitowymi, więc możemy już mnożyć: Part1,1=Part1,2=Part1,3= (1)2⋅(1)2=(1)2 (0)2⋅(0)2=(0)2 (1)2⋅(1)2=(1)2 Więc Part1=Part1,1⋅22+(Part1,3−Part1,1−Part1,2)⋅21+Part1,2==22+0⋅21+0=22=(100)2
Part2 oraz Part3
Analogicznie do Part1.
W przypadku Part3 mamy do czynienia z nieparzystą liczbą bitów. Wówczas bierzemy ⌈2n⌉ bądź ⌊2n⌋ gdzie n=max{sizeof(x),sizeof(y)} przy dzieleniu liczb na części R oraz L.
Liczby x,y tutaj to oczywiście (11)2 oraz (101)2 które się pojawiają w Part3.
Scalanie rozwiązania
Mamy Part1=(100)2, Part2=(11)2, Part3=(1111)2.
Zatem x⋅y=24⋅(100)2+(11112−1002−112)⋅22+(11)2==24⋅(100)2+22⋅(1000)2+(11)2==(1100011)2.