模运算是指取模运算,即求m/n的余数

    例如:

    1. 7 mod 3 1 ——-> 7 / 3 = 2 ……1
    1. 交换律
    2. (a + b) mod m (b + a) mod m
    3. (a * b) mod m (b * a) mod m
    4. 结合律
    5. [(a + b) mod m + c] mod m [(a + (b + c) mod m) mod m]
    6. [(a * b) mod m * c] mod m [(b * c) mod m * a] mod m
    7. 分配律
    8. [(a + b) mod m * c] mod m [(a * c) mod m + (b * c) mod m] mod m
    9. (a + b) mod m (a mod m + b mod m) mod m
    10. (a - b) mod m (a mod m - b mod m) mod m
    11. (a * b) mod m (a mod m * b mod m) mod m
    12. a^b mod m (a mod m)^b mod m
    13. 模运算律
    14. a c mod m
    15. b d mod m
    16. a + b (c + d) mod m
    17. a - b (c - d) mod m
    18. a * b (c * d) mod m
    19. a / b (c / d) mod m
    1. 费马定理
    2. 如果p是素数,a为正整数且不能被p整除
    3. a^(p-1) mod p = 1 mod p
    4. (a^p * a^-1 * a) mod p = (1 * a) mod p
    5. a^p mod p = a mod p
    1. 欧拉定理
    2. 对于素数p
    3. ϕ(p) = p - 1
    4. 对于素数p^t
    5. ϕ(p^t) = p^(t) - p^(t-1)
    6. 例如:
    7. 90 = 2 * 3^2 * 5
    8. ϕ(90) = ϕ(2) * ϕ(3^2) * ϕ(5)
    9. = (2-1) * (3^2 - 3^1) * (5 - 1)
    10. = 24
    11. 如果 m>1 a与互素
    12. a^ϕ(m) 1 mod m
    13. 例如:
    14. m = 11
    15. a = 2
    16. (2,11) = 1
    17. ϕ(11) = 10
    18. 2^10 1 mod 11
    1. Fermat大定理
    2. n > 2
    3. x^n + y^n = z^n(没有正整数解)
    1. 欧几里得算法
    2. 欧几里得算法又称为辗转相除法,是为了计算两个数的最大公约数。
    3. 定理:gcd(a,b) = gcd(b,a mod b) (a > b)
    4. 证明:
    5. 假设 a>b
    6. a = k * b + r ------> r = a - k * b -----> r = a mod b
    7. 对于充分性:
    8. 假设d a,b 的一个公约数,即d = gcd(a,b)
    9. a | d, b | d (ab都能被d整除)
    10. r = a - k * b ----> r | d d = gcd(b,r)
    11. 对于必要性:
    12. 假设 d gcd(b,a mod b) 的公约数 ----> b | d , r | d
    13. 因为 a = k * b + r a | d ----> d = gcd(d,b)
    14. 由上得知 gcd(a,b) gcd(b,a mod b)公约数相等,所以最大公约数也相等
    15. 辗转相除到最后,gcd(x,0) = x
    1. 欧几里得算法c语言代码
    2. int gcd(int a, int b)
    3. {
    4.   if(b == 0)
    5.    return a;
    6. return gcd(b, a % b);
    7. }
    8. int gcd(int a,int b)
    9. {
    10. int r;
    11. while(b!=0)
    12. {
    13. r=a%b;//当a<b时第一个循环交换他们顺序
    14. a=b;
    15. b=r;
    16. }
    17. return a;
    18. }
    1. 模幂运算
    2. 31^52 mod 33
    3. ϕ(33) = ϕ(3 * 11) = ϕ(3) * ϕ(11)
    4. = (3-1) * (11-1)
    5. = 20
    6. 53 = 20 * 2 + 12
    7. 31^53 mod 33 = 31^12 mod 33
    8. 模平方计算
    9. 31^1 mod 33 31
    10. 31^2 mod 33 4
    11. 31^4 mod 33 16
    12. 31^8 mod 33 25
    13. 31^12 mod 33 ((31^4 * 31^8) mod 33) mod 33
    14. (16 * 25) mod 33 4
    1. 扩展欧几里得求逆元
    2. mx 1 mod n, 则称m关于1n的乘法逆元为x。也可表示为mx 1 (mod n)。逆元相当于数论中的倒数。
    3. 条件:
    4. 只有当gcd(m,n) = 1时,m 才有关于 n 的逆元。
    5. 方法一:
    6. 利用费马小定理
    7. a * a^(p-2) 1 mod p
    8. a^(p-2)即为a关于1p的逆元,但只能求出p为素数的情况下的乘法逆元
    9. 方法二:
    10. 采用扩展欧几里德算法来计算普遍情况下的乘法逆元
    11. mx 1 mod n
    12. 推出
    13. mx -kn = 1
    14. a * x mod b = 1
    15. ax + by = gcd(a,b) = 1
    16. a=m,b=n
    17. 所求出x即为逆元
    18. 加上x = (x mod t + t) mod t 即为最小逆元
    19. 为什么可以用扩展欧几里得求得逆元?
    20. 因为ax 1 (mod p) 就是ax-yp = 1.
    21. y写成+的形式就是ax + py = 1,为方便理解下面我们把p写成b就是ax + by = 1
    22. ax = 1 - by -----> ax = 1 mod b
    23. by = 1 - ax -----> by = 1 mod a
    24. 就表示xa的模b乘法逆元,yb的模a乘法逆元。然后就可以用扩展欧几里得定理求值
    1. 欧几里得c语言代码
    2. #include<bits/stdc++.h>
    3. #define ll long long
    4. using namespace std;
    5. int n,p;
    6. int exgcd (ll a,ll b,ll &x,ll &y)
    7. {
    8. if(b==0)
    9. {
    10. x=1;
    11. y=0;
    12. return a;
    13. }
    14. int r=exgcd (b,a%b,x,y);
    15. int tmp=x;
    16. x=y;
    17. y=tmp-a/b*y;
    18. return r;
    19. }
    20. int main()
    21. {
    22. scanf ("%d%d",&n,&p);
    23. for (int i=1;i<=n;i++)
    24. {
    25. ll x,y;
    26. exgcd (i,p,x,y);
    27. x=(x+p)%p;
    28. printf ("%d\n",x);
    29. }
    30. return 0;
    31. }

    模运算参考博客
    算法参考博客