Provavelmente gastei mais tempo com essa questão do que deveria, mas aqui estão minhas descobertas.
Não consigo encontrar nenhum exemplo de um somador de prefixo paralelo "puro" para números negativos. Eu também acho que é um problema em aberto, pois não vi nenhuma prova de que isso não seja possível.
O mais próximo que posso chegar é de um acréscimo negativo negativo de duas etapas (nnba comumente abreviado na literatura). É baseado na seguinte propriedade:
Seja e g ( x ) = x n - 1 ¯ x n - 2 . . . x 1 ¯ x 0 . Estas são basicamente uma operação XOR com e respectivamente. Você pode provar quef(x)=xn−1¯¯¯¯¯¯¯¯¯¯xn−2...x1¯¯¯¯¯x0g(x)=xn−1xn−2¯¯¯¯¯¯¯¯¯¯...x1x0¯¯¯¯¯0xAA...AA
0x55...55
−(a+nbb)=g(f(a)+f(b)+1)
Onde o lado esquerdo é a soma negabinária , enquanto o + no lado direito é uma soma binária normal.+nb+
A soma negativa pode ser simplesmente invertida usando a mesma propriedade, mas com um operando zero:
−x=g(f(x)+f(0)+1)
Portanto, para encontrar a soma usando somadores de prefixo paralelos, você pode:
- Calcular e f ( b ) , isto é. invertendo todos os bits ímpares dos números negativosf(a)f(b)
- Calcule a soma binária regular enquanto define o bit de transporte para o LSB (o ), levando a uma primeira soma intermediária s 1 .+1s1
- Inverta todos os bits de (este é f ( g ( s 1 ) ) ). Este é o final da primeira soma, enquanto também inicia a inversão.s1f(g(s1))
0xAA...AB
=f(0)+1s2
- g(s2)
Na verdade, tentei encontrar um somador de prefixo paralelo "puro", mas considerei muito complexo o tempo que estava disposto a gastar nele. Aqui está o porquê:
{0,1}n×{0,1}n→{0,1}na∘b=a⋅b¯
(a∘b)∘ca∘(b∘c)=a⋅b¯⋅c¯=a⋅b⋅c¯¯¯¯¯¯¯¯¯¯
c+ic−i¯¯¯¯¯ and c−ic+i¯¯¯¯¯, making it impossible to use it as-is. For a single carry in normal binary addition, it became quite obvious how to construct this operator when thinking about it in terms of generation and propagation, but it seems to be not so obvious for negabinary carries.