快速查找某个范围内的所有素数

观察以下素数表,不能被小于素数n的素数整除的最小数为下一个最小素数。换句话说所谓素数可以看做是坐标中不断使用更小素数的倍数填充后剩余的最小数。

例:

1】2是最小素数,使用2的倍数不断填充坐标后,未被填充的最小数就是3,于是3就是大于2的下一个素数

2】然后使用3的倍数不断填充坐标,剩余的未被填充的最小数就是5(4已经被2的倍数填充),可以发现5是大于3的下一个素数

3】依次类推可以顺序的求解所有素数

...

隐隐约约觉得,通过以上规律可以推出某范围内素数个数与素数值的关系,我自己就没有再推了,有兴趣的可以尝试一下,如果有结果了望能分享给我一下,感谢。

然后“talk is cheap,give me the code(废话少说,放码过来)”

clc
clear all
close all

numEnter = 100000;
numVector = zeros(1,numEnter);
numVector(1,1) = 1;
disp('2');
divNum = 2;
tempVector = find(~numVector);

tic
while(divNum <= numEnter)
    for iloop1 = 1:length(tempVector)
        % 小于divNum的数字不需要重复判断,相较于从2开始计算,可以节省1/3的时间(numEnter = 100000时)
        if(mod(tempVector(iloop1),divNum) == 0)
            numVector(1,tempVector(iloop1)) = 1;
        end
    end
    
    tempVector = find(~numVector);       % 寻找所有原始向量中的零元素坐标
    if (min(size(tempVector))>0)
        divNum = tempVector(1,1);           % 剩余的零元素的第一个坐标就是下一个素数
    else
        disp('end');
        break;
    end
    disp(divNum);
    % disp 命令会增加耗时5%左右
end
toc

运行结果

Elapsed time is 3.513769 seconds.

猜你喜欢

转载自blog.csdn.net/ljl86400/article/details/81284471