8.3
数论还是很难,上午的内容部分之前讲过,听着还好,下午的。。。本人已自闭
上午
质因子分解
两种常见的素性测试
试除法,配合质数筛法可以做到 O(sqrt(n)) 的复杂度。
Miller-Rabin 素性测试,可以做到 O(log n) 的复杂度,属于RP 算法。
(其它还有印度人的 AKS 算法可以做到正确率 100% 的O(log n) 复杂度。)
但一般用Miller-Rabin素性测试就可以了。
Miller-Rabin
基本原理是费马小定理:若 p 是质数, a, p 互质,则ap−1 ≡ 1 (mod p)。
于是对于某个 p,若能找到与它互质的 a 使得 ap−1≠ 1(mod p),则 p 必不是质数。
然而有一些合数 p,满足所有与它互质的 a 都有 ap−1 ≡ 1(mod p),这种数称为 Carmichael 数(如 561 = 3 ∗ 11 ∗ 17),这样的数是用上面的方法检验不出来的。
所以还需要奇素数判定。对于奇素数 p,如果 ap−1 ≡ 1(mod p) 即 (a ^{ p − 1 2 \frac{p - 1}{2} 2p−1}+ 1)(a ^{ p − 1 2 \frac{p - 1}{2} 2p−1} − 1) ≡ 0 (mod p),由于 Fp 是整环,所以 a ^{ p − 1 2 \frac{p - 1}{2} 2p−1} ≡ 1 或 p − 1。 如果 p − 1 2 \frac{p - 1}{2} 2p−1 还是偶数则可以继续往下检验
这样可以保证对于任意合数至少存在一个 a 可以判定它是合数。
两种常见的质因子分解方法
试除法,复杂度 O(sqrt(n))
Pollard’s Rho,期望复杂度 O(4√n log n),又名启发式分解。
启发式分解
n 是素数的时候用 Miller-Rabin 素性测试。
n 不是素数的时候,复杂度只和最小的质因子有关。所以称为启发式。
Pollards’ Rho
假如要分解一个数 n:
首先进行素性测试,是素数直接返回。
否则就要生成一些随机的 xi,去求 gcd(|xi − xj|, n),如果这个∈ (1; n) 则找到了 n 的一个因子,递归分解。
一个挺靠谱的随机方法就是 x <-- x2 + c, c 是个随机数。
这样随机出来的 x 可能会进入循环,假如进入循环了我们还没找到因子,就重新随个 x 和 c,重新做。
如何判断已经进入循环
可以证明 x<–x2 + c,形成的一定是一个 ρ 形结构。
每次当 i 为 2 的幂次的时候就令 y <–xi,如果某时刻 xi = y了则说明已经在环上绕了一圈了。
即:看 x(2,4] 是否 = x2,看 x(4,8]是否 = x4,看 x(8,16] 是否= x8……
这样“浪费”的步数仅仅是 O( 环长 ) 级别的。
数论
欧几里得算法
欧几里得求gcd
若 x|a,x|b,则 x|a + b。
于是 gcd(a,b) = gcd(b,a%b)。
复杂度为O(log(a + b))
扩展欧几里得算法
已知 a,b,求出 x, y 满足 ax + by = gcd(a, b)。
在欧几里德算法中递归地求:若已有 b = 0,则 gcd = a,令x = 1, y = 0。
否则求出 x′; y′ 满足
bx′ + (a − a/b ∗ b) ∗ y′ = gcd(b,a%b) = gcd(a,b)。
于是 a ∗ y′ + b ∗ (x′ − a/b ∗ y′) = gcd(a; b)。
辗转相减(除)的其他用处
用一个环定义带余除法,在上面辗转相减(除),比如模合数的环、多项式环等;
比如求行列式模一个合数,根据行列式的性质可以把一行的倍数加到另一行上。辗转相减把其中一个位置消成 0 即可。
比如求两个多项式的最大公约式,或者说多项式取模,可以不停地把一个的倍数加到另一个上,把其中一个多项式变成 0。
类欧几里得:一条直线下的整点数;利用欧几里得的思想,不断缩小问题规模
最基本的模型: solve(n; A; B; C) = ∑ i = 1 n \sum_{i =1}^{n} ∑i=1n⌊ A i + B C \frac{Ai+B}{C} CAi+B⌋
复杂度同欧几里德算法,为O(log C)。
中国剩余定理
有 n 个方程 x ≡ ai (mod pi), pi 两两互质,求 x。
设 wi = ∏ (j ≠ i )pj,则答案 ≡ ∑ i = 1 n \sum_{i = 1}^{n} ∑i=1n ai ∗ wi ∗ inv(wi; pi)。
拓展中国剩余定理
如果模数不互质,只要两两合并方程即可。
用普通中国剩余定理求出 w
w ≡ (a1/d) (mod p1/d); w ≡ (a2/d) (mod p2/d)。
每次把两个方程合并成一个模数是它们 lcm 的方程
费马小定理
p 是质数,则 ap ≡ a (mod p)。
欧拉定理
p > 1, a; p 互质,则 aϕ§ ≡ 1 (mod p)。
证明: a; p 互质,于是对于缩系内所有 x, ax 同样构成缩系。即 ∏(gcd(x,p)=1) ax ≡ ∏(gcd(x,p)=1) x。于是 aϕ§ ≡ 1
拓展欧拉定理
公式太难打,上图吧
离散对数问题
BSGS
已知 A, B, C,求 x 使 Ax ≡ B (mod C)。
如果 C 是合数可以拆成质数的幂,然后中国剩余定理合并起来。于是考虑 C = pc。先假设 A,C 互质。
令 S = sqrt ( C),如果有 x = k1S − k2,有 (AS)k1 ≡ BAk2(mod C)。
把一边放入 Hash 表,另一边查询即可。复杂度 O(sqrt( C))。
原根相关
缩系、原根
循环群:指群可以由一个元素生成: G = x, x2, x3…。
阶:满足 xd = 1 的最小正整数 d。记为 ord(x)。 xm = 1 当且仅当 ord(x) | m。
模素数 p 的剩余类构成一个有限域。
模 m 意义下与 m 互质的元素组成缩系,大小为 ϕ(m)。
原根:能生成缩系的元素,即 xi 两两不同(0 ≤ i < ϕ(m))的 x。原根不一定存在。事实上,当且仅当 m = 2, 4, pk, 2 ∗ pk 时模 m 缩系的原根存在。 p 是任意奇质数。
二次剩余
勒让德符号
记 ( a p \frac{a}{p} pa) 为勒让德符号, p 是一个奇素数。
( a p \frac{a}{p} pa) ≡ 1 表示 a 是模 p 域下的二次剩余, −1 表示是二次非剩余。
计算方法(欧拉准则): ( a p \frac{a}{p} pa) ≡ a ^ p − 1 2 \frac{p-1}{2} 2p−1 (mod p)。
二次互反律:对于奇素数 p; q,有 ( p q \frac{p}{q} qp) ( q p \frac{q}{p} pq) = (−1) ^ ( p − 1 ) ( q − 1 ) 4 \frac{(p−1)(q−1)}{4} 4(p−1)(q−1)
计算二次剩余的方法
原根法:如果存在原根,可以求出原根并 BSGS 求出指数,除以 2 即可。复杂度 O(sqrt§)。
Tonelli–Shanks 算法:复杂度 O(log2 p)。这里不作介绍。
Cipolla 算法:复杂度 O(log p)
下午
数论函数
数论函数:定义域为正整数集,陪域为复数域的函数。
表示某些数学符号不会打
积性函数的性质
性质 1:设 n = ∏ pi qi,那么 f(n) = ∏ f(piqi)。
于是可以用线性筛求出 g(n) = piqi,然后f(n) = f( g(n) ) f( n g ( n ) \frac{n}{g(n)} g(n)n),在 O(n) 时间内预处理积性函数的值。
性质 2:若函数 f(n), g(n) 都是积性函数,那么下列函数都是积性函数: (fg)(n), (f/g)(n)。
狄利克雷卷积
两个数论函数的狄利克雷卷积(f ∗ g)(n) = ∑ d ∣ n \sum_{d|n} ∑d∣nf(d)g( n d \frac{n}{d} dn)
满足:
交换律: f ∗ g = g ∗ f
结合律: (f ∗ g) ∗ h = f ∗ (g ∗ h)
分配律: f ∗ (g + h) = f ∗ g + f ∗ h
单位元: f ∗ ϵ = f
若 f; g 是积性函数则 f ∗ g 也是积性函数。
莫比乌斯反演
杜教筛
我真的太难了