记录各种我这种数论菜鸡不会的式子。。。可能有很 zz 的式子大佬不要嘲笑
整除与不定方程
证明:
- 存在整数解。
证明:
从右往左推:令 ,则有
从左往右推:考虑构造 ,这样就可以构造出 所有 的解了。
令,证明
现在我们尝试解
显然 ,考虑设 。
如果 有解即可。递归出口是 ,显然有解。
现在考虑如何从递归结果得到解:
所以 。
递归下去求解的方法 叫做扩展欧几里得。递归过程中可以顺便处理出 gcd。
inline int exgcd(int a,int b,int &x,int &y){ if(!b){ x = 1,y = 0; return a; } int g = exgcd(b,a%b,x,y); int t = x;x = y;y = t-(a/b)*y; return g; }
对于一般的不定方程 的求解,首先判断是否有 ,不满足就无整数解。否则我们令 先求出 的解。然后解乘上 即可。
对于一般的不定方程,如果有一组特解 ,通解可以表示成 $$
同余理论
如果 ,我们可以简记为
证明都是转成整除来证。求解
方法一:
用 exgcd 求解即可。
方法二:
一开始我们确定两个同余方程:
左右系数不断辗转相除,左边会变成 ,右边会变成
然后 就是答案。 每次辗转相除是要减去 的。
- 求解线性同余方程组(exCRT)
首先我们考虑过程中的两个方程式可以得到 ,代入 得到解一下这个 ,带回原式找到 ,合并成新方程代码:inline int excrt(){ int ans = aa[1],M = bb[1];// M = lcm FOR(i,2,n){ int a = M,b = bb[i],c = (aa[i]-ans%b+b)%b;// 这里 ax=c(mod b) int g = exgcd(a,b,x,y),bg = b/g; if(c%g) return -1; x = qmul(x,c/g,bg); ans = ans+M*x; M *= bg; ans = (ans+M)%M; // 这里已经是新意义下的了 } return (ans+M)%M; }
欧拉函数
简化剩余系:1~n 中与 互质的数,记 表示数的个数。
考虑不与其互质的数一定是形如 ,所以有 个。
积性函数。这里不详细证明。
证明:质因数分解就可以了。
按照 的式子观察一下就好了。
证明:设 取遍模 意义下的缩系,那么 也取遍模 意义下的缩系 ,(因为互不相同且互质,可以使用反证法)。所以 $$- 的阶
如果 ,那么记 为最小的正整数使得 为阶。
简单的小性质是 。
证明:反证法,欧拉定理。
所以求阶的时候可以试除 的质因子。逆元
LOJ161:求 在模 意义下的逆元,级别。
做前缀积 ,前缀逆元积
那么逆元