mathematica试除法解素数问题

来源:互联网 发布:淘宝水弹枪合法吗 编辑:程序博客网 时间:2024/06/06 10:46
  • 素数问题
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    endend

更快的素数判断和素数求法等着同学们自己去探索了。

0 0
原创粉丝点击