Tag: primes

使用eratosthenes筛子的Spoj PRIME1(在C中)

我正在尝试使用Eratosthenes的分段筛来解决问题PRIME1 。 我的程序可以正常筛选,达到NEW_MAX 。 但是在n > NEW_MAX情况下存在一些问题,其中分段筛分发挥作用。 在这种情况下,它只打印所有数字。 以下是包含相关测试用例的代码的链接: http : //ideone.com/8H5lK#view_edit_box /* segmented sieve */ #include #include #include #define MAX_LIMIT 1000000000 //10^9 #define NEW_MAX 31623 /*SQUARE ROOT OF 1000000000*/ #define MAX_WIDTH 100000 //10^5 char flags[NEW_MAX+100]; /*TO PREVENT SEGMENTATION FAULT*/ void initialise(char flagarr[], long int n) //initialise all elements to true from 1 to n […]

生成从1到n的素数,崩溃n> 3亿

有关如何让这个程序工作n = 1万亿(除了升级/购买新计算机)的任何建议? 错误如下:构建后,正在执行的程序(命令行样式输出窗口弹出)然后快速关闭,我得到以下错误“ProjectPrimes.exe已停止工作(Windows正在寻找解决方案这个问题。“我怀疑这与内存问题有关,因为我第一次遇到n = 2000万,但那是在我选择malloc / free’筛子’arrays之前(即我的’筛’arrays是大arrays)尺寸nx 1,每个元素由1或0组成。 该程序需要大约35秒才能完成前3亿个整数(16,252,325个素数),所以没关系,但没什么了不起的。 正如我所提到的,目标是能够产生低于1万亿的质数,所以我还有很长的路要走…… 如果相关,这是我的机器规格(如果在这台机器上目标恰好是不合理的):2.40ghz i5,4GB RAM,64位Windows 7。 方法概述,对于那些不熟悉的人:我们使用Sienda of Sundaram方法。 在没有进入certificate的情况下,我们首先使用筛选函数消除整数“n”以下的所有奇数非素数:[2 *(i + j + 2 * i * j)+1 | i < – [1..n / 2],j < – [i..an优化上限]]。 然后我们交掉偶数(当然不包括两个)。 这让我们留下了素数。 为什么prime函数返回(指向包含数组的指针)n下面的完整素数集? 那么,目标是能够识别(i)n以下的素数以及(ii)列出n以下的素数。 这也是为什么我选择传递一个指针,用于将n下面的素数计数作为参数。 这是不那么令人兴奋的“主要”function: int main() { long ceiling = 300*1000*1000; long *numPrimes; long *primes; […]

CUDA Primes Generation

当数据大小增加超过260k时,我的CUDA程序停止工作(它什么都不打印)。 有人能告诉我为什么会这样吗? 这是我的第一个CUDA计划。 如果我想要更大的素数,如何在CUDA上使用大于long long int的数据类型? 显卡是GT425M。 #include #include #include #define SIZE 250000 #define BLOCK_NUM 96 #define THREAD_NUM 1024 int data[SIZE]; __global__ static void sieve(int *num,clock_t* time){ const int tid = threadIdx.x; const int bid = blockIdx.x; int tmp=bid*THREAD_NUM+tid; if(tid==0) time[bid] = clock(); while(tmp<SIZE){ int i=1; while(((2*tmp+3)*i+tmp+1)<SIZE){ num[(2*tmp+3)*i+tmp+1] = 0; i++; } tmp+=BLOCK_NUM*THREAD_NUM; } if(tid==0) […]

CUDA – Eratosthenes筛分为部分

我在GPU上编写了Eratosthenes的Sieve( https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes )的实现。 但不是这样的 – http://developer-resource.blogspot.com/2008/07/cuda-sieve-of-eratosthenes.html 方法: 创建具有默认值0/1(0 – prime,1 – no)的n元素数组并将其传递给GPU(我知道它可以直接在内核中完成,但在这一刻它不是问题)。 块中的每个线程检查单个数字的倍数。 每个块检查总sqrt(n)的可能性。 每个块==不同的间隔。 将倍数标记为1并将数据传递回主机。 码: #include #include #define THREADS 1024 __global__ void kernel(int *global, int threads) { extern __shared__ int cache[]; int tid = threadIdx.x + 1; int offset = blockIdx.x * blockDim.x; int number = offset + tid; cache[tid – 1] = […]

C中Eratosthenes算法的筛选

好的,所以我创建的这个函数使用Sieve of Eratosthenes算法来计算所有素数<= n。 此函数存储参数中的素数和素数计数。 当函数退出时,素数应指向一个动态分配的内存块,其中包含所有素数<= num。 *count将具有素数。 这是我的函数getPrimes : void getPrimes(int num, int* count, int** array){ (*count) = (num – 1); int sieve[num-1], primenums = 0, index, fillnum, multiple; //Fills the array with the numbers up to the user’s ending number, num. for(index = 0, fillnum = 2; fillnum <= num; index++, fillnum++){ sieve[index] […]