В соответствии с представлением степени в двоичной записи начиная со старших разрядов проходим к младшим: 1) если 1 -- возводим в квадрат по модулю p и умножаем на основание 2) если 0 -- просто в квадрат
Ответ -- результат: Код который это реализует:
function VSDK(Base, Power, Modul: Integer): Integer;
asm
push ebx
push edi
mov edi, eax
mov eax, 1
push ecx
bsr ecx, edx
mov ebx, ecx
sub ecx, 31
neg ecx
shl edx, cl
inc ebx
pop ecx
@@1: push edx
mul eax
div ecx
mov eax, edx
pop edx
shl edx, 1
jnc @@2
push edx
mul edi
div ecx
mov eax, edx
pop edx
@@2: dec ebx
jnz @@1
pop ebx
pop edi
ret
end;
|