Prawdopodobnie spędziłem więcej czasu na tym pytaniu niż powinienem, ale oto moje ustalenia.
Nie mogę znaleźć żadnego przykładu „czystego” równoległego sumatora przedrostków dla liczb ujemnych. Myślę też, że to otwarty problem, ponieważ nie widziałem żadnego dowodu, że nie jest to możliwe.
Najbliżej, jak mogę cię zdobyć, jest zastosowanie dwuetapowego negatywnego dodatku negabinarnego (często w literaturze skróconego nnba). Opiera się na następującej właściwości:
Niech i . Są to w zasadzie operacje XOR z odpowiednio i . Następnie możesz to udowodnić g ( x ) = x n - 1 ¯ x n - 2 . . . x 1 ¯ x 0fa( x ) = xn - 1¯¯¯¯¯¯¯¯¯¯xn - 2. . . x1¯¯¯¯¯x0sol( x ) = xn - 1xn - 2¯¯¯¯¯¯¯¯¯¯. . . x1x0¯¯¯¯¯0xAA...AA
0x55...55
- ( a +n bb ) = g( f( a ) + f( b ) + 1 )
Gdzie lewa strona jest sumą ujemną , podczas gdy po prawej stronie jest normalną sumą binarną.+n b+
Suma ujemna może być po prostu odwrócona przy użyciu tej samej właściwości, ale z operandem zerowym:
- x = g( f( x ) + f( 0 ) + 1 )
Aby więc znaleźć sumę przy użyciu równoległych sumatorów prefiksów, możesz:
- Oblicz i , tj. odwracając każdy nieparzysty kawałek liczb ujemnychfa( )fa( b )
- Oblicz regularną sumę binarną, ustawiając bit przenoszenia dla LSB ( ), prowadząc do pierwszej sumy pośredniej .+ 1s1
- Odwróć wszystkie bity (to jest ). To jest koniec pierwszej sumy, a zarazem rozpoczęcie inwersji.s1fa( g( s1) )
- Zwiększ wynik o
0xAA...AB
( ) przy użyciu sumatora równoległego prefiksu, uzyskując drugą sumę pośrednią= f( 0 ) + 1s2)
- Oblicz (odwracając każdy parzysty bit), aby znaleźć ostateczną sumę negabinarną.sol( s2))
W rzeczywistości próbowałem znaleźć „czysty” równoległy sumator prefiksów, ale uznałem, że jest to zbyt skomplikowane na czas, jaki chciałem na to poświęcić. Dlatego:
Cały punkt dodawania równoległych prefiksów polega na znalezieniu operacji która pozwala łatwo obliczyć (w tym przypadku 2) przenosi z tych bitów. Jako dodatkowe ograniczenie operacja musi być asocjacyjna, aby mogła być obliczana równolegle. Na przykład, w zasadzie wyklucza to dowolny operator NOT (który nie jest częścią podwójnej negacji). Na przykład: nie jest operatorem asocjacyjnym, ponieważ{ 0 , 1 }n× { 0 , 1 }n→ { 0 , 1 }na ∘ b = a ⋅ b¯
( a ∘ b ) ∘ ca ∘ ( b ∘ c )= a ⋅ b¯⋅ c¯= a ⋅ b ⋅ c¯¯¯¯¯¯¯¯¯¯
Zauważ, że operator logiczny dla przeniesień w twoim pytaniu zawiera mieszane terminy i , co uniemożliwia użycie go takim, jakim jest. W przypadku pojedynczego przeniesienia w normalnym dodatku binarnym stało się całkiem oczywiste, jak skonstruować tego operatora, gdy myśli się o nim w kategoriach generowania i propagacji , ale wydaje się, że nie jest to takie oczywiste w przypadku przeniesień ujemnych. c - i ¯ c + ido+jado-ja¯¯¯¯¯do-jado+ja¯¯¯¯¯