费马小定理(附带欧拉定理)
Posted 。✧* ꧁王者꧂✧*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了费马小定理(附带欧拉定理)相关的知识,希望对你有一定的参考价值。
费马小定理
对于一个质数p,任意的整数a(a不是p的倍数),都有:
a^(p-1)≡1(mod p)
证明此定理,我们首先需要证明一下欧拉定理。
欧拉定理:
对于互质的两个数a和n,有:
我们设n的简化剩余系( 本 质是比 n 小且与 n 互质的数)为:b1,b2,b3…bφ(n)。
这里,我们会用到反证法:假设i ! = j,a * b[i] ≡ a * b[j] (mod n) , 因为a与n互质,所以:b[i]≡b[j] (mod n)。但是,我们知道,b[i]显然不与b[j]在模n的情况下同余。所以,
a * b[i] ≡ a * b[j] (mod n)显然不成立。
所以,当一个与n互质的数与b[1]~b[φ(n)]依次相乘,每次得到的数再%n后,得到的数都不一样,
且得到的数都属于b[1]~b[n]区间,这便是乘法封闭。
所以,便得出以下式子:
- a φ ( n ) a^{φ(n)} aφ(n) * ( b1 * b2 * b3 ……bφ(n)) ≡ b1 * b2 * b3 ……bφ(n)(mod n)
所以: a φ ( n ) a^{φ(n)} aφ(n) ≡ 1 (mod n)。
当n为质数时,φ(n)=n-1,这便与费马小定理不期而遇了: a p − 1 a^{p-1} ap−1 ≡1(mod p)
此处,我们将会涉及到逆元的定义: 比如,对于a与p两个数,有一个数x,使得a * x ≡ 1 (mod p),那么,我们就称x为mod p意义下a的逆元
又因为a与p互质,所以: x ≡ 1 a \\frac{1}{a} a1 (mod p)。
由费马小定理可得,$ a^{p-2} ≡ ≡ ≡ \\frac{1}{a}$ (mod p)。那么,我们就可以求得a在mod p意义下的逆元了。
费马小定理的用处,就是用在有关组合数学的题目上,因为有关组合的题目,输出值一般都会比较大,这时,题目就会给你一个较大的质数 ,然后让你输出答案mod上这个质数。我们也都知道,组合数学,一般都要用上除法,我们再将除法转化为同余,就能很轻松地解决相应的问题了。
此处,奉上我码的一个相应的板子(很青涩,但比较简洁)。
求逆元:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=20001000;
ll n,p;
ll f[N],ni[N],ci[N];//jie存阶层,ni存逆元,ci存P-2次方;
ll fang(ll a,ll b)
{
ll sum=1;
while(b)
{
a%=p;
sum%=p;
if(b&1) sum=(sum%p*(a%p))%p;
b=b>>1;
a=(a%p*(a%p))%p;
}
return sum%p;
}
int main()
{
scanf("%d%d",&n,&p);
f[0]=1;
f[1]=1;
for(ll i=2;i<=n;i++)
f[i]=(f[i-1]*i)%p;
ci[n]=fang(f[n],p-2);
for(ll i=n-1;i>=1;i--)
ci[i]=(ci[i+1]*(i+1))%p;
for(ll i=1;i<=n;i++)
{
ni[i]=(ci[i]*f[i-1])%p;
}
for(ll i=1;i<=n;i++)
printf("%lld\\n",ni[i]);
return 0;
}
以上是关于费马小定理(附带欧拉定理)的主要内容,如果未能解决你的问题,请参考以下文章