这个半周继续学习了数学的内容,在整理一下吧。其实感觉直接复习高代好像也可以。
筛素数:
理论:任何一个正整数都可以被唯一的分解为若干个素数的乘积;
取出容器中最小的数(此数一定是素数),删去所有该数的倍数。
int n;
bool vis[1005];
cin>>n;
memset(vis,true,sizeof(vis));
vis[0]=false;vis[1]=false;
for(int i=2;i<=n;i++){
if(vis[i]==false) continue;
for(int j=i*2;j<=n;j+=i){
vis[j]=false;
}
}
筛素数改进:
因为普通筛素数方法速度是比较慢,因为同一个数可能处理好几次(2,3,都是12的因子),任何一个数都有一 个可以被整除的最小素数(除去1),当遇到该素数是时就结束更新。
int flag=0,n;
memset(isprim,0,sizeof(isprim));
cin>>n;
for(int i=2;i<n;i++)
{
if(!isprim[i]) prim[flag++]=i;
for(int j=0;(j<flag)&&(i*prim[j]<n);j++)
{
isprim[j]=1;
if(i%prim[j]==0) break;//就用这部来节省时间
}
}
欧拉函数:
计算比x(正整数)小的正整数中有多少与x互素的数的个数。设x=p1^(a1) *p2^(a2) *......px^(ax);
f(x)=p1^(a1-1) *p2^(a2-1) .....(p1-1)(p2-1)....
欧拉定理:
设f(x)是求x的欧拉函数。如果a,m互素。
那么 a ^ ( f(m) ) == 1( mod m);//数学真是很神奇。
费马小定理:
若p为素数,则对于任意小于p的正整数a,有a^(p-1)==1( mod p )。其实就是对欧拉定理的特例,a与m互素。
二次探测定理:
若p是素数a^2==1 ( mod p); 还是欧拉定理的特例。
Miller—Rabin算法:
主要用来判断输入的数是否为素数。
如果p是素数,x是小于p的正整数,且 (x^p-1) mod p = 1。
其实这只是一个充分条件,但是可以利用随机数多试验几次,就可以把正确率提高高99.99%以上。
http://blog.csdn.net/z690933166/article/details/9860937这是一位大佬的详细讲解。
关于这个算法的具体实现我还没完全看懂。
此处是该算法的模版 http://blog.csdn.net/idealism_xxm/article/details/480531
还有用于大整数分解的Pollard—rho算法,这是某大佬的模版http://blog.csdn.net/lianai911/article/details/45076837
其实我Pollard—rho算法和Miller—Rabin算法都还没怎么彻底弄懂,彻底弄懂后专门整理一篇。