微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有使用 64 位整数快速计算两个模一个大素数的幂的技巧?

如何解决是否有使用 64 位整数快速计算两个模一个大素数的幂的技巧?

我只是想出了这个:

// calculates 2^n mod p
uint64_t twopow(uint64_t n,uint64_t p) {
    const constexpr uint64_t bitmask {18446744073709551615ull}; // 2^64-1
    uint64_t res = 1 << (n % 64);
    res *= modpow(1 + (bitmask ^ p),n >> 6,p);
    
    return res % p;
}

它的作用是通过对所有 1 的整数进行异或运算来反转 p 的位,得到 2^64-p-1,相当于 2^64-1 mod p 然后加 1 得到 2 ^64 模组 p.然后写 n=64*a+b 和 2^n=(2^64)^a*2^b。

一般来说,我的 p,n 在 2^32 和 2^64 之间。在此区间内,您不能直接将整数相乘,否则它们会溢出,因此您必须使用一种变通方法,例如蒙哥马利模算术或俄罗斯农民乘法,这会损害性能。使用位掩码的技巧将 n 减少了 6 位,但通常它仍然可以像 2^58 一样大,并且由于指数的基数不再是 2,我们失去了(可能的)优势。如果 p 小于 2^32,是否有计算 2^n mod p 和重复平方一样快的技巧?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。