Matlab 测试n^2+;(n+;1)^2是完美的正方形
我试图编写一个代码来测试Matlab 测试n^2+;(n+;1)^2是完美的正方形,matlab,performance,perfect-square,Matlab,Performance,Perfect Square,我试图编写一个代码来测试n^2+(n+1)^2是否是一个完美的。 由于我在编程方面没有太多经验,我只有Matlab可供使用。 到目前为止,这就是我所尝试的 function [ Liste ] = testSquare(N) if exist('NumberTheory') load NumberTheory.mat else MaxT = 0; end if MaxT > N
n^2+(n+1)^2
是否是一个完美的。
由于我在编程方面没有太多经验,我只有Matlab可供使用。
到目前为止,这就是我所尝试的
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的文本文件?
有一种更快的方法,甚至不需要测试。你需要一点初等数论来找到这个方法,但这里有:
如果n²+(n+1)²
是一个完美的正方形,这意味着存在一个m
,使得
m² = n² + (n+1)² = 2n² + 2n + 1
<=> 2m² = 4n² + 4n + 1 + 1
<=> 2m² = (2n+1)² + 1
<=> (2n+1)² - 2m² = -1
的
对应于编号1+√2
,将所有进一步的解乘以
a² - 2b² = 1
这是(1+√2)² = 3 + 2*√2
将其写成矩阵形式,可以得到x²-2y²=-1的所有解
|x_k| |3 4|^k |1|
|y_k| = |2 3| * |1|
所有xk
都必然是奇数,因此可以写成2*n+1
前几个解决方案(x,y)
是
(1,1), (7,5), (41,29), (239,169)
对应于(n,m)
您可以通过以下方式获得下一个(n,m)
解决方案对:
(n_(k+1), m_(k+1)) = (3*n_k + 2*m_k + 1, 4*n_k + 3*m_k + 2)
从(n\u 0,m\u 0)=(0,1)
开始
Quick Haskell代码,因为我不会讲MatLab:
Prelude> let next (n,m) = (3*n + 2*m + 1, 4*n + 3*m + 2) in take 20 $ iterate next (0,1)
[(0,1),(3,5),(20,29),(119,169),(696,985),(4059,5741),(23660,33461),(137903,195025)
,(803760,1136689),(4684659,6625109),(27304196,38613965),(159140519,225058681)
,(927538920,1311738121),(5406093003,7645370045),(31509019100,44560482149)
,(183648021599,259717522849),(1070379110496,1513744654945),(6238626641379,8822750406821)
,(36361380737780,51422757785981),(211929657785303,299713796309065)]
Prelude> map (\(n,m) -> (n^2 + (n+1)^2 - m^2)) it
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
按EitanT编辑:
下面是计算第一个N
数字的MATLAB代码:
res = zeros(1, N);
nm = [0, 1];
for k = 1:N
nm = nm * [3 4; 2 3] + [1, 2];
res(k) = nm(1);
end
生成的数组res
应包含满足完美平方条件的n
值。+1:我已冒昧地将MATLAB代码添加到您的答案中。谢谢。我能理解,但我不会写;)
(n_(k+1), m_(k+1)) = (3*n_k + 2*m_k + 1, 4*n_k + 3*m_k + 2)
Prelude> let next (n,m) = (3*n + 2*m + 1, 4*n + 3*m + 2) in take 20 $ iterate next (0,1)
[(0,1),(3,5),(20,29),(119,169),(696,985),(4059,5741),(23660,33461),(137903,195025)
,(803760,1136689),(4684659,6625109),(27304196,38613965),(159140519,225058681)
,(927538920,1311738121),(5406093003,7645370045),(31509019100,44560482149)
,(183648021599,259717522849),(1070379110496,1513744654945),(6238626641379,8822750406821)
,(36361380737780,51422757785981),(211929657785303,299713796309065)]
Prelude> map (\(n,m) -> (n^2 + (n+1)^2 - m^2)) it
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
res = zeros(1, N);
nm = [0, 1];
for k = 1:N
nm = nm * [3 4; 2 3] + [1, 2];
res(k) = nm(1);
end