费马小定理&欧拉定理
在p是素数的情况下,对任意整数x都有xp≡x(mod p)。这个定理被称作费马小定理其中如果x无法被p整除,我们有xp-1≡1(mod p)。利用这条性质,在p是素数的情况下,就很容易求出一个数的逆元。那上面的式子变形之后得到a-1≡ap-2(mod p),因此可以通过快速幂求出逆元。
我们先来证明一下费马小定理:
费马小定理证明:
一、准备知识
引理1:剩余系定理2
若a,b,c为任意3个整数,m为正整数,且(m,c)=1,则当ac≡bc(mod m)时,有a≡b(mod m)
证明:ac≡bc(mod m)可得ac–bc≡0(mod m)可得(a-b)c≡0(mod m)因为(m,c)=1即m,c互质,c可以约去,a–b≡0(mod
m)可得a≡b(mod m)
引理2:剩余系定理5
若m为整数且m>1,a[1],a[2],a[3],a[4],…a[m]为m个整数,若在这m个数中任取2个整数对m不同余,则这m个整数对m构成完全剩余系.
证明:构造m的完全剩余系(0,1,2,…m-1),所有的整数必然这些整数中的1个对模m同余.取r[1]=0,r[2]=1,r[3]=2,r[4]=3,…r=i-1,1<i<=m.令(1):a[1]≡r[1](mod m)(顺序可以不同),因为只有在这种情况下才能保证集合{a1,a2,a3,a4,…am}中的任意2个数不同余,否则必然有2个数同余.由式(1)自然得到集合{a1,a2,a3,a4,…am}对m构成完全剩余系.
引理3:剩余系定理7
设m是一个整数,且m>1,b是一个整数且(m,b)=1.如果a1,a2,a3…am是模m的一个完全剩余系,则ba[1],ba[2],ba[3],ba[4],…ba[m]也构成模m的一个完全剩余系.
证明:若存在2个整数ba和ba[j]同余即ba≡ba[j](mod m),根据引理2则有a≡a[j](mod m).根据完全剩余系的定义和引理4(完全剩余系中任意2个数之间不同余,易证明)可知这是不可能的,因此不存在2个整数ba和ba[j]同余.由引理5可知ba[1],ba[2],ba[3],ba[4],…ba[m]构成模m的一个完全剩余系.
引理4:同余定理6
如果a,b,c,d是四个整数,且a≡b(mod m),c≡d(mod m),则有ac≡bd(mod m)
证明:由题设得ac≡bc(mod m),bc≡bd(mod m),由模运算的传递性可得ac≡bc(mod m)
二、证明过程:
构造素数p的完全剩余系P={1,2,3,4…(p-1)},因为(a, p)=1,由引理3可得A={a,2a,3a,4a,…(p-1)a}也是p的一个完全剩余系.令W=1*2*3*4…*(p-1),显然W≡W(mod p).令Y=a*2a*3a*4a*…(p-1)a,因为{a,2a,3a,4a,…(p-1)a}是p的完全剩余系,由引理2以及引理4可得a*2a*3a*…(p-1)a≡1*2*3*…(p-1)(mod p)即W*a^(p-1)≡W(modp).易知(W,p)=1,由引理1可知a^(p-1)≡1(mod
p)
补充:在p不是素数的情况下,我们也有类似的欧拉定理可以使用。欧拉函数是然后再有欧拉定理
我们就可以得到乘法逆元。
欧拉定理:
一、准备知识:
欧拉函数:在数论中,对于正整数n,欧拉函数是小于n的数与n互质的数的数目。Φ(m)=m×П(pi-1)/pi
证明:先给出任意的正整数n=p1a[1]*p2a[2]*……*pka[k]
然后用容斥原理,首先从总数n中减去n/p1,n/p2,……n/pk的个数然后再加上同时是两个素因子的倍数的个数,再减去同时是三个素因子的倍数的个数……这样我们就可以得到一个公式:
现在有了公式,可是这个公式的时间复杂度是O(2k),所以我们需要对其进行化简,这步并不简单,但最后可以化简出
二、证明
aφ(n) * x1 * x2 *... * xφ(n) mod n ≡ (a * x1) * (a * x2) * ... * (a * xφ(n)) mod n
≡ (a * x1 mod n) * (a * x2 mod n) * ... * (a * xφ(n) mod n) mod n
≡ x1 * x2 * ... * xφ(n) mod n
对比等式的左右两端,因为xi (1 ≤ i ≤
φ(n)) 与 n 互质,所以 aφ(n) ≡ 1 (mod n)
证明的东西到这里大概就结束了…………
下面来说一下时间复杂度。。。。。。。。
因为整数分解可以在O(√n)之内完成,所以对于某一个的欧拉函数也可以在O(√n)时间内求得。另外,我们可以利用埃氏筛法,每次发现质因子时就把它的倍数的欧拉函数乘上(p-1)/p,这样就可以一次性求出1-n的欧拉函数表了。
首先先说一种在O(√n)的时间内求出欧拉函数的值
int euler_phi(int n){
int res=n;
for(int i=;i*i<=n;i++){
if(n%i==){
res=res/i*(i-);
for(;n%i==;n/=i);
}
}
if(n!=)res=res/n*(n-);
return res;
}
//O(n)时间筛出欧拉函数表
int n;
int euler[];
void euler_phi(){
for(int i=;i<=n;i++)euler[i]=i;
for(int i=;i<=n;i++){
if(euler[i]==i){
for(int j=i;j<=n;j+=i)euler[j]=euler[j]*(i-)/i;
}
}
}
费马小定理&欧拉定理的更多相关文章
- 学习:费马小定理 & 欧拉定理
费马小定理 描述 若\(p\)为素数,\(a\in Z\),则有\(a^p\equiv a\pmod p\).如果\(p\nmid a\),则有\(a^{p-1}\equiv 1\pmod p\). ...
- 【初等数论】费马小定理&欧拉定理&扩展欧拉定理(暂不含证明)
(不会证明--以后再说) 费马小定理 对于任意\(a,p \in N_+\),有 \(a^{p-1} \equiv 1\pmod {p}\) 推论: \(a^{-1} \equiv a^{p-2} \ ...
- 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)
http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,“至少”一词可以给我们提示,我们可以枚举 ...
- 【poj 1284】Primitive Roots(数论--欧拉函数 求原根个数){费马小定理、欧拉定理}
题意:求奇质数 P 的原根个数.若 x 是 P 的原根,那么 x^k (k=1~p-1) 模 P 为1~p-1,且互不相同. (3≤ P<65536) 解法:有费马小定理:若 p 是质数,x^( ...
- hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925
首先,我们珂以抽象出S函数的模型:把n拆成k个正整数,有多少种方案? 答案是C(n-1,k-1). 然后发现我们要求的是一段连续的函数值,仔细思考,并根据组合数的性质,我们珂以发现实际上答案就是在让求 ...
- 费马小定理 x
费马小定理(Fermat Theory) 是数论中的一个重要定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p).即:假如a是整数,p是质数,且a,p互质(即两 ...
- hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)
题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3. ...
- nyoj1000_快速幂_费马小定理
又见斐波那契数列 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 斐波那契数列大家应该很熟悉了吧.下面给大家引入一种新的斐波那契数列:M斐波那契数列. M斐波那契数列 ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
随机推荐
- 你好,C++(19)“老师,我这次四级考试过了没有?”——4.2 条件选择语句
4.2 条件选择语句 “老师,我这次四级考试过了没有?” 如果老师被问到这个问题,他会如何回答?是的,他会根据不同的条件选择不同的回答: 如果考试成绩大于等于60,那就回答:“恭喜你,你通过了这次考 ...
- js获取url的各项参数
function getQueryStringArgs() { //取得查询字符串并去掉开头的问号 var qs = location.search.length > 0 ? location. ...
- OOAD基本概念
学习目标: 1.理解与掌握面向对象的概念与方法. 2.使用UML. 3.完成面向对象的分析与设计工作. 4.了解OO的设计原则及一些典型的设计模式 什么是面向对象? 面向对象(Object-Orien ...
- 窗口!窗口!- Windows程序设计(SDK)003
窗口!窗口! 让编程改变世界 Change the world by program 内容节选: 在前边两节课的例子中,我们通过 MessageBox 函数创建一个消息框程序,消息框其实就是用来跟用户 ...
- win8下nodejs安装配置记录
1:打开nodejs官网http://nodejs.org/ 下载安装版. 2:安装完成后,打开cmd输入node -v 查看是否安装成功: 3:安装express,通过全局安装方式进行安装: 安装完 ...
- PCB Layout 中的高频电路布线技巧
1.多层板布线 高频电路往往集成度较高,布线密度大,采用多层板既是布线所必须,也是降低干扰的有效手段.在PCB Layout阶段,合理的选择一定层数的印制板尺寸,能充分利用中间层来设置屏蔽,更好地实现 ...
- Android 得到当前已连接的wifi的信号强度
1.得到当前已连接的wifi信息 WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo wi ...
- 【转】Win7与Ubuntu 14.04双系统修改启动项顺序
原文网址:http://blog.sina.com.cn/s/blog_b381a98e0102v1gy.html 一.Ubuntu14.04采用默认安装方式的情况 采用默认安装方式,在win7下安装 ...
- NOI2013 UOJ122 向量内积
神题...... 还是大神讲得比较清晰~orz http://dffxtz.logdown.com/posts/197950-noi2013-vector-inner-product 启发题:poj3 ...
- 安卓,通过本地应用分享到微信、facebook等
别的不说了,直接上代码. 支持分享到微信.微博.facebook.twitter package com.example.shareSample; import java.util.List; imp ...