先拓展一下威尔逊定理:如果p是素数,则(p-1)! ≡ -1(mod p)。
例:p=11,10!=1*(2*6)*(3*4)*(5*9)*(7*8)*10 ≡ 1*10 ≡ -1(mod 11);
费马小定理:(定义)如果p是素数,a是正整数,且gcd(a,p)=1(互质),则a^(p-1) ≡ 1(mod p);
定理1:由此可以得出a^p ≡a(mod p);
推论(费马小定理求逆元):a*a^(p-2) ≡ 1 (mod p);所以a^(p-2)就是a关于p的一个逆元。
测试代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e5+7;//给出一个很大的素数
const int maxn = 10010;
ll f[maxn];
ll qpow(ll a,ll p,ll m){ //反复平方求(a^p)%m;
ll ans = 1;
while(p){
if(p&1) ans=ans*a%m;
a = a*a%m;
p >>= 1;
}
return ans%m;
}
void get_inv(){
f[1] = 1;
for(int i=2;i< maxn;i++)
f[i] = qpow(i,mod-2,mod);
}
int main(){
get_inv();
for(int i=1;i<maxn;i++)
cout<<f[i]<<" ";
return 0;
}
欧拉定理:
先介绍欧拉函数
(n),设n是一个正整数。欧拉
函数
(n)是不超过n且与n互素的正整数的个数。
模n的既约剩余系:是由(n)个整数构成的集合,集合中每个元素互素,且任何两个模n的不同余。
例如:n=10,(10)=4,且集合{1,3,7,9}就是模10的既约剩余系。
若a是和n互素的的正整数,那么{a*r1,a*r2...}也是模n的既约剩余系。
欧拉定理:又叫费马_欧拉定理,如果n和a是互素的正整数,则a^((n) )≡1(mod n);
推论:a^((n)+1 )≡a(mod n);
欧拉定理一般来找模n的既约剩余系,可以理解成周期。