您的位置:首页 > 其它

mathematica试除法解素数问题

2016-05-22 03:52 375 查看
素数问题

DivPrime[n_]:=
Block[
{primeset={2,3}},
For[k=4,k<=n,k++,

Block[{i,flag=True},
For[i=1,primeset[[i]]<=Sqrt[k]&&i<=Length[primeset],i++,

If[Mod[k,primeset[[i]]]==0,flag=False;Break[]]
];

If[flag,AppendTo[primeset,k]];
primeset

];
primeset

]

]

(*重要说明,while为当型循环,执行无穷多次,if为判断,只执行一次*)


试除法mathematica程序

(*程序员最忌讳用循环,效率太低了*)
DivPrime[n_] :=
Block[{primeset = {2}, i, j, flag},
If[n == 1, primeset = {}];
For[i = 3, i <= n, i++, flag = True;
For[j = 1, primeset[[j]] <= Sqrt[i] && j <= Length[primeset], j++,
If[Mod[i, primeset[[j]]] == 0, flag = False; Break[]]];
If[flag == True, AppendTo[primeset, i]]];
primeset]

(*第一次改进*)
DivPrime1[n_] := Block[{primeset = {2, 3}, i}, For[i = 4, i <= n, i++,
If[! MemberQ[Mod[i, primeset], 0], AppendTo[primeset, i]]];
primeset]

(*第二次改进,改进后速度大大提高,n取100000没几秒就出来了*)
DivPrime2[n_] :=
Fold[If[! MemberQ[Mod[#2, #1], 0], Append[#1, #2], #1] &, {2, 3},
Range[4, n]]

(*总结:能不用循环尽量不用循环,尽可能使用内置函数,多次用到的量要先存起来*)


对比matlab素数判断

function isp = primeornot(X)
isp = false(size(X));

if ~isempty(X)
X = X(:);
if ~isreal(X) || any(X < 0) || any(floor(X) ~= X) || ...
any(isinf(X))
error(message('MATLAB:isprime:InputNotPosInt'));
end

n = max(X);
if isinteger(X) || n <= flintmax(class(X))
if (isa(X,'uint64') || isa(X,'int64')) && n > flintmax
p = primes(2.^(nextpow2(n)/2));
else
p = primes(cast(sqrt(double(n)),class(X)));
end
for k = 1:numel(isp)
Xk = X(k);
isp(k) = (Xk>1) && all(rem(Xk, p(p<Xk)));
end
else
fm = flintmax(class(X));
p = primes(sqrt(fm));
for k = 1:numel(isp)
Xk = X(k);
isp(k) = (Xk<fm) && (Xk>1) && all(rem(Xk, p(p<Xk)));
end
end
end


更快的素数判断和素数求法等着同学们自己去探索了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: