- 博客(11)
- 资源 (10)
- 收藏
- 关注
原创 大范围素数筛法性能测试(2^64)
目前网上能找到有源代码的最快素数筛法是ecprime和primesieve(n 算法是高度优化的(the classical segmented sieve of Eratosthenes),自己实现素数筛法程序primenumber性能与primesieve相当. 两个程序性能与机器cpu的缓存L1/L2/L3大小密切相关. 下面给出两程序单线程benchmark:
2011-03-10 14:25:00 2770 9
原创 素数筛法系列之5 完整实现2
// http://acm.nudt.edu.cn/~twcourse/PrimeNumberGeneration.html#a3#include #include #include #include #define ST 7#define MOVE 4#define BLOCKSIZE (510510 * 4) // 2 * 3 * 5 *
2011-06-21 11:56:00 930 1
原创 素数筛法系列之5 完整实现
#include #include #include #include #define FACT (255255 * 1) // 3 * 5 * 7 * 11 * 13 * 17 = 255255#define ST 7#define MAXN ((1u #define MASKN(n) (1 > 1) & 7))#define MOVE 4#define BLOCKSIZE (FACT #d
2011-05-30 21:04:00 992 1
原创 素数筛法系列之4 预先删除小素数
做区间筛法的时候, 我们总是从因子2, 3, 7 , .... 开始直到最后一个平方根因子的筛。 有没有办法介绍不必要的计算, 比如每个区间都从19往后筛, 一定程度上较少的筛法, 提高性能。 下面给出一个实现方案。
2011-05-29 17:30:00 827 1
原创 素数筛法系列之3 减少筛次数
<br />//筛法加速<br /> 接上一节, 筛某个素数的倍数的时候只需筛掉奇数倍数, 这样计算量可<br />可减少一般, 再进一步优化, 不筛3的倍数, 只筛6k+1, 6k+5 之类素数,<br />计算量只有原来2/3.<br /><br />static void crossOutFactorMod6(uchar bitarray[], const uint64 start,<br /> const int leng, int factor)<br
2011-03-25 12:03:00 996 1
原创 素数筛法系列之2 分段筛法思想
素数分段筛法指的是 the segmented sieve of EratoSieve, 将计算区间划分成若干个区间,分别计算出每一个区间的素数, 一种分治算法的实现. 与传统筛法相比, 能更好的利用cpu的缓存, 大幅提升内存访问的性能( >3 倍),还能减小对内存的需求. 举个例子, 计算100亿以内的素数, 我们把100亿均分成100100等分, 每个区间长度为1亿, 然后计算每个长度为1亿的区间素数. 问题是区间长度取多少整体筛法性能最好? 按我前面描
2011-03-22 19:40:00 2287
原创 素数筛法系列之1 简单筛法实现
让你写一个程序, 计算10亿(10^9)内素数(写入内存, 不必输出), 你能在2G的主流cpu上10秒做到?.看看这个作者的实现, 其实0.5秒就够了. http://code.google.com/p/primesieve/ 如何快速枚举n以内的素数, 目前最快的算法还是 sieve of Eratosthenes要高效的实现起来并不那么容易, 一定程度上可考察你的基本功, 尤其是如何去优化程序方面的功底.下面是我写的一端小程序, 看看有什么问题./* 为
2011-03-21 20:11:00 1065 1
原创 基于数组的位运算4 位数组按bit位整体移动
对于memmove, memcpy等c语言内存操作函数你一定很熟悉吧, 如果不知道, just go -> search 废话少说直接进入话题. 给你一个函数 bitmemmove(char bitarray[], uint bitleng, uint bitmove);目标是 将内存bitarray整体向低位移动bitmove 个bit 位, 新进来的内存都设置为bit 1,暂且假设( bitmove //move bit from [leftbitshift, leftbitshift + bi
2011-03-18 14:06:00 1435
原创 基于数组的位运算3 按bit位反转数组
对于给定的数组uchar a[], 以及bit位长度n(不是数组长度) , 如何实现反转算法, 效率一定要高哦大多数人首先想到的是首尾测试每个bit是否为0,1(本博客有关于如何测试,设置bit的). 然后在交换bit位这种算法的复杂度为n, 有没有办法进一步减小复杂度, 哪怕是常数因子也行, 答案是有的, 请看下面详细代码描述, 基本思路是先构造一个16位整数反转表 WordReverse//WordReverse[i] is equal to the bit reverse of
2011-03-18 09:48:00 1436
原创 基于数组的位运算2 计算二进制1的个数
//count bit data array type#if 0 typedef unsigned int stype; # define SMOVE 5#else typedef uint64_t stype; # define SMOVE
2011-03-17 13:19:00 1621 1
原创 基于数组的位运算1 数组位的基本运算
typedef unsigned char uchar;typedef unsigned short ushort;typedef unsigned int uint; //vc ++ 6.0 不支持long long//linux gcc 不支持__int64#ifdef _MSC_VER typedef __int64 int64; typedef unsigned __int64 uint64; typedef int64 ltype;#else
2011-03-17 12:34:00 2534
超快素数筛法程序
2014-01-23
一亿亿内最快素数筛法
2011-09-17
超级快速素数筛法程序
2010-11-22
2秒内 计算10亿内素数筛法
2010-08-18
非常高效的素数筛法程序
2010-06-18
计算2^31以内孪生素数
2008-12-16
PrimeNumber
2008-11-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人