【问题标题】:Modular Exponentiation over a Power of 22 次幂的模幂运算
【发布时间】:2014-08-21 14:53:44
【问题描述】:

所以我最近一直在使用 modpow 函数做一些工作。当模数是 2 的幂时,我需要的一种形式是模指数。所以我启动并运行了代码。很好,没有问题。然后我读到一个技巧可以让你更快地得到它,而不是使用正则指数,而是将它的模数放在模数的总和上。

现在,当模数是 2 的幂时,答案就是 2 的幂小于当前的幂。嗯,这很简单。所以我对它进行了编码,它有时会起作用。

由于某些原因,有些值不起作用,我就是不知道它是什么。

uint32 modpow2x(uint32 B, uint32 X, uint32 M)
{
    uint32 D;

    M--;
    B &= M;
    X &= (M >> 1);
    D = 1;
    if ((X & 1) == 1)
    {
        D = B;
    }

    while ((X >>= 1) != 0)
    {
        B = (B * B) & M;
        if ((X & 1) == 1)
        {
            D = (D * B) & M;
        }
    }
    return D;
}

这是一组无效的数字。

Base = 593803430
Exponent = 3448538912
Modulus = 8

不,在这个函数中没有检查来确定模数是否是 2 的幂。原因是这是一个内部函数,我已经知道只有 2 的幂会传递给它。但是,我已经仔细检查以确保没有 2 的非幂。

感谢你们提供的任何帮助!

【问题讨论】:

  • 您是否尝试过添加一些std::cerr << "M " << M << ", B " << B << ... << '\n'; 行,以便查看哪里开始出错?还是使用调试器?

标签: c++ math exponentiation


【解决方案1】:

确实,如果 x 与 n 互质(x 和 n 没有公因数),那么 x^a = x^(phi(a)) (mod n),其中 phi是欧拉的总函数。那是因为 x 属于 multiplicative group of (Z/nZ),它的顺序是 phi(a)。

但是,对于 x 与 n 不互质,这就不再成立了。在您的示例中,基数确实与您的模数有一个共同的因素,即 2。所以这个技巧在这里不起作用。但是,如果您愿意,您可以编写一些额外的代码来处理这种情况——也许找到 x 可被整除的 2 的最大幂,例如 2^k。然后将 x 除以 2^k,运行您的原始代码,将其输出左移 k*e,其中 e 是您的指数,并减少模 M。当然,如果 k 不为零,这通常会导致答案零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2017-02-02
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多