Все знают о замене целочисленного деления умножением с использованием обратного reciprocal.
Пробую найти в сети упоминание о замене деления умножения с помощью обратного modular multiplicative inverse.
И не находится. Киньте ссылочку, люди добрые :-)
Вот пример, ищу нечто похожее (для C-шников - все числа и сдвиги беззнаковые):
function ShaDivMod10(ADividend: cardinal; var ARest: cardinal): cardinal;
const
Shift= 1;
Inverse= $CCCCCCCD;
ToIndex= 28;
Stamp: array[0..15] of cardinal= ($00000000, $00000000, $00000001, $33333334,
$33333334, $00000001, $66666667, $66666667,
$66666667, $9999999A, $9999999A, $9999999A,
$CCCCCCCD, $CCCCCCCD, $CCCCCCCD, $00000001);
Rest: array[0..15] of cardinal= (0, 0, 10, 8, 8, 10, 6, 6, 6, 4, 4, 4, 2, 2, 2, 10);
var
i: cardinal;
begin;
Result:=ADividend shr Shift * Inverse;
i:=Result shr ToIndex;
Result:=Result - Stamp[i];
ARest:=Rest[i] + ADividend and (1 shl Shift - 1);
end;
Краткое описание здесь:
http://guildalfa.ru/alsha/node/34