无心人
发表于 2009-1-1 22:47:46
基本上到了筛法的后期
都是在优化算法细节上做文章
算法本身应该改动不大了
tprime
发表于 2009-2-2 09:46:09
附件中有多 个素数和孪生素数程序,后面的数字表示
cache利用的大小,测试发现相同机器不同L2 cache大小计算
总时间相差很大. 接近1/4 L2 或者 L1 性能最好。
PrimeNumber33.exe
TwinPrime33.exe
TwinPrime66.exe
PrimeNumber66.exe
PrimeNumber49.exe
TwinPrime49.exe
PrimeNumber_33.exe
TwinPrime_33.exe
无心人
发表于 2009-2-2 14:03:45
这个似乎和机器的二级缓存关系比较大
但具体的关系不是太简单的
似乎略微大于所有的缓存的和
〇〇
发表于 2009-7-31 18:49:46
本帖最后由 〇〇 于 2009-7-31 18:58 编辑
1# 无心人
http://blog.csdn.net/l1t/archive/2006/02/23/607302.aspx
import java.io.PrintStream;
public class Sieve5
{
public Sieve5()
{
}
public static int getisp(int i)
{
return isprime >> (i & 7) & 1;
}
public static void main(String args[])
{
int i = 100;
try
{
i = Integer.parseInt(args);
}
catch(Exception exception) { }
int j = (i + 1) / 2;
isprime = new byte;
int k = 0;
for(int l = 0; l <= j / 8 + 1; l++)
isprime = -1;
isprime &= 0xfe;
isprime |= 2;
int k1 = (int)Math.ceil(Math.sqrt(i));
boolean flag = false;
int i1 = (i - 1) / 2;
for(int i2 = 4; i2 <= i1; i2 += 3)
isprime &= ~(1 << (i2 & 7));
char c = '\0';
int j2 = (k1 - 1) / 2;
int k2 = (i - 1) / 2;
for(int j1 = 2; j1 <= j2; j1++)
{
c++;
if(c == '\003')
c = '\0';
else
if(getisp(j1) == 1)
{
int l1 = ((j1 << 2) + 1) % 3;
for(int l2 = j1 * (2 * j1 + 2); l2 <= k2; l2 = l2 + j1 + j1 + 1)
if(++l1 == 3)
l1 = 0;
else
if(getisp(l2) == 1)
isprime &= ~(1 << (l2 & 7));
}
}
int i3 = 2;
if(i <= 2)
i3 = 2;
else
if(i % 2 == 1 && getisp((i - 1) / 2) == 1)
{
i3 = i;
} else
{
i3 = i - 1 - i % 2;
do
{
int j3 = (i3 - 1) / 2;
if(getisp(j3) == 1)
break;
i3 -= 2;
} while(true);
}
System.out.println("The largest prime less than or equal to " + i + " is " + i3 + " cycle time:" + k);
}
static byte isprime[];
}
http://topic.csdn.net/t/20040513/21/3065034.html
无心人
发表于 2009-8-2 10:47:18
希望能给出一些具体的测试信息
比如时间
〇〇
发表于 2009-11-7 19:11:20
85# 无心人
D:\lt\dl\sieve>cl sieve5.cpp -O2
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
sieve5.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.All rights reserved.
/out:sieve5.exe
sieve5.obj
D:\lt\dl\sieve>test sieve5 100000000
start ...
当前时间: 19:08:50.06
输入新时间:
The largest prime less than or equal to 100000000 is 99999989, cycle time:0
当前时间: 19:08:50.65
输入新时间:
done!
D:\lt\dl\sieve>test sieve5 100000000
start ...
当前时间: 19:08:52.76
输入新时间:
The largest prime less than or equal to 100000000 is 99999989, cycle time:0
当前时间: 19:08:53.34
输入新时间:
sir_chen
发表于 2009-12-8 21:15:14
能不能把实现的过程说的详细一点
sir_chen
发表于 2009-12-8 21:21:06
能不能把原理说清楚,代码都是次要的
qianyb
发表于 2010-2-27 15:10:10
郭老大的PrimeNumber素数生成的内存要求太高了,生成42亿时700M空闲内存还提示不够
gxqcn
发表于 2010-2-27 15:39:35
主要是输出字串需要大量空间(我没有用磁盘映射技术,也未分段处理),
如果不输出,均可快速处理;
而若要输出,请选择合适的分段处理。
页:
1
2
3
4
5
6
7
8
[9]
10
11
12