栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

求模的质数的反数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

求模的质数的反数

因为对于大的素数,我必须要做的事

a ^ (p-2)
通常是无法计算的。

您需要模幂,因此使用IVlad提到的平方求幂,
最多只需要

Θ(logp)
大小的模乘
p-1
。中间结果受的限制
p^2
,因此尽管
a^(p-2)
无法计算大素数,但
(a ^ (p-2)) %p
通常是。该方法易于实现:

unsigned long long invert_mod(unsigned long long a, unsigned long long p) {    unsigned long long ex = p-2, result = 1;    while (ex > 0) {        if (ex % 2 == 1) { result = (result*a) % p;        }        a = (a*a) % p;        ex /= 2;    }    return result;}

但有一些缺点。

(p-1)^2
必须在所使用的类型中可表示(如果使用任意精度整数,这不是问题[除非使用
p
精度],否则不是问题),否则由于溢出而导致无效结果,并且它始终至少使用
log (p-2)/log 2
模块化乘法。

如user448810所建议的那样,扩展的欧几里得算法或等效的连续分数方法永远不会产生大于的中间值

p
,从而避免了所有
p
可表示的溢出问题,并且通常需要较少的除法。此外,它不仅计算素数,还计算任何两个互质数的模逆。

unsigned long long invert_mod(unsigned long long a, unsigned long long p) {    unsigned long long new = 1, old = 0, q = p, r, h;    int pos = 0;    while (a > 0) {        r = q%a;        q = q/a;        h = q*new + old;        old = new;        new = h;        q = a;        a = r;        pos = !pos;    }    return pos ? old : (p - old);}

代码稍长一些,但是优化的编译器应该将其编译为短循环,每次迭代仅使用一个除法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637436.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号