<前言>
好久没写博客了,从Day5开始,那么我就从Day6开始补吧。
等等让我找找day6讲什么的、。。。
偶,是任轩笛讲的,上午讲数论和数论函数,下午杂题选讲。
<正文>
质因数
一开始讲的是质因数的素性测试、质因子分解之类的,听着还挺正常。讲到线性筛的时候感觉还行,就去上了个厕所回来。
-
素性测试:
-
试除法,配合质数筛法可以O(n)解决
这个只要筛出n之内的素数。然后一直试除,能除就除,只要能出就不是素数
-
Miller-Rabin素性测试,O(log n)完成但可能错误。
这个我没听啊,但大致讲一下吧。
-
基本原理是费马小定理:若 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,(a2p−1+1)(a2p−1−1)≡0 (mod p),由于Fp是整环,所以 a2p−1≡1 或 p−1.
-
如果2p−1还是偶数则可以继续往下检验。
-
-
印度人的AKS就不说了,是保证正确的log n算法:)
-
-
质因数分解:
-
试除法:能除就除,不能除就加除数,直到大于原数。f复杂度就算用线性筛优化寻找素数,也是O(n),太慢了。
-
Pollard’s Rho算法,期望复杂度O(4nlogn)
-
假如要分解一个数 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( 环长 ) 级别的。
-
-
-
数论
老师的ppt足够详细,但是我还是有不明白。
但就着重讲几个我会的吧:
欧几里得算法
在求两数gcd得时候,我们用的多是辗转相除法或者辗转相减法。欧几里得算法就是辗转相除法了。
- 如果x∣a,x∣b,那么x∣(a−b)(a>b),所以gcd(a,b)=gcd(a,a%b).这样不断转换直到a%b变成零,此时a就是gcd了。、
扩展欧几里得:
已知 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)
有,x1=y2;y1=x2−a/b∗y2;然后对x1,y1做,递归解决,回溯时实行逆运算,最后找到最小解。
其实扩欧我们老早学过了,不过忘得差不多了,这次讲的时候听不进去,已经被任轩笛的骚操作秀到了。
类欧几里得:
额,抱歉,这个是真的挂了。在这个暑假之前我根本不知道有这个玩意。先是在hl集训中出现,然后在这里又讲了,可惜我完全看不懂公式啊。
solve(n,A,B,C)=i=1∑n⌊CAi+B⌋
这是我全程看得懂的一个公式(也就是定义)
中国剩余定理
有 n 个方程 x ≡ ai (mod pi),pi 两两互质,求 x。
mb题 养猪
- 设wi=∏j̸=ipj,则答案≡∑i=1nai∗wi∗inv(wi,pi)
inv为逆元
已知x≡a1(modp1),x≡a2(modp2),若d=gcd(p1,p2)
则a1≡a2(modd)成立
所以答案可以表示为w∗d+(a1modd)
求得:
w≡(a1/d)(modp1/d),w≡(a2/d)(modp2/d)
每次把两个方程合并成一个模数是它们 lcm 的方程
费马小定理
时间不多长话短说:
费马小定理:p 是质数,则 ap≡a(modp)
欧拉定理:
p>1,a,p互质,则aϕ(p)≡1(modp)
扩展欧拉定理
p>1,n≥ϕ(p)情况下,存在
an≡anmodϕ(p)+ϕ(p)(modp)
还有一个数论函数,不写了不写了,反正横竖也全是题目。
算了,不能指望我听懂这些,果然听数论就是个错误的选择吗。
更可恶的是,任轩笛