-5

问题- 使用 Intel86 模拟器,给定三个单字节数字 X、Y 和 Z (1<X,Y,Z<100),编写计算模幂 X^y mod Z 的代码(示例,X=4,Y=3,Z=5 结果 = 4) . X、Y 和 Z 位于程序的内存位置 107H、108H 和 109H,因此请确保不要将这些字节用于指令。计算结果必须存储在 DL 中。用于计算模幂 X^y mod Z 的算法代码为:d,1。假设 Y 由位表示 Yk,Yk-1,Yk-2,...Y0 For j <-- k 到零 d <-- (d d) % Z IF Y1 == 1 then d <-- (d X) % Z 结果在 d 中。

4

2 回答 2

1

似乎该算法措辞不佳,而且也是倒退的,假设目标是反复平方 X mod Z 以加快该过程。

    R = 1;
    goto loop1;
loop0: 
    if(Y & 1) /* if least signficant bit of Y is set */
        R = (R * X) % Z;
    X = (X * X) % Z
    Y = (Y >> 1) /* logical (unsigned) shift right) */
loop1:
    if(Y != 0)
        goto loop0;
    DL = R;
于 2015-04-28T02:32:56.453 回答
1

我想有一个错字“IF Y1 ...”应该是“IF Yj ...”。该算法也不完整,应该在任何地方都有一个转变。以下是 C 中算法的示例:

#include <stdio.h>
int main (void)
{
    unsigned char X = 4, Y = 3, Z = 5;

    printf("(%d ^ %d) %% %d = ",X,Y,Z);

    unsigned int d = 1;
    for (int j=7; j>=0; --j)
    {
        d = (d*d) % Z;
        if (Y & 0x80)           // leftest bit (Yj) set?
        {
            d = (d * X) % Z;
        }
        Y <<= 1;
    }

    printf("%d\n", d);

    return 0;
}

如果我只知道“Intel86 模拟器”是什么... ;-)

于 2015-04-28T17:18:31.143 回答