乘法逆元小结

在求解除法取模问题(a/b)%m时,我们可以转化为(a%(bm))/b
但是如果b很大,则会出现爆精度问题,所以我们避免使用除法直接计算。
可以使用逆元将除法转换为乘法:
假设b存在乘法逆元,即与m互质(充要条件)。设c是b的逆元,即bc1(modm),那么有a/b=(a/b)1=(a/b)bc=ac(modm)
即,除以一个数取模等于乘以这个数的逆元取模。

  1. 逆元求解一般利用扩欧。
  2. m为质数的时候直接使用费马小定理,m非质数使用欧拉函数。
  3. m为质数的时候,神奇的线性方法。

扩展欧几里得算法:

要求a,m互素。存在唯一解。
之前总结过扩展欧几里得算法

代码:

int extgcd(int a, int b, int& x, int& y)
{int d = a;if(b != 0){d = extgcd(b, a % b, y, x);y -= (a / b) * x;}else {x = 1;y = 0;}return d;
}
int mod_inverse(int a, int m)
{int x, y;extgcd(a, m, x, y);return (m + x % m) % m;
}

费马小定理:

p是素数的情况下,对任意整数x都有xpx(mod)p
如果x无法被p整除,则有xp11(modp)
可以在p为素数的情况下求出一个数的逆元,xxp21(modp)xp2即为逆元。

代码:

利用快速幂求出逆元。

欧拉函数:

ϕ(m)表示小于等于m且与m互素的正整数的个数。
如果xm互质,则有xϕ(m)1(modm),即x×xϕ(m)11(modm)xϕ(m)1即为x的逆元。
m为质数的情况下,ϕ(m)=m1,即为费马小定理。

代码:

关键是求出欧拉函数的值。
利用欧拉函数的积性性质

对于任意整数n,可以将它分解n=pk11pk22pk33...pkmm,其中pi为质数。

其中ϕ(n)=ϕ(p1k1)ϕ(pk22)...ϕ(pkmm)

最后转化为ϕ(n)=n(pi1)/pi

对给定n进行整数分解。时间复杂度O(n)

int eurler_phi(int n)
{int res = n;for(int i = 2; i * i <= n; i++){if(n % i == 0){res = res / i * (i - 1);while(n % i == 0) n /= i;}}if(n != 1) res = res / n * (n - 1);return res;
}

筛法求欧拉函数值的表,利用埃氏筛法,每次发现质因子就把他的倍数的欧拉函数乘上(p1)p。时间复杂度O(maxn)
如ACdreamers博客里介绍,利用定理进行优化:

当n为奇数时,有ϕ(2n)=ϕ(n)

因为2n是偶数,偶数与偶数一定不互素,所以只考虑2n与小于它的奇数互素的情况,则恰好就等于n的欧拉函数值。

int euler[maxn];
void euler_phi2()
{for(int i = 1; i < maxn; i++){if(i % 2 == 0)  euler[i] = i / 2;else  euler[i] = i;}for(int i = 3; i < maxn; i += 2){if(euler[i] == i){for(int j = i; j < maxn; j += i){euler[j] = euler[j] / i * (i - 1);}}}
}

线性时间求所有逆元:

规定p为质数,且111(modp)
p=ka+b,b<a,1<a<p,即ka+b0(modp)
两边同时乘以a1b1,得到
kb1+a10(modp)
a1kb1(modp)
a1p/a(pmoda)1(modp)
从头开始扫一遍即可,时间复杂度O(n)

代码:

int inv[maxn];
inv[1] = 1;
for(int i = 2; i < maxn; i++)inv[i] = (p - p / i) % p * inv[p % i];

转载于:https://www.cnblogs.com/Tuesdayzz/p/5758670.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产光刻机的现状究竟如何?

来源&#xff1a;人民网-上海频道随着信息社会的迅速发展&#xff0c;手机、电脑、电视等各种电子设备越来越“迷你”&#xff0c;从之前的“大哥大”到现在仅仅几个硬币厚的时尚手机&#xff0c;从老式的矮胖电视到如今轻薄的液晶电视&#xff0c;都不离开集成电路的发展&…

pytorch自定义卷积核权值参数

pytorch中构建卷积层一般使用nn.Conv2d方法&#xff0c;有些情况下我们需要自定义卷积核的权值weight&#xff0c;而nn.Conv2d中的卷积参数是不允许自定义的&#xff0c;此时可以使用torch.nn.functional.conv2d简称F.conv2d torch.nn.functional.conv2d(input, weight, biasN…

如何使用UR机器人模拟软件URsim

如何使用UR机器人模拟软件URsim 机器人软件适用版本&#xff1a;Polyscope v1.3及以上 适用机器人&#xff1a;UR3、UR5、UR10 由于优傲机器人的系统是基于Linux核心开发的&#xff0c;模拟软体URsim也是在Linux系统下运行&#xff0c;通常大家使用的电脑系统为Windows&#…

C++中派生类隐式调用与显式调用基类的构造函数

通过派生类的构造函数调用基类的构造函数有两种方式&#xff0c;隐式和显式两种。 所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数&#xff0c;这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式&#xff0c;就是在…

中国团队新型类脑芯片登上《自然》封面

来源&#xff1a;澎湃新闻网从AlphaGo战胜人类顶级围棋选手&#xff0c;到人工智能系统以90%准确率诊断儿科疾病&#xff0c;近年来&#xff0c;人工智能的突破大多从智能的某个领域接近或超过人类智能&#xff0c;距离达到人类水平的人工通用智能&#xff08;AGI&#xff0c;A…

20145324 《Java程序设计》第6周学习总结

20145324 《Java程序设计》第6周学习总结 教材学习内容总结 第十章 1、使用输入串流将数据从来源取出 InputStream 使用输出串流将数据写入目的地 OutStream 2、dump()方法并没有限定来源或目的地真实形式&#xff0c;依赖InputStream、OutStream 3、可以使用dump()从HTTP服务器…

MATLAB Robotic Toolbox 机器人工具箱示例

程序是基于Matlab2016a&#xff0c;工具箱版本为Robotic Toolbox 10.2 参考博客&#xff1a; MATLAB机器人工具箱使用 Matlab Robotic Toolbox V9.10工具箱(三)&#xff1a;轨迹规划 六轴机器人建模方法、正逆解、轨迹规划实例与Matalb Robotic Toolbox 的实现 效果&#xff1a…

人工智能最受欢迎的十大TED演讲

来源&#xff1a;DataCastle数据城堡当我们过于关注机器学习的技术实现时&#xff0c;往往就会忽略技术在未来的应用及其政治后果。本文并没有讨论最适合解决某个问题可以用什么语言或算法&#xff0c;而是从最受欢迎的非营利组织TED中收集了一系列演讲。在这一系列的演讲中&am…

C++编程(一):匈牙利命名法

匈牙利命名法 许多 Windows 程序员都使用“匈牙利标记法”作为变量命名约定。这是为了纪念具有传奇色彩的微软程序员 Charles Simonyi。这种标记法非常简单&#xff0c;其基本原则为&#xff1a; 即变量名&#xff08;标识符&#xff09;以一个或者多个小写字母开始&#xff0…

jQuery基本过滤选择器

1 <% page language"java" import"java.util.*" pageEncoding"utf-8"%>2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">3 <html>4 <head>5 <!-- jQuery基本过滤选择器 -->6 …

IndexError: tensors used as indices must be long, byte or bool tensors

下面的程序会报错IndexError: tensors used as indices must be long, byte or bool tensors mask torch.Tensor([True,True,False]) a torch.Tensor([3,2,1]) a[mask]0 print(a) 原因是索引要为long, byte 或 bool类型&#xff0c;因此需要将mask转换为bool类型&#xff0…

工业机器人国内外的发展现状

工业机器人国内外的发展现状 工业机器人是集合了机械原理、系统动力学、机构运动学、计算机技术、控制理论、传感和人工智能等多种先进技术于一身的综合性装备[10]。1959年&#xff0c;由享有“机器人之父”美誉的恩格尔﹒伯格先生和德奥尔先生于美国共同发明了第一台工业机器…

知识图谱、深度学习、AutoML,推荐系统与新技术结合将碰撞出怎样的火花?

来源&#xff1a;CSDN App近日&#xff0c;来自意大利米兰理工大学 Maurizio 团队发表的一篇极具批判性的文章火了。这篇文章剑指推荐系统领域的其他数十篇论文&#xff0c;并通过多项试验证明这些论文中基于深度学习的推荐算法大部分都存在不同程度的数据集缺失和源码缺失的问…

团队博客 一 需求分析

团队名字&#xff1a;全都是土豆 团队成员&#xff1a;组长&#xff1a;张哲 成员&#xff1a;冯钰彤、魏利华 博客地址&#xff1a;张哲&#xff1a;http://www.cnblogs.com/zz0906/ 魏利华&#xff1a;http://www.cnblogs.com/a1397240667/ 冯钰彤&#xff1a;http://www.cnb…

RuntimeError: Subtraction, the `-` operator, with a bool tensor is not supported. If you are trying

下面的程序会报错&#xff1a;RuntimeError: Subtraction, the - operator, with a bool tensor is not supported. If you are trying to invert a mask, use the ~ or logical_not() operator instead. mask torch.Tensor([True,True,False]).type(torch.bool) a torch.Te…

VS2015无法打开包括文件corecrt.h 无法打开文件ucrtd.lib

VS2015无法打开包括文件"corecrt.h" 无法打开文件"ucrtd.lib" 在网上是VS2015的一个BUG&#xff0c;如果是选择"从父级或项目默认设置继承"时&#xff0c;在Windows Kits\10\include 和 Windows Kits\10\lib 目录下导入的是10.0.10240.0文件夹&…

面向对象的七大设计原则

总脉络图&#xff1a; 一&#xff1a;单一职责原则(全称&#xff1a;“Single-Responsibility Principle”)又称 单一功能原则 核心&#xff1a;解耦和增强内聚性&#xff08;高内聚&#xff0c;低耦合&#xff09; 说明&#xff1a; 就一个类而言&#xff0c;应该只专注于做一…

人机融合智能的思考

来源&#xff1a;人机与认知实验室【人机智能难于融合的主要原因就在于时空和认知的不一致性&#xff0c;人处理的信息与知识能够变异&#xff0c;其表征的一个事物、事实既是本身同时又是其他事物、事实&#xff0c;一直具有相对性&#xff0c;机器处理的数据标识缺乏这种相对…

工艺篇:常用表面处理

工艺篇&#xff1a;常用表面处理 表面处理定义 表面处理是在基体材料表面上人工形成一层与基体的机械、物理和化学性能不同的表层的工艺方法。表面处理的目的是满足产品的耐蚀性、耐磨性、装饰或其他特种功能要求&#xff0c;表面处理按照机理来分可以分为以下4部分&#xff…

NASA发现超级地球,真的适宜居住?

来源&#xff1a;中国新闻网中新网8月2日电 当地时间7月31日&#xff0c;NASA宣布&#xff0c;他们的凌日系外行星勘测卫星(TESS)&#xff0c;在距离地球约31光年的地方&#xff0c;发现了一颗可能有生命存在的“超级地球”。天文学家制作的GJ357d星球概念图。图片来源&#xf…