上一篇:数论学习笔记(上)
五、乘法逆元
逆元(Inverse element)定义:逆元素是指一个可以取消另一给定元素运算的元素,在数学里,逆元素广义化了加法中的加法逆元和乘法中的倒数
(from百度百科)
通俗点讲,就是用来取消某一运算,取消加法运算就是加上这个数的相反数,取消乘法运算就是乘上这个数的倒数
但如果在mod的意义下时就不能单纯的乘上一个倒数了
比如要计算a/b mod m时,不能直接计算a*(1/b) mod m
这时就要找一个整数c,使得a*c mod m=a/b mod m
c就是在mod m意义下b的乘法逆元了
所以满足性质
如果m为质数,则任何一个数都有关于它的逆元,如果它是合数就不一定了
在题目中一般m都是质数
==================================================================================================
求一个数在mod m意义下的逆元有以下三种方法
受限于篇幅,就不一一证明了,可参考以下其他博客
1.快速幂求逆
ll ksm(ll x,ll k,ll mod){
x%=mod;
ll ans=1LL;
while (k){
if (k&1){
ans=(ans*x)%mod;
}
x=(x*x)%mod;
k/=2;
}
return ans;
}
ll inv(ll x,ll m){
return ksm(x,m-2,m);
}
2.扩展欧几里得求逆
就是解一个同余方程
代码见上篇
3.递归求逆
一次性用递归式求1~n的逆元
int main(){
int n,p;
rd(n) rd(p)
inv[1]=1;
for (int i=2;i<=n;i++){
inv[i]=(ll)(p-p/i)*inv[p%i]%p;
}
for (int i=1;i<=n;i++){
printf("%d\n",inv[i]);
}
}
六、中国剩余定理
中国剩余定理(Chinese remainder theorem)就是孙子定理(什么名字。。。),最早出现在南北朝时期的数学著作《孙子算经》,故名
它用于解一元一次同余式的解,形如:
《孙子算经》上有个叫做“物不知数”的问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即一个整数除以三余二,除以五余三,除以七余二,求这个整数。
根据玄学的小学奥数知识,不难得出这个数最小为23,如何用程序求解呢?
先说方法:
有一个前提,就是m1,m2...mn两两互质
对于方程组,记,把它转化为n个同余方程:,最终答案为
证明:
同余方程:等同于
如果我们又有一组同余方程,把它们加起来:
以此类推,如果把n个这样的方程的解加起来,即
就能对于所有的i,使得,即满足原方程组
至于怎么解,只需令,带入得
用扩展欧几里得解出后算出x值即可
又易证若x是这个方程的解,那么x+k*M也是方程的解
代码:
ll w[1000],m[1000],n;
ll exgcd(ll a,ll b,ll &x,ll &y){
if (b==0){
x=1LL,y=0LL;
return a;
}
ll gcd=exgcd(b,a%b,y,x);
y-=x*(a/b);
return gcd;
}
int CRT(void){
ll M=1LL;
for (int i=1;i<=n;i++){
M*=m[i];
}
ll ans=0LL;
for (int i=1;i<=n;i++){
ll now=M/m[i],x,y;
exgcd(m[i],now,x,y);
ans=(ans+y*now*w[i])%M;
}
return (ans%M+M)%M;//求最小正数解
}
==================================================================================================
但是,如果,m1~mn不两两互质,这种方法就无法解决了
这时要把n个方程合并为1个方程
方法和代码可以参考其他博客
七、欧拉函数(一)
首先看看定义:
欧拉函数又称函数,表示1~n中与n互质的个数
如,因为1,3,5,7都与8互质
它有以下性质:
1.若n为质数,则,因为质数和任何小于它的正整数都互质
2.若n为质数,则,证明:
比小的个数中,与不互质的数一定是n的倍数,即为n*k(k=1,2,3,...,),共有个
所以
3.若a,b互质,则,证明:
如过直接从互质的角度,这有点难证,不妨从不互质的角度来看:
1~a中有个数与他不互质,1~b中有个数与他不互质
因为a,b互质,所以与a不互质的数和与b不互质的数没有重合
如果一个数与a不互质,那么那个数的倍数也与它不互质
所以个数乘以[1~b]中所有数都与a*b互质,这样就产生了个与a*b不互质的数
同理,也产生了个与a*b不互质的数
但是如果直接把它们加起来,就产生了重复,重复的数是个数与个数的乘积
所以要减去
所以化简得
4.把一个数x分解质因数得,则
理解:1~x中有x个数,每乘上一个,就把个pi的倍数,也就是把与x公因数为pi的数约去了
当然也可以由性质2和3严谨证明
5.若p是质数,p|x,则,证明:
设
==================================================================================================
求一个数的欧拉函数:用性质4即可
代码略
欧拉函数的线性筛法:
一次性求出~的值,时间为o(n),可同质数一起筛出来
先证明一个引理:若p是质数,x mod p不为0,则x,p互质,则
代码:
int check[inf],p[inf],phi[inf],pcnt=0;
void getphi(void){
check[1]=check[0]=1;
phi[1]=1;
for (int i=2;i<inf;i++){
if (!check[i]){
p[++pcnt]=i;
phi[i]=i-1;\\根据性质1
}
for (int j=1;j<=pcnt && p[j]*i<inf;j++){
check[p[j]*i]=1;
if (i%p[j]==0){
phi[i*p[j]]=phi[i]*p[j];\\根据性质5
break;
}
phi[i*p[j]]=phi[i]*(p[j]-1);\\根据引理
}
}
return;
}
八、欧拉函数(二)
先讲一个非常有用的定理——欧拉定理:
若n,a为正整数且互质,则有
证明:
设小于n并与n互质的数为
又有数集m,使得
则有引理1:数集m中没有任意两个数关于n同余,反证法:
若有,则
但a与n互质且,所以
引理2:数集m中,,反证法:
如果有mi使得,设r=
则:,
设
但gcd(n,a*xi)=0,gcd(n,r*(q-k))=r,所以,矛盾
所以由两个引理得:数集m的某一种排列能关于n依次同余于
,所以约去得
如果n是质数,则,就是著名的费马小定理了:
(p是质数)
用费马小定理可以证明逆元的第一种求法
==================================================================================================
再来看看由欧拉函数拓展出的相关定义:
阶:如果a,m互质,m>1且满足的最小正整数t称为a关于m的阶,记作
有性质:所有满足的t都有 (可根据mod的周期性理解)
又因为欧拉定理:,则
阶的定义主要是为原根作铺垫:
若对于a,m(a,m互质)使得,则称a为m的一个原根
也就是满足为关于t的方程的最小整数解
原根有一个重要的性质:
1.如果g为m的原根,则数集的某一种排列能依次关于m同余于1~m中于m互质的个数
证法类似于证欧拉定理的两个引理,即用反证法证出:数集G中没有任意两个数关于m同余和
2.一个数有原根的充分必要条件是它能表示为或的形式(p为质数,e为正整数),如2,3,4,6,7等都有原根
然而我太菜不会证。。。
3.一个数n如果有原根,它的原根个数为,特别地,若n为质数,则其原根个数为
然而还是不会证。。。
如何求一个数的原根:
(持续施工中。。。)
参考文献:
1.百度百科
2.某篇博客
3.某篇论文
2.信息学奥赛之数学一本通 (林厚从 著) (东南大学出版社)
p.s 本人水平有限,如有错误,多多谅解,敬请指出
下一篇:以后会有的
Inverse element