社区
C语言
帖子详情
质数,除2 除3 除5,又没有快速算法?
asimay
2009-10-16 08:48:06
如题:一个丑数序列,即除2 除3 除5,不能整除,
又没有比下面的code更快的运算? 比如移位什么的。
if( num%2 ==0 || num%3 ==0 || num%5 ==0)
...全文
477
23
打赏
收藏
质数,除2 除3 除5,又没有快速算法?
如题:一个丑数序列,即除2 除3 除5,不能整除, 又没有比下面的code更快的运算? 比如移位什么的。 if( num%2 ==0 || num%3 ==0 || num%5 ==0)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
brookmill
2009-10-17
打赏
举报
回复
我是来看11楼的
zzyjsjcom
2009-10-17
打赏
举报
回复
--- 呵呵,不好意思 打错了一个字
if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
这个分支也不是很多呀, 现在的intel的分之预测,应该足以预测出所有的分支 从而避免了预测失败的代价, 当然这是个特例,如果分支多了 就可能有 19 楼说的问题
zzyjsjcom
2009-10-17
打赏
举报
回复
if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
这个分支也不是很多呀, 现在的intel的分之预测,应该足以预测出所有的分支 从而避免了预测失败的代码, 当然这是个特例,如果分支多了 就可能有 19 楼说的问题
ycwu314
2009-10-17
打赏
举报
回复
应该没有吧 即便是源码不写成位运算的形式 编译时也换转过来的
失落的凡凡
2009-10-17
打赏
举报
回复
11楼神奇!
mLee79
2009-10-17
打赏
举报
回复
[Quote=引用 17 楼 fuzzy_man 的回复:]
引用 11 楼 mlee79 的回复:
0x1f75d77d&(1 < <i%30)
这样做是可行的 ,但是局限性太大,2*3*5数值比较小,可以穷举各种mod30的各种情况.
从速度上考虑,也并不比
if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
快的了多少,假设mod运算需要20个cpu时钟周期,位运算和比较运算时间花销都忽略
11楼算法的时间是 20 clk
if( Expressions1|| Expressions2 || Expressions3)
50%的概率Expressions1就能完成(一半数据能被2整除).Expressions2中有1/3的概率能完成,2/3的概率需要进入Expressions3
后面算法的时间是 0*1/2 +20*1/6 +40*2/6 = 16.6 clk
[/Quote]
你计算过分支预测失败的要多几个周期么,没听说过现代的计算机算个除法要20个周期的,你说的是486吧。。。
zhengjiankang
2009-10-17
打赏
举报
回复
15楼的做法着实不错
2和5整除的嘛直接看出来了
3的把各位加起来
要是有7以上的再考虑楼主那样的办法嘛
fuzzy_man
2009-10-17
打赏
举报
回复
[Quote=引用 11 楼 mlee79 的回复:]
0x1f75d77d&(1 < <i%30)
[/Quote]
这样做是可行的 ,但是局限性太大,2*3*5数值比较小,可以穷举各种mod30的各种情况.
从速度上考虑,也并不比
if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
快的了多少,假设mod运算需要20个cpu时钟周期,位运算和比较运算时间花销都忽略
11楼算法的时间是 20 clk
if( Expressions1|| Expressions2 || Expressions3)
50%的概率Expressions1就能完成(一半数据能被2整除).Expressions2中有1/3的概率能完成,2/3的概率需要进入Expressions3
后面算法的时间是 0*1/2 +20*1/6 +40*2/6 = 16.6 clk
magicpang
2009-10-16
打赏
举报
回复
整除3的数的特点是十进制表示时候所有位加起来的和整除3
5的话,末尾是5,或者0,
7不知道
不过二进制表示的时候就不清楚了
东大坡居士
2009-10-16
打赏
举报
回复
9楼说的好像是叫什么筛选法来着....
whycadi
2009-10-16
打赏
举报
回复
可以把整形除法转化为乘法,再做一次减法就能求余。
比如一个32位无符号整形数要除3,可以乘(2^32/3+?)(忘了是加1还是加2了,应该是1吧,需要64位乘法),再取高32位的值就是结果。
类似的5、7、11之类的数也能找到对应的系数。
对于有硬件除法器的CPU,除非是对于效率极重视,否则没必要这样做。不过很多嵌入式CPU没有硬件除法电路,甚至连硬件乘法器也没有,这样做就很有意义了。
baihacker
2009-10-16
打赏
举报
回复
11楼这个爽...
mLee79
2009-10-16
打赏
举报
回复
0x1f75d77d&(1<<i%30)
shashenyidaoOCEAN
2009-10-16
打赏
举报
回复
我也觉得该用位运算
baihacker
2009-10-16
打赏
举报
回复
可以预先打表,如果要处理的数的范围不大,比如说100万.
bool flag[1000000+1];
那么先把2,3,5的倍数置true.
然后flag[value]就可以了.
asimay
2009-10-16
打赏
举报
回复
[Quote=引用 7 楼 whg01 的回复:]
引用 3 楼 forestdb 的回复:
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。
除了这个没别的办法了。
[/Quote]
3,5,7,11之类的呢?
whg01
2009-10-16
打赏
举报
回复
[Quote=引用 3 楼 forestdb 的回复:]
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。
[/Quote]
除了这个没别的办法了。
lbh2001
2009-10-16
打赏
举报
回复
取模是个较慢的运算
asimay
2009-10-16
打赏
举报
回复
[Quote=引用 3 楼 forestdb 的回复:]
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。
[/Quote]
你真牛。。。
其它的呢? 3,5,7,11之类的呢?
十八道胡同
2009-10-16
打赏
举报
回复
[Quote=引用 3 楼 forestdb 的回复:]
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。
[/Quote]
呵呵,位运算是快些。。
加载更多回复(3)
最快素数
算法
(绝非线性筛选)1.6秒算出1亿内所有素数
我对其进行了革命性的数据结构改进,空间复杂度从2个O(n)降低到1/6个O(n),程序的
算法
描述更加简洁,改用C++实现,我认为
算法
效率已经达到了素数
算法
的极限。 注:创建的内存大小不要超过内存,否则效率下降
最快求素数的
算法
,求100000000以下素数0.3秒
最快求素数的
算法
,求100000000以下所有素数0.3秒 , 在10000000以下的数中找到664579个素数,耗时53毫秒
求解第N个
质数
(第N个素数)vs2010项目
在编程领域,寻找第N个
质数
是一项常见的
算法
挑战,特别是在教学和
算法
分析中。这里我们关注的是一个名为“求解第N个
质数
(第N个素数)vs2010项目”的项目,该项目使用了Visual Studio 2010作为开发环境。这个项目的...
RSA
算法
的纯Python实现(源码)
Miller_Rabin素数判断法,大整数
快速
因式分解
算法
(pollard_rho
算法
),生成指定位数的大
质数
或大整数
算法
等。 3、RSA
算法
库。使用上面两个库,实现RSA
算法
。实现了生成指定数位的密钥对,加密,解密,签名和验证,...
RSA加密
算法
的C语言实现
2. 密钥生成:RSA的密钥对由两个大素数p和q通过以下步骤生成: - 选择两个大素数p和q。 - 计算n=p*q,n是公钥和私钥的一部分。 - 计算φ(n)=(p-1)*(q-1),φ(n)是欧拉函数,用于确定解密的模逆运算。 - 选择一个...
C语言
70,020
社区成员
243,264
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章