Вы так же действовали для
?
Для
я в явном виде выписал многочлен
, принимающий значения
на числах
,
(имеются в виду единица с тройкой при сложении по модулю
) и
на остальных. И теперь, складывая числа
и
, я их вначале складываю побитовым ксором, а если
оказывается равным единице, то дополнительно ксорю
в старший разряд суммы.
При
больше ничего делать и не надо, поскольку более старших разрядов у нас уже и нет. А вот при бОльшем
надо начинать учитывать дальнейшие переносы... Конечно, для каждого конкретного
можно тупо перебирать все возможные значения слагаемых и наворачивать многочлены, осуществляющие особое сложение для каждой их пары. Но это плохой метод: всё равно что составлять специальные таблицы умножения двухзначных, трёхзначных и т. д. чисел вместо того, чтобы учиться умножать столбиком. И длины формул будут экспоненциально разрастаться с ростом
. Хуже того, я даже не вижу систему, которое бы позволила однородным образом выписывать такие длинные формулы, просто замечаю, что раз
конечно, то там будет конечный перебор.
В идеале бы хотелось иметь одну и ту же формулу для всех достаточно больших
-- Вс авг 26, 2012 01:51:16 --А ведь поразрядное умножение реализуется через выделение разряда! Выделяем, сдвигаем, умножаем, сдвигаем назад, а потом всё ксорим.
Я это мыслю так: храним в уме бит переноса, движемся справа налево, на очередной позиции ксорим два имеющихся разряда и бит переноса к ним до кучи, если проксорили не менее двух единиц, кладём в бит переноса
, иначе кладём
, сдвигаемся влево на следующую позицию и повторяем процедуру, останавливаемся, когда доходим до левого края.