记录各种我这种数论菜鸡不会的式子。。。可能有很 zz 的式子大佬不要嘲笑

整除与不定方程

证明:

  1. 存在整数解。

证明:
从右往左推:令 ,则有
从左往右推:考虑构造 ,这样就可以构造出 所有 的解了。
,证明
现在我们尝试解
显然 ,考虑设
如果 有解即可。递归出口是 ,显然有解。
现在考虑如何从递归结果得到解:
所以
递归下去求解的方法 叫做扩展欧几里得。递归过程中可以顺便处理出 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;
}

对于一般的不定方程 的求解,首先判断是否有 ,不满足就无整数解。否则我们令 先求出 的解。然后解乘上 即可。
对于一般的不定方程,如果有一组特解 ,通解可以表示成 $$

同余理论

如果 ,我们可以简记为


  1. 证明都是转成整除来证。

  2. 求解

方法一:
用 exgcd 求解即可。
方法二:
一开始我们确定两个同余方程:

左右系数不断辗转相除,左边会变成 ,右边会变成
然后 就是答案。 每次辗转相除是要减去 的。

  1. 求解线性同余方程组(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 中与 互质的数,记 表示数的个数。

考虑不与其互质的数一定是形如 ,所以有 个。

积性函数。这里不详细证明。


  1. 证明:质因数分解就可以了。

  2. 按照 的式子观察一下就好了。

  3. 证明:设 取遍模 意义下的缩系,那么 也取遍模 意义下的缩系 ,(因为互不相同且互质,可以使用反证法)。所以 $$
  4. 的阶
    如果 ,那么记 为最小的正整数使得 为阶。
    简单的小性质是
    证明:反证法,欧拉定理。
    所以求阶的时候可以试除 的质因子。

    逆元

    LOJ161:求 在模 意义下的逆元,级别。
    做前缀积 ,前缀逆元积
    那么逆元