标签:
说到素数不得不说素数判定算法。
其中极为经典的为Rabin Miller测试。
通过二次探测的方法,我们可以将其正确率上升到一个很高的高度。
二次探测的原理我还是不太懂,所以NOI前我暂时只是梳理一下这个算法的流程。
首先,我来介绍一些小Trick。
$O(1)$的快速乘。
在一些卡常数而且爆long long的取余问题中我们常常要用到快速乘。
朴素的快速乘是$O(logn)$的,从而添加了不必要的复杂度。
在这里介绍$O(1)$的快速乘。
在 c++ 运算中,有的时候是会爆long long的,但它实质上是对于$0x7ffffffffffffff$取余的结果,这就为我们创造了良好的性质
在long long运算中我们只要不涉及除法,那么他一直是对INF取余的结果,对答案没有干扰。
所以代码就很好理解了:
1 LL mul(LL a,LL b,LL mod){ 2 if(a<=(LL)(1e8) && b<=(LL)(1e8)) return a*b%mod; 3 return (a*b - (LL)(a/(LD)mod*b + 1e-3)*mod + mod) % mod; 4 }
注意快速乘在很小的数字时可能出错,所以特判一下。
注意一下Linux下rand()函数足够大,不需要我们去拓充。
转入正题:Rabin测试。
我的Rabin在INT范围内不会出错,在LOGN LONG范围内出错的概率极低。
首先是写一个check(LL x,LL P),用数字x检验P是否为素数。
1 bool check(LL x,LL P){ 2 LL tmp=P-1; 3 while(!(tmp&1)) tmp>>=1; 4 LL m=qpow(x,tmp,P); 5 if(m==1) return 1; 6 while(tmp<P){ 7 if(m==P-1) return 1; 8 tmp<<=1; m=mul(m,m,P); 9 } 10 return 0; 11 }
完了又要死记 TAT。
梳理一下过程
首先将P-1中所有的2全都除掉。
这时候如果tmp 为 P-1 或者 1是伪素数。(具体就用 $x^{tmp} = 1 (mod P)$判定)
这时候检查$x^{2tmp} , x^{4tmp}, x^{8tmp} ....$是否等于 $P-1$。
如果没有则说明P不是素数。
接下来基于这一个$O(logn)$判定素数,我们有$O(n^{1/4})$的分解质因数算法。
Rho算法。
Rho算法是基于一个定理对于一个小于n的数字x如果 $(x,n) ≠ 1$ 则有,(x,n)为n的因子。
这样我们只要考虑怎样高效地得到这样的数字x。
1 LL Rdo(LL n,LL c){ 2 LL i=1,k=2,x,y,d,p; 3 x=Rand()%n; 4 y=x; 5 while(1){ 6 i++; 7 x=(mul(x,x,n)+c)%n; 8 if(y==x) return n; 9 p=Abs(x-y); 10 d=gcd(p,n); 11 if(d!=1&&d!=n) return d; 12 if(i==k){ 13 y=x; 14 k+=k; 15 } 16 } 17 } 18 19 int tot; 20 LL a[N]; 21 22 void down(LL n){ 23 if(n==1) return; 24 if(isprime(n)){ 25 a[++tot]=n; 26 return; 27 } 28 LL t=n; 29 while(t==n) t=Rdo(n,Rand()%(n-1)+1); 30 down(t); 31 down(n/t); 32 }
Rdo() 主要是返回一个n的因子的,好像有证明通过上面那种方法最后是一个Rdo形状。
这样我们就可以得到了分解质因数的高效方法。
注意一个数字的质因子最多有$O(logn)$个,因为质因数的乘积为n,而且质因数都大于1.
继续,某天SB PHX在B站上随便找题。
找到了这样一道题:
给定一个整数N,求N最少可以拆成多少个完全平方数的和。
贪心??
然而数据范围:
30.的数据N≤10^6
60.的数据N≤10^9
100.的数据0≤N≤10^18 ,TEST<=1000
显然是让$O(logn)$的样子
所以根据拉格朗日平方和定理,答案为1~4
答案为1,直接SB 开方验证
答案为2,根据勾股数定理一个数字为勾股数当且仅当其质因数分解中所有的$4n+3$项的指数为偶数。(具体证法百度“勾股数”,基本上就是同余和欧几里得的知识)
答案为3,根据初等数论中的不等式 $n ≠ (8k + 7) \cdot 4^{m}$
不然答案为4,根据 拉格朗日平方和定理即可。
Rank1 好开心 o(>_<)o
标签:
原文地址:http://www.cnblogs.com/lawyer/p/4626147.html