社区
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)
...全文
449
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亿内所有素数
革命性素数
算法
:计算1亿内素数只要1.6秒
算法
基本跟之前发的C#版相同(http://download.csdn.net/source/690005内有
算法
描述),由我的朋友杨力2年前设计,时间复杂O(n)。我对其进行了革命性的数据结构改进,空间复杂度从2个O(n)降低到1/6个O(n),程序的
算法
描述更加简洁,改用C++实现,我认为
算法
效率已经达到了素数
算法
的极限。 注:创建的内存大小不要超过内存,否则效率下降
最快求素数的
算法
,求100000000以下素数0.3秒
最快求素数的
算法
,求100000000以下所有素数0.3秒 , 在10000000以下的数中找到664579个素数,耗时53毫秒
Python实战--内置数据结构深入视频精讲
本课程的Python环境为:Python3.7,Jupyter 4.4.0,CentOS 7.xPython爬虫语言是 目前最火的语言之一。本课程为Python教程的内置数据结构篇,通篇围绕Python的数据结构展开讲解,包括七大数据结构:字符串、列表、元组、集合、字典、bytes、bytearray,最后通过3个经典案例:素数求解,杨辉三角,矩阵转置来强化大家的学习成果。同时通过大量具像化的实际案例来告诉大家每种数据结构的应用场景,为什么需要这么来做。让同学们能够从学习中感受到知识的建立,不让每一个知识点变成孤岛,从而导致学完后还是一头雾水。学习完本课程后,同学们可以有效的理解数据结构内在机理,深入掌握每一种数据结构在实际应用中的典型案例。
RSA
算法
的纯Python实现(源码)
RSA
算法
的纯Python实现,压缩包内共4个文件,分别是 1、大整数的运算库(当然不是算加减乘除的,这个python本身就有)。这个库是计算乘模运算,幂模运算(蒙哥马利
算法
),最大公约数
算法
及扩展最大公约数
算法
(扩展欧几里得
算法
)等。 2、
质数
库。Miller_Rabin素数判断法,大整数
快速
因式分解
算法
(pollard_rho
算法
),生成指定位数的大
质数
或大整数
算法
等。 3、RSA
算法
库。使用上面两个库,实现RSA
算法
。实现了生成指定数位的密钥对,加密,解密,签名和验证,这5个核心功能。 4、RSAtest.py一个使用RSA
算法
库的例子。例子从生成密钥对开始,对数据进行加解密,签名和验证签名,最后用修改后的消息再次验证签名。 这个RSA
算法
最低支持32位密钥长度,最长没限制。但是事实上,在我的电脑上测试,1024位大概1.3秒左右,1536大约5~6秒,2048位密钥生成就需要约27秒。 这次发布的是源码,里面有详细的中文注释,十分适合希望学习RSA
算法
原理的人。RSA
算法
原理基于两个大
质数
的乘积很难因式分解,几种
算法
的优劣主要体现在
质数
判断、
快速
乘模运算、
快速
幂模运算等。如需实际应用建议使用大能们的实现:https://pypi.python.org/pypi/rsa/
如何
快速
检查素数
如何
快速
检查一个素数的素性(
算法
)提供了具体
算法
的描述和实现。具有参考意义
C语言
69,336
社区成员
243,078
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章