[专题训练]数论专题1
2016-07-25 15:53
211 查看
Preface
暑假来了,终于有时间扛专题了。太简单的东西就不讲了。
Paper
扩展欧几里得算法
费马小定理和欧拉定理
费马小定理:∀(a,p)=1,p∈P有ap−1≡1(modp)。证明:∵(a,m)=1∴∀i∈[1,p),ai≢p(modp)且ai两两不同余
∴ai属于模p除了[0]以外的各个剩余类环
∴∏p−1i=1i≡∏p−1i=1ai(modp)
∴ap−1≡1(modp)
欧拉定理:∀(a,m)=1有aφ(m)≡1(modm)
证明类似,略
中国剩余定理(CRT)
求方程⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪x≡a1(modn1)x≡a2(modn2) ⋮x≡ak(modnk)
最小整数解x,其中ni两两互质。
我们要想办法构造一个x,它是若干ai乘上相应系数的和,这些系数要满足在模对应位时为1,模其它位时为0。很容易想到使用逆元。
令N=∏ki=1ni,mi=Nni,xi≡(mi)−1(modni),那么x≡∑ki=1aiximi(modN)一定符合条件。
如果ni不是两两互质怎么办?我们每次可以合并两个方程:
{x≡a1(modn1)x≡a2(modn2)
令x=k1n1+a1=k2n2+a2,即有k1n1−k2n2=a2−a1。我们要找一个符合条件的解r只需要用扩展欧几里得解那个不定方程再回代,就可以将方程合并为x≡r(modlcm(n1,n2))。
组合数取模
我们要求Cmn(modk),且k∈P。Lucas定理
适用范围:n,m很大,logkmax(n,m)和k都不大Lucas定理:Cmn≡∏i=0dCmini(modk)
ni,mi为n,m写成k进制下的第i位,k∈P。
证明:首先我们要知道这条式子
(a+b)p≡ap+bp(modp)(p∈P)(a+b)pi≡api+bpi(modp)(p∈P)
这个我在Cipolla′s Algorithm学习小记里面已经证明了,不再累赘。
∑m=0nCmnxm=(x+1)n=∏i=0d((x+1)pi)ni(快速幂的思想)≡∏i=0d(xpi+1)ni=∏i=0d⎛⎝∑j=0niCjnixpij⎞⎠(二项式定理逆着用)=∏i=0d⎛⎝∑j=0k−1Cjnixpij⎞⎠(当n<m时Cmn=0)=∑m=0n(∏i=0dCmini)xm(这一步比较难理解,考虑上一个式子中xm的指数m只能由m在k进制各位乘起来得到)(modk)
由此得到Lucas定理,证毕。
有了这个定理,我们就可以愉快的嘿嘿嘿了。就算n,m是高精度数我们也可以搞。
预处理阶乘
适用范围:n,m不大,k很大且与小于等于max(n,m)的所有正整数互质。直接套用组合数阶乘公式,预处理阶乘和阶乘的逆元。
关于阶乘的逆元,我们可以用O(log2n)时间处理求(n!)−1,然后((n−1)!)−1≡n(n!)−1(modk),线性时间得出所有阶乘的逆元。
快速阶乘
适用范围:logkmax(n,m)和k不大,k=pc(p∈P)首先预处理1到k中所有不是p倍数的数的阶乘fi。
然后假设我们要求fact(n),那么
fact(n)≡1×2×...×k×(k+1)×(k+2)×...×2k×(2k+1)×(2k+2)×...×n≡fact(k)⌊nk⌋fact(n mod k)(p×2p×...×⌊np⌋p)≡fact(k)⌊nk⌋fact(n mod k)fact(⌊nk⌋)p⌊nk⌋(modk)
注意p的指数要递归统计,最后再乘上来,这些细节自己考虑。
时间复杂度O(klogkn)。
中国剩余定理
适用范围:令k′为k分解质因数后最大的pc(p∈P)。logk′max(n,m)和k′不大将k分解,每个质因子次幂单独做,然后中国剩余定理合并。
离散对数/大步小步算法(BSGS)
给定a,b,n,求满足ax≡b(modn)((a,n)=1)的x(x∈[0,n))。保证a为模n意义下的一个原根,即模n意义下ai包含了所有小于n的与n互质的数。大步小步算法(BSGS)是一个典型的空间换时间的例子。
我们令p=⌈n−1−−−−−√⌉,考虑使用p重写(rewrite乱入?)a的指数,即ax=akp+r(r∈[0,p))。
我们先枚举r,计算出ar(r∈[0,p))的值,然后将它们(的逆元)扔到哈希表或是map之类的数据结构里面存好。然后再枚举k,计算akp。如果存在ax≡b(modn),那么一定有akp≡a−rb(modn),我们已经事先将a−r扔到数据结构里面,现在我们直接查找就好了。由于p是O(n√)的,因此k也是O(n√)的。
时间复杂度O(n√)(忽略数据结构复杂度)。
二次剩余:Cipolla′s Algorithm
相关文章推荐
- WIFI RSSI
- shell--3.运算符
- 使用Windows service创建一个简单的定时器
- C#中DataGridView控件使用大全
- Linux学习----开启篇
- Android Studio 中ADB WIFI 插件
- 为Paint设置渐变器
- 动态规划思想
- Git 工作区与缓存区的文件回退(06)
- linux下安装jdk
- java文件流——文件编码
- Node.js 切近实战(九) 之Excel在线(在线编辑)
- [置顶] TensorFlow 入门之训练 MNIST 数据
- FlexPaper使用教程
- 图像像素处理_明度/亮度/平均值/灰褐色/滤镜/灰色_canvas_js动画
- 听大咖分享《俞军的产品方法》有感
- 简析TCP的三次握手与四次分手
- 【C/C++】关键字之sizeof(sizeof()用法汇总)
- Spring 框架学习
- IT-个人运维经验小计