逆元的认知与应用——处理除数很大的时候

1.什么是逆元

当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:

设c是b的逆元,则有b*c≡1(mod m);///b*c%m=1%m;

则(a/b)%m = (a/b)*1%m = (a/b)*b*c%m = a*c(mod m);

即a/b的模等于a*b的逆元的模;

逆元就是这样应用的.

2.求逆元的方法。

(1).费马小定理

在是素数的情况下,对任意整数都有。 
如果无法被整除,则有。 
可以在为素数的情况下求出一个数的逆元,,即为逆元。

题目中的数据范围1<=x<=10^9,p=1000000007,p是素数;

所以x肯定就无法被p整除啊,所以最后就得出x^(p-2)为x的逆元啦。

但是似乎还有个问题?如何判断a是否有逆元呢?

检验逆元的性质,看求出的幂值x与a相乘是否为1即可

当p比较大的时候需要用快速幂求解

复杂度O(logn);

const int mod = 1000000009;
long long qpow(long long a,long long b)
{
    if(b<0)
        return 0;
    long long res=1;
    a%=mod;
    while(b)
    {
        if(b & 1)
            res=(res*a)%mod;
        b >>= 1;
        a=(a*a)%mod;
    }
    return res;
}
long long inv(long long a)
{
   return  qpow(a,mod-2);
}

(2) 扩展欧几里得

给定模数m,求a的逆相当于求解ax=1(mod m)

这个方程可以转化为ax-my=1 
然后套用求二元一次方程的方法,用扩展欧几里得算法求得一组x0,y0和gcd 
检查gcd是否为1 
gcd不为1则说明逆元不存在 
若为1,则调整x0到0~m-1的范围中即可

PS:这种算法效率较高,常数较小,时间复杂度为O(ln n)

可扩展欧几里得求逆元ax≡1(mod n)其中a,n互质;

ll ecgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    else
    {
        ll r=ecgcd(b,a%b,x,y);
        ll temp=x;
        x=y;
        y=y-a/b*temp;
        return r;
    }
}
ll inv(ll a,ll n)
{
    ll x,y;
    exgcd(a,n,x,y);
    x = (x%n+n)%n;
    return x;
}

(3)逆元打表法

有时会遇到这样一种问题,在模质数p下,求1~n逆元 n< p(这里为奇质数)。可以O(n)求出所有逆元,有一个递推式如下

它的推导过程如下,设,那么

对上式两边同时除,进一步得到

再把替换掉,最终得到

初始化,这样就可以通过递推法求出1->n模奇素数的所有逆元了。

另外有个结论的所有逆元值对应中所有的数,比如,那么对应的逆元是

const int n=le5+5;
int inv[n];
void inverse(int n,int p)
{
    inv[1]=1;
    for(int i=2 ; i<=n ;i++)
    {
        inv[i]=(ll)(p-p/i)*inv[p%i]%p;
    }
}

补充习题练手处:https://blog.csdn.net/acdreamers/article/details/8220787

原文地址:https://www.cnblogs.com/shuaihui520/p/8972903.html

时间: 2024-11-02 17:42:47

逆元的认知与应用——处理除数很大的时候的相关文章

大数据公司挖掘数据价值的49个典型案例!信息量很大

大数据公司挖掘数据价值的49个典型案例 对于企业来说,100条理论确实不如一个成功的标杆有实践意义,本文的主旨就是寻找"正在做"大数据的49个样本. 力图从企业运营和管理的角度,梳理出发掘大数据价值的一般规律:一是以数据驱动的决策,主要通过提高预测概率,来提高决策成功率;二是以数据驱动的流程,主要是形成营销闭环战略,提高销售漏斗的转化率;三是以数据驱动的产品,在产品设计阶段,强调个性化;在产品运营阶段,则强调迭代式创新. 上篇 天然大数据公司的各种套餐 从谷歌.亚马逊.Facebook

《日常神经科学》神经科学的很大一个目标,就是让文艺和浪漫的事,变得不文艺不浪漫(因为给出了人感觉到文艺和浪漫的科学的解释)。三星推荐

不错的神经科学的科普.作者是英国神经科学在读博士.文笔比较幽默.大部分的内容都说的比较有趣. 以下是书中一些内容的摘抄: 神经科学的很大一个目标,就是让文艺和浪漫的事,变得不文艺不浪漫(因为给出了人感觉到文艺和浪漫的科学的解释): 这是谎言:正常人的大脑只开发了10%: 一条裙子的颜色(白金.蓝黑)引发的全球口水战,原因在于:对于所见之物,我们每时每刻都在脑补: 人的听力随年龄增长逐渐下降.到了35岁,已经明显听不到许多高频声音了.有个英国大叔讨厌在他家门口玩的小孩,就做了一个会发出高频声音的音

新产品为了效果,做的比较炫,用了很多的图片和JS,所以前端的性能是很大的问题,分篇记录前端性能优化的一些小经验。

第一篇:HTTP服务器 因tomcat处理静态资源的速度比较慢,所以首先想到的就是把所有静态资源(JS,CSS,image,swf) 提到单独的服务器,用更加快速的HTTP服务器,这里选择了nginx了,nginx相比apache,更加轻量级, 配置更加简单,而且nginx不仅仅是高性能的HTTP服务器,还是高性能的反向代理服务器. 目前很多大型网站都使用了nginx,新浪.网易.QQ等都使用了nginx,说明nginx的稳定性和性能还是非常不错的. 1. nginx 安装(linux) htt

191.每个生命所散发的正能量或负能量是否都会起到很大的作用?

读者不忘初心提问 正邪两股力量的博弈,就像我们地球文字所描述的那样"不是东风压倒西风,就是西风压倒东风",而任何生命所发出的正能量或负能量,都会毫不例外地各自加入到这两股力量当中,既然宇宙是那么一个空旷而浩瀚的空间,宇宙当中的各个星球,就好比我们地球空气中的微尘一样,任何大小的风力都能对这些微尘产生作用.所以说我们每一个人或者每个生命,所散发的正能量或负能量,都会起到很大的作用.这样理解对吗? 光明解答 你的理解基本上正确.看到亲人们能悟到这么高深的道理,我作为宇宙知识的传播者,感到非

为何很大的浮点大数加一个很小的数计算结果不是预期

通常浮点数被表示成N=S*rj S称为尾数,可正可负,j称为阶码可正可负.r是基数,在计算机中取以2的倍数. 计算机中为了提高精度,进行规格化操作:即假设N=11.0101  则规格化表示为N=0.110101*210表示,因为该规格化使得浮点数的表示精度最高. 机器中浮点数由两部分组成:阶码和尾数.基数为2 阶码由阶符跟阶码组成,尾数由数符跟尾数组成 其中阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位数.尾数是小数,其位数反映了浮点数的精度. 还有机器零这个概念:即浮

一盘很大的棋:Android Wear要做用户唯一的收件箱

在今年的Google I/O 2014上,Google用一组数据告诉了我们:"安卓月活跃用户达 10 亿,用户每天点亮.解锁手机 1000 亿次". 这么算下来,一个合格的安卓用户每天都要解锁100此次呀.亲,你及格了么?三分钟一次信息提醒,五分钟两次消息推送,一个强迫症怎么可能经受的住这种折磨呢?总有收到新消息的错觉,总有遗漏信息的幻觉,无数次的点亮.解锁手机就成了必修课. Google已经看到了智能手机时代的上述问题,不会让这样的问题再延续到智能手表上,想要借助新的工具和战场,真正

《Spring MVC学习指南》一书具有很大的欺骗性

2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul Deck著于2014年,林催二人于2015年翻译,2016年第6次印刷.我在淘宝上购买时就询问是哪个版本,店小二确实搞不清.我看了淘宝店此书的编辑推荐.目录.内容推荐,仍然看不出是哪个版本. 书买来,我稍微翻了一下,确认是基于Spring MVC 2.5的.这就问题大了,现在3.1版以后,方法完全不同变化很大,

一位老it工程师的忠告,新手进来学习,老手进来体会,收获很大。

诸位,咱当电子工程师也是十余年了,不算有出息,环顾四面,也没有看见几个有出息的!回顾工程师生涯,感慨万千,愿意讲几句掏心窝子的话,也算给咱们师弟师妹们提个醒,希望他们比咱们强! [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些.那么,就需要慎重安排自己的轨迹.从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,非凡是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本

创建一个很大的EMP表 EMP_LARGE

--CREATE TABLE EMP_LARGE AS SELECT * FROM EMP ; ---先复制一张EMP表 DECLARE --声明变量 v_loop NUMBER; v_num NUMBER; too_large EXCEPTION; BEGIN --开始执行 FOR v_loop IN 1 .. 100 LOOP --EMP开始是14条,14*2^100应该是很大的数了吧 SELECT COUNT(*) INTO v_num FROM emp_large; IF v_num <