北京大学ACM暑期课讲义-lcc-数论
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 化为裴蜀定理的一般情况,有解当且仅 当 gcd(b1, b2) | (a1-a2)
中国剩余定理的一般情况
• • • • 于是我们得到了一个初始的(u,v)记做(u0,v0) u*b1 + v*b2 = (a1-a2) 的所有解(u,v) 满足 u = u0 + tb2/gcd(b1,b2) v = v0 – tb1/gcd(b1,b2)
• 算法思路:
– 设最终答案为x个8,则x满足(10x-1)*8/9≡0 (mod L) – 化简:10x≡1 (mod n),其中n=9L/gcd(9L,8) – 这是一个离散对数的问题,求解方法如下:
• 若gcd(10,n)>1,无解 • 若gcd(10,n)=1,由欧拉定理:10ϕ(n)≡1 (mod n)。可以证明, x为ϕ(n)的约数,从小到大枚举约数即可 • 10l≡1 (mod n) 则成立的最小 l 是ϕ (n)的约数 这个性质竞 赛中经常用到
欧拉函数
• • • • • ϕ (n) = 1..n中与n互质的数的个数 如何求ϕ (n)? 素因子展开+容斥原理 令n = p1r1p2r2...pkrk ϕ(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pk)
– (为什么?)
欧拉定理
• 若a和n互质,则aϕ(n)≡1 (mod n) • 欧拉定理的推广形式
高斯消元法
• • • • • a11x1 + a12x2 + .. + a1nxn = b1 a21x1 + a22x2 + .. + a2nxn = b2 … am1 x1 + am2x2 + .. + amnxn = bm 求解<x1, x2, …xn> 一般m=n
• 如果是在mod p的线性空间下呢?(p素数)
线性筛素数
• 一个元素会被删好多次。 • 如何优化成线性?
对每个素数p 考虑所有i, i的最小素因子>=p 将i*p去掉 如何代码实现?
• • • • • • • • • •
memset(Prime,0,sizeof(Prime)); memset(IsPrime,1,sizeof(IsPrime)); for (int i=2;i<=n;i++){ if (IsPrime[i]) Prime[num++] = i; for (int j=1;j<num && i*Prime[j]<=n;j++){ IsPrime[i*Prime[j]] = 0; if (i%Prime[j] == 0) break; } }
注意1这里反转 注意2这里容易溢出
模线性方程
• ax = d (mod b) abd 已知求x • 转化为ax + by = d 用扩展gcd求x,y
– 注意2容易溢出 – 在求x,y的中间步对其mod b处理
中国剩余定理
• 设n组数(ai, bi), 其中bi两两互素 • 求x使得
x = a1 mod b1 x = a2 mod b2 ... x = an mod bn
中国剩余定理
• • • • • • • 设n组数(ai, bi), 其中bi两两互素 如果bi不是两两互素呢? 另一个角度看此问题 x = a1( mod b1) x = a2( mod b2) ->x + u*b1 = a1, x - v*b2 = a2 -> u*b1 + v*b2 = (a1-a2)
hdu 3949 XOR
• 求n个int数里面x或的第k大值
• N有多大,基向量都不超过32个 • mod2高斯消元求出基向量就可以代表这 n个int的所有xor结果 • 将k分解二进制
筛素数
• 筛素数大家都会 • 初始2..n • 每次取出第一个没被删掉的元素p 必然是 素数 • 将p的倍数都删掉 • 复杂度:n/1 + n/2 + n/3 + n/5 + .. + n/p
ACM中的数论
北京大学ACM队 李晔晨 lccycc@qq.com
hi.baidu.com/lccycc_acm
基本概念
• 模,同余 • 最大公约数和最小公倍数 • 素数,互素 • 正整数的素因数分解
本讲要点
• 扩展gcd与裴蜀定理
– 模线性方程 – 模线性方程组—中国剩余定理
• 高斯消元法
• 筛法线性求素数 • 欧拉函数
裴蜀定理的 证明
• • • • 直接构造出u,v au + bv = d (a-b)u + b(u+v) = d 令a’ = a%b, 令t使得a = b*t + a’
– t = [a/b]
• (a-tb)u + b(tu + v) = d • a’u + b(tu+v) = d • 令v’ = tu+v, 得到a’u + bv’ = d
莫比乌斯函数的应用
• 求(u,v)对的互素对对数,1<=u,v<=n
– 比如 (2,3) (6,7)
• • • •
G(n) = n*n F(n)= [1..n]X[1..n] 中的互素对对数 要求f(n) 有G(n) = f d
d |nຫໍສະໝຸດ Baidu
POJ2478 Farey Sequence
• 求所有分母不大于n的既约真分数个数
分母为x的既约真分数有ϕ(x)个 分母不大于n的既约真分数个数为ϕ(1)+ ϕ(2)+...+ ϕ(n) 如何快速求出ϕ(1), … ϕ(n)? 对ϕ(x),分解然后递推
莫比乌斯函数
• 设n=p1r1p2r2...pkrk
1 k n 1 0 n pi , i j pi p j
i 1 k
n 1 else
g n f d f n g d n / d
d |n d |n
• 该函数也是积性函数 • 莫比乌斯反演
– – – – 当x≥ϕ (m)时,ax≡a(x mod ϕ(n)+ ϕ(n)) (mod n) 不需要互素 用途:计算a^b^c^d^e..的高阶幂次取模 (如何计算?)
POJ3696 The Luckiest number
• 题目大意:
– 定义只含有数字8的数为幸运数 – 给定正整数L,求L的所有倍数中最小的幸运数
– (为什么?)
• x + u*b1 = a1 • x 的解空间为 a1 – u0b1 - t(b1b2)/gcd(b1b2)
= a1 - u0b1 - t*LCM(b1,b2)
中国剩余定理的一般情况
• x = a1 - u0b1 - t*LCM(b1,b2)
• 等价于:我们把前两个方程变成了一个 方程: • x = a1-u0b1 (mod LCM(b1,b2) ) • 每次方程数-1 继续这样消下去 就可以得 出x的可行解空间。 • 注意:扩展欧几里得算法给出的是一个 解空间!
扩展gcd与裴蜀定理
• 最大公约数:d = gcd(a,b) • 裴蜀定理:存在u,v使得 a*u + b*v = d • 裴蜀定理特例:若a,b互质,gcd(a,b) = 1 则存在u,v 使得 a*u + b*v = 1 • 设 a = pd, b = qd, 则p,q互质(为什么?) 裴蜀定理 pdu + qdv = d -> pu + qv = 1 转化为特例
扩展gcd算法
• 令v’ = tu+v, 得到a’u + bv’ = d • v = v’ – tu 若知道(u, v’)则可知道(u,v) int gcd(int a, int b){ return b==0?a:gcd(b,a%b); } int ex_gcd(int a,int b, int &u, int &v){ If (b == 0){ u = 1, v = 0; Return a; } int d = ex_gcd(b, a%b, v, u); v = v - a/b *u; return d; }
中国剩余定理
• 令B = b1*b2*b3…*bn • 令ci = B/bi = b1*b2*..*b(i-1)*b(i+1)..*bn • 显然有ci 与bi互素,从而存在mi满足 mi*ci = bi (mod b) • x = a1b1m1 + a2b2m2 + …+anbnmn
– 为什么这个x是解? – 联想:拉格朗日插值公式!