素數問題
divprime[n_]:=
block[
},for[k=4,k<=n,k++,
block[,
for[i=1,primeset[[i]]
<=sqrt[k]&&i<=length[primeset],i++,
if[mod[k,primeset[[i]]]==0,flag=false;break]
];primeset
];primeset]]
(*重要說明,while為當型迴圈,執行無窮多次,if為判斷,只執行一次*)
試除法mathematica程式
(*程式設計師最忌諱用迴圈,效率太低了*)
divprime[n_] :=
block[, 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]];
primeset]
(*第一次改進*)
divprime1[n_] := block[, i}, for[i = 4, i <= n, i++,
primeset]
(*第二次改進,改進後速度大大提高,n取100000沒幾秒就出來了*)
divprime2[n_] :=
range[4, n]]
(*總結:能不用迴圈盡量不用迴圈,盡可能使用內建函式,多次用到的量要先存起來*)
對比:matlab中primeornot程式
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'));
endn = 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)));
endfor k = 1:numel(isp)
xk = x(k);
isp(k) = (xk>1) && all(rem(xk, p(pend
else
fm = flintmax(class(x));
p = primes(sqrt(fm));
for k = 1:numel(isp)
xk = x(k);
isp(k) = (xk1) && all(rem(xk, p(pend
endend
zzu數學 實驗一泰勒級數
泰勒逼近 任意函式的泰勒逼近 n 10 定義逼近程度 f tan x 任給乙個函式 taylor f x0 n sum d f,d f,x x0 k x x0 k,定義泰勒展開函式 figures table taylor f,0,k plot 繪圖 animate f sin x 任給乙個函式 t...
zzu數學 實驗零入門測試
入門練習 版本一 animate clear d,a,t 清除變數 a graphics line 繪製兩根初始線段 l n r n 將兩線段n等分 t table 生成n個點對用於畫n條線段 d array f,n 定義陣列存放圖形 for i 1,i n i d i graphics line ...
數學 反素數問題
1060 最複雜的數 把乙個數的約數個數定義為該數的複雜程度,給出乙個n,求1 n中複雜程度最高的那個數。例如 12的約數為 1 2 3 4 6 12,共6個數,所以12的複雜程度是6。如果有多個數複雜度相等,輸出最小的。輸入第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 100 第2 t...