模逆
模运算法则
(a+b)modp=(amodp+bmodp)modp
(a×b)modp=(amodp×bmodp)modp
(a−b)modp=(amodp−bmodp)modp
((a+b)modp×c)modp=((a×c)modp+(b×c)modp)modp
abmodp=(amodp)bmodp
若 a≡b(modp),则对于任意的 c,都有 (a+c)≡(b+c)(modp)
若 a≡b(modp),则对于任意的正整数 c,都有 (a×c)≡(b×c)(modp)
欧几里得算法
定义
辗转相除法,是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。缩写为gcd
求解方法
求 10,25 的最大公约数
25÷10=2⟹5
10÷5=2⟹0
所以 10,25 的最大公约数为 5 。
公式
gcd(a,b)=gcd(b,amodb)
欧拉函数
定义
对于正整数 n,欧拉函数 φ(n) 是小于或等于 n 的正整数中与 n 互质的数的数目。此函数又称为 φ 函数。
计算方法
n=p1k1×p2k2×p3k3×⋯×pnkn
\varphi(n)=\prod_\limits{i=1}^r p_i^{k_i-1}(p_i-1)=\varphi(n)=\prod_\limits{p|n} p^{\alpha_p-1}(p-1)=n\prod_\limits{p|n}(1-\frac1p)
φ(72)=φ(23×32)=2(3−1)×(2−1)⋅3(2−1)×(3−1)=72×(1−21)×(1−31)=24
欧拉定理
定义
设 m,n 为正整数且 gcd(a,n)=1 ,则我们有:aφ(n)≡1(modn)
两个推理
首先在 1 到 n 的数中,与 n 互质的一共有 φ(n) 个,所以我们把这 φ(n) 个数拿出来,放到设出的集合 X 中,即 x1,x2,⋯,xφ(n) ,那么接下来,我们可以再设出一个集合为 M,设 M 中的数为:m1=a×x1,m2=a×x2,mφ(n)=a×xφ(n)
M 中任意两个数都不模 n 同余
M 中的数除以 n 的余数全部与 n 互质
命题一证明如下:
假设 M 中存在两个数设为 ma,mb 模 n 同余。即 mamodn≡mbmodn
移项得到:ma−mb=n×k
再将 m 用 x 来表示得到:a×(xa−xb)=n×k
我们现在已知 a 与 n 互质,那么式子就可以转化为:xa−xb≡0(mod0)
因为 a 中没有与 n 的公因子(1 除外)所以 a≡0(modn)
所以只能是 xa−xb≡0(modn)
又因为 xa,xb 都是小于 n 的并且不会相同,那么上述的式子自然全都不成立。
所以证得 m 中任意两个数都不模 n 同余。
命题二证明如下:
已知:mi=a×xi
又因为 a 与 n 互质,xi 与 n 互质,所以可以得到 mi 与 n 互质。带入欧几里得算法中推一步就好了。
即 gcd(mi,n)=gcd(n,mimodn)
首先,根据前面两个推论可以知道,M 中的数分别对应 X 中的每个数模 n 同余。
得到 m1×m2×⋯×mφ(n)≡x1×x2×⋯×xφ(n)modn
现在我们把 m 替换成 x 的形式,就可以得到:
a×x1×a×x2×⋯×a×xφ(n)≡x1×x2×⋯×xφ(n)modn
aφ(n)×(x1×x2×⋯×xφ(n))≡x1×x2×⋯×xφ(n)modn
(aφ(n)−1)×(x1×x2×⋯×xφ(n))≡0modn
然后由于 x1×x2×⋯×xφ(n)≡0modn
所以 aφ(n)≡1modn
费马大定理
当整数 n>2 时,关于 xn+yn=zn 的方程没有正整数解。
费马小定理
定义
如果 p 是一个质数,而整数 a 不是 p 的倍数,则有 ap−1≡1(modp)
计算方法
2100mod13
≡212×8+4mod13
≡2(13−1)×8+4mod13
≡(2(13−1))8×24mod13
≡18×24mod13
≡16mod13
≡3mod13
中国剩余定理
背景
计算一个整数 x,使得它满足除以 3 余 2、除以 5 余 3、除以 7 余 2。
如果能够找到三个整数 x1,x2,x3,使得:
x1 除以 3 余 2、除以 5 余 0、除以 7 余 0;
x2 除以 3 余 0、除以 5 余 3、除以 7 余 0;
x3 除以 3 余 0、除以 5余 0、除以 7 余 2;
那么容易验证 x=x1+x2+x3 就满足除以 3 余 2、除以 5 余 3、除以 7 余 2。
思路
x1 除以 3 余 2、除以 5 余 0、除以 7 余 0
如果能够找到一个整数 y 满足 y 除以 3 余 1、除以 5 余 0、除以 7 余 0,那么令 x1=2×y,就很容易验证这时的 x1 就满足除以 3 余 2、除以 5 余 0、除以 7 余 0。
因此又可以将问题转化为寻找整数 y 满足 y 除以 3 余 1、除以 5 余 0、除以 7 余 0;
由条件可以得到 y 既是 5 的倍数,又是 7 的倍数,故设 y=35k
然后根据除以 3 余 1 可以得到:35K≡1mod3
K 即为 35 在模 3 域下的逆元,即 invert(35,3)。
所以我们能求出 y,也能求出 x1,同理能求出 x2,x3,相加求出 x。
x1=2×(35×invert(35,3))
威尔逊定理
离散对数问题
背景
已知 p,g,h,求满足条件的 x。
gx≡hmodp
方法
暴力破解,直接穷举x,得到 gx≡hmodp 的值
Sage:
c = m^x mod n
x = discrete_log(c.mod(m, n))
Python:
x = sympy.discrete_log(p, h, g)
gmpy2 库
gmpy2.mpz # 类似long类型 长度可达50位
gmpy2.mpq # 分数类型
gmpy2.mpfr # 与float类型相同,精度可达53位
gmpy2.mpc # 复数类型
gmpy2.iroot(a, b) # 返回一个元组 (x, y),其中 x 为 a 开 b 次方的值,y 是判断 x 是否为整数的布尔型变量(即是否能够完整开放)
gmpy2.gcd(a, b) # 求a和b的最大公约数
gmpy2.lcm(a, b) # 求a和b的最小公倍数
gmpy2.gcdext(a, b) # ax + by = gcd(a,b) 求满足贝祖不等式的整数解
gmpy2.powmod(a, n, p) # a^n mod p
gmpy2.is_prime() # 检测素数
gmpy2.is_even() # 检测奇数
gmpy2.is_odd() # 检测偶数