我试图编写代码来测试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