社区
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)
...全文
507
23
打赏
收藏
质数,除2 除3 除5,又没有快速算法?
如题:一个丑数序列,即除2 除3 除5,不能整除, 又没有比下面的code更快的运算? 比如移位什么的。 if( num%2 ==0 || num%3 ==0 || num%5 ==0)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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毫秒
RSA加密
算法
的C语言实现
2. 密钥生成:RSA的密钥对由两个大素数p和q通过以下步骤生成: - 选择两个大素数p和q。 - 计算n=p*q,n是公钥和私钥的一部分。 - 计算φ(n)=(p-1)*(q-1),φ(n)是欧拉函数,用于确定解密的模逆运算。 - 选择一个...
C语言100个
算法
经典例题
有效的
算法
能够
快速
识别一个数是否为素数。 #### 知识点十三:水仙花数查找(程序13) 水仙花数是指一个三位数,其各位数字的立方和等于该数本身。寻找这样的数字需要理解和运用数学原理,以及循环和条件语句。 ##...
RSA加密所需要的js
`Barrett.js` 文件可能是一个用于
快速
模幂运算的库,模幂运算是RSA
算法
中非常关键的一部分,尤其是对于大数的模幂。Barrett除法是一种高效的
算法
,可以用于大数的模逆和模幂运算,大大提升了RSA加密和解密的速度。 ...
C语言
70,035
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章