ACM一道关于素数查找的题
2015-05-19 20:34
393 查看
在ACM做这么一道题:
我用了最简单的查找素数的方法:
bool isPrime(int n)
{
int t=n-1;
while(t>2)
{
if(n%t==0)
{
return false;
}
t--;
}
return true;
}结果正确,却超时了,后来发现当变量是一个大数的时候这种查找效率极低,于是就在网站各种搜索快速的判断素数的算法
Miller Rabin算法:
typedef unsigned __int64 llong;
llong mod_pro(llong x,llong y,llong n)
{
llong ret=0,tmp=x%n;
while(y)
{
if(y&0x1)if((ret+=tmp)>n)ret-=n;
if((tmp<<=1)>n)tmp-=n;
y>>=1;
}
return ret;
}
llong mod(llong a,llong b,llong c)
{
llong ret=1;
while(b)
{
if(b&0x1)ret=mod_pro(ret,a,c);
a=mod_pro(a,a,c);
b>>=1;
}
return ret;
}
llong ran()
{
llong ret=rand();
return ret*rand();
}
bool isPrime2(llong n)
{
int t=2;
if(n<2)return false;
if(n==2)return true;
if(!(n&0x1))return false;
llong k=0,m,a,i;
for(m=n-1;!(m&1);m>>=1,k++);
while(t--)
{
a=mod(ran()%(n-2)+2,m,n);
if(a!=1)
{
for(i=0;i<k&&a!=n-1;i++)
a=mod_pro(a,a,n);
if(i>=k)return false;
}
}
return true;
} 对比一下速度:
我的
Miller Rabin算法:
我用了最简单的查找素数的方法:
bool isPrime(int n)
{
int t=n-1;
while(t>2)
{
if(n%t==0)
{
return false;
}
t--;
}
return true;
}结果正确,却超时了,后来发现当变量是一个大数的时候这种查找效率极低,于是就在网站各种搜索快速的判断素数的算法
Miller Rabin算法:
typedef unsigned __int64 llong;
llong mod_pro(llong x,llong y,llong n)
{
llong ret=0,tmp=x%n;
while(y)
{
if(y&0x1)if((ret+=tmp)>n)ret-=n;
if((tmp<<=1)>n)tmp-=n;
y>>=1;
}
return ret;
}
llong mod(llong a,llong b,llong c)
{
llong ret=1;
while(b)
{
if(b&0x1)ret=mod_pro(ret,a,c);
a=mod_pro(a,a,c);
b>>=1;
}
return ret;
}
llong ran()
{
llong ret=rand();
return ret*rand();
}
bool isPrime2(llong n)
{
int t=2;
if(n<2)return false;
if(n==2)return true;
if(!(n&0x1))return false;
llong k=0,m,a,i;
for(m=n-1;!(m&1);m>>=1,k++);
while(t--)
{
a=mod(ran()%(n-2)+2,m,n);
if(a!=1)
{
for(i=0;i<k&&a!=n-1;i++)
a=mod_pro(a,a,n);
if(i>=k)return false;
}
}
return true;
} 对比一下速度:
我的
Miller Rabin算法:
相关文章推荐
- ACM一道关于素数查找的题
- 山东理工大学ACM平台题答案关于C语言 1137 C/C++经典程序训练7---求某个范围内的所有素数
- 快速查找素数 http://acm.nyist.net/JudgeOnline/problem.php?pid=187
- 分享一道关于素数的笔试题
- 南阳acm 187-快速查找素数
- 测试鸡蛋的硬度:一道关于查找的面试题
- 一道关于素数的问题
- 山东理工大学ACM平台题答案关于C语言 1137 C/C++经典程序训练7---求某个范围内的所有素数
- 关于acm素数题解的思考
- 借ACM一道题 关于算法优化的一点感想
- ACM网络赛金华赛区的一道关于树的题:Family Name List
- 理工大学ACM平台题答案关于C语言 1585 素数
- 一道关于DP的ACM
- 一道关于大数的ACM题的讨论过程——沟通与发散思维
- 一道关于字符查找的笔试题
- 学校的一道acm题
- 一道关于进制的思维题
- 关于素数
- [ACM] POJ 1035 Spell checker (单词查找,删除替换增加任何一个字母)
- 一道关于最小生成树的傻逼题