我試圖編寫代碼來測試n^2 + (n+1)^2
是否完美。由於我在編程方面沒有太多的經驗,所以我只能使用Matlab。 到目前爲止,這是我曾嘗試快速測試n^2 +(n + 1)^ 2是否完美的方法
function [ Liste ] = testSquare(N)
if exist('NumberTheory')
load NumberTheory.mat
else
MaxT = 0;
end
if MaxT > N
return
elseif MaxT > 0
L = 1 + MaxT;
else
L = 1;
end
n = (L:N)'; % Makes a list of numbers from L to N
m = n.^2 + (n+1).^2; % Makes a list of numbers on the form A^2+(A+1)^2
P = dec2hex(m); % Converts this list to hexadecimal
Length = length(dec2hex(P(N,:))); %F inds the maximum number of digits in the hexidecimal number
Modulo = ['0','1','4','9']'; % Only numbers ending on 0,1,4 or 9 can be perfect squares in hex
[d1,~] = ismember(P(:,Length),Modulo); % Finds all numbers that end on 0,1,4 or 9
m = m(d1); % Removes all numbers not ending on 0,1,4 or 9
n = n(d1); % -------------------||-----------------------
mm = sqrt(m); % Takes the square root of all the possible squares
A = (floor(mm + 0.5).^2 == m); % Tests wheter these are actually squares
lA = length(A(A>0)); % Finds the number of such numbers
MaxT = N;
save NumberTheory.mat MaxT;
if lA>0
m = m(A); % makes a list of all the square numbers
n = n(A); % finds the corresponding n values
mm = mm(A); % Finds the squareroot values of m
fid = fopen('Tallteori.txt','wt'); % Writes everything to a simple text.file
for ii = 1:lA
fprintf(fid,'%20d %20d %20d\t',n(ii),m(ii),mm(ii));
fprintf(fid,'\n');
end
fclose(fid);
end
end
這將寫有與對應的n值到文件的平方。現在我看到使用十六進制是一種在C++中找到完美正方形的快速方法,並試圖在matlab中使用它。不過,我不確定這是否是最好的方法。
由於十六進制轉換,上述代碼在m > 2^52
時發生故障。
是否有另一種方法/更快地將n^2 + (n+1)^2
上的所有完美正方形寫入從1到N的文本文件?
+1:我冒昧地將MATLAB代碼添加到您的答案中。 –
謝謝。我可以理解它,但我無法寫出它;) –
+1:非常好的解釋。很好的答案。 – Schorsch