数学小知识
一些数论知识
数论随机算法:
Miller-Rabin 素性测试
目的
快速判断一个大整数 \(n\) 是不是质数。
暴力试除是 \(O(\sqrt{n})\),太慢。
核心思想
费马小定理说:若 \(p\) 是质数,则
但反过来不一定成立:有些合数也能让这个式子成立,叫"伪素数"。
所以我们要加一个更强的检查:二次探测定理。
二次探测定理
如果 \(p\) 是质数,方程
只有两个解 \(1\) 和 \(-1\) 。
那么把 \(n-1\) 写成
其中 \(u\) 是奇数。
那么随便选一个质数 \(a\) ,计算:
只要出现了一次 \(1\) 或 \(-1\) ,必然后面全都是 \(1\) 。而出现 \(1\) 意味着前面必然有 \(1\) 或 \(-1\) 。
所以我们只需要去判定这个序列中有没有出现 \(-1\) ,因为有了 \(-1\) 才会有 \(1\) ,而不会凭空出现 \(1\) (除非序列第一项就是 \(1\),这样就全是 \(1\) ,特判即可) 。
可能的情形如 \(1,1,1,1,.../\ ???-1,1,1,1,...\) ,其中 \(?\) 可能是任意数。
正确性与复杂度
-
随机选 \(a\),一次误判概率很小。
-
随机 \(O(log\ p)\) 次基本不会错。
-
实际竞赛中常用前 \(12\) 个质数作为底数,可以检测 \(2^{64}\) 内所有合数。
-
复杂度大约 \(O(k\ log^3n)\),k 是测试次数。
1.2 Pollard-Rho 算法
目的
把一个合数 \(n\) 分解质因数。
朴素方法是试除到 \(\sqrt{n}\),太慢。
生日悖论
在 \(p\) 个可能的取值里随机取 \(O(\sqrt{n})\) 个数,就很可能出现两个相同的数。
所以如果我们随机生成 \(O(\sqrt{q})\) 个数,模 \(p\) 意义下会碰撞。
关键困难
我们不知道 \(p\) 是多少,只知道 \(n\)。
但如果我们发现两个数 \(x_i,x_j\) 满足
\(gcd(∣x_i−x_j∣,n)>1\)
那就找到了 \(n\) 的一个非平凡因子。
随机序列
构造:
\(x_{i+1}=f(x_i)=x_i^2+c (mod\ n)\)
其中 \(c\neq 0,−2\) 。
这个序列好处是模一个数时会陷入循环,由于 \(n\) 比 \(p\) 大得多,所以看起来好像模 \(n\) 随机,模 \(p\) 会进入一个环。
龟兔赛跑找环
用两个指针:
-
\(x\) 每次走两步;
-
\(y\) 每次走一步。
计算:
\(d=gcd(∣x−y∣,n)\)
如果 \(1<d<n\),就找到了因子。
如果 \(d=1\),继续。
如果 \(d=n\),说明失败,换一个 \(c\) 重来。
优化
可以一次累积多个 \(gcd\),比如每 \(100\) 步算一次 \(gcd\),减少常数。
以及调整一次 \(x,y\) 走的步长。一种方法是 \(y\) 一次走 \(k\) 步,然后 \(x\) 直接瞬移到 \(y\) 的位置,然后 \(k\) 翻倍。
期望复杂度:
\(O(n^{ \frac{1}{4}})\)
因为最小质因子大约不超过 \(\sqrt{n}\),而生日悖论给出 \(O(\sqrt{p})=O(n^{ \frac{1}{4}})\)。
辗转相除法:
分数逼近问题
问题:求正整数 \(u,v\),使得
\(\frac{a}{b}<\frac{u}{v}<\frac{c}{d}\)
且 \(u,v\) 最小。
做法:
-
如果 \(a≥b\),把整数部分减掉。
-
处理 \(a<b,c<d\) 的情况。
-
取倒数,递归成子问题。
-
时间复杂度和 \(gcd\) 一样。
这本质上是“用辗转相除逼近有理数”。
类欧几里得:
目的
求:
几何意义:直线
下方的整点个数。
正比例情况
先看:
几何含义:直线
下方的整点个数。
缩小 \(a\):
几何含义:
直线 \(y=\left\lfloor \frac{a}{c} \right\rfloor x\) 下方的点个数加上中间的点个数(\(y=\frac{a\ mod\ c}{c}\) 下的点的个数) :
上面的式子有点像 \(gcd\) 中的辗转相除了,但美中不足的是 \(a\ mod\ c\) 与 \(c\) 的位置反了,那我们就将它调回来:
交换 \(a, c\):
即:整体-上半部分(含直线)+直线=下半部分(含直线)
这就是类欧几里得的正比例情况。时间复杂度和 \(gcd\) 一致。
对于不是正比例的情况也可以分成正比例的情况和其他部分一起处理:
一般情况
缩小 \(a\):
缩小 \(b\):
交换 \(a, c\):
这些公式看起来复杂,但本质和欧几里得一样:不断把 \(a, c\) 变小、交换,直到边界。
复杂度 \(O(\log)\)。
无理数斜率拓展
求:
其中 \(r\) 是无理数。
推导一:缩小 \(r\) 的规模(分离整数部分)
设 \(r = \lfloor r \rfloor + \gamma\),其中 \(\lfloor r \rfloor\) 是整数部分,\(\gamma\) 是小数部分(\(0 < \gamma < 1\))。
代入原式:
因为 \(i\lfloor r \rfloor\) 是整数,可以直接提出去:
由等差数列求和公式,得到:
这一条的作用: 把斜率 \(r\) 变成了它的小数部分 \(\gamma\),也就是把斜率缩小到了 \([0, 1)\) 之间。这就像欧几里得算法里的取模操作。
推导二:交换两项
因为无线上整点,所以矩形总点数 = 线下点数 + 线上方点数。
移项得到最终公式:

浙公网安备 33010602011771号