作者mp19990920 (郝渴连)
看板MATLAB
标题Re: [讨论] 一个简单的量子能量相关的程式
时间Sat Jun 15 18:46:09 2013
※ 引述《ReiFu21 (ReiFu)》之铭言:
: 三个正整数 m n k 从 1 1 1 开始
: 1^2+1^2+1^2=3 一种变化 即1 1 1
: 2^2+1^2+1^2=6 三种变化 即2 1 1 , 1 2 1 , 1 1 2
: 2^2+2^2+1^2=9 三种变化 即2 2 1 , 2 1 2 , 1 2 2
: 3^2+1^2+1^2=11 三种变化 即3 1 1 , 1 3 1 , 3 1 1
: 2^2+2^2+2^2=12 一种变化 即2 2 2
: 3^2+2^2+1^2=14 六种变化 即3 2 1 , 3 1 2 , 2 1 3 , 2 3 1 , 1 2 3 , 1 3 2
: 我希望求出矩阵d
: d= 3 1
: 6 3
: 9 3
: 11 3
: 12 1
: 14 6
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 182.233.195.125
: ※ 编辑: ReiFu21 来自: 182.233.195.125 (06/14 21:55)
: → mp19990920:3 2 2/3 3 3/2 2 3/2 3 3 这些要吗? 06/15 02
: → mp19990920:漏了一个 3 3 2 06/15 02
: → ReiFu21:不用 只是平方值一样大的都要加在一起 所以不只有1 3 6 06/15 10
: → mp19990920:.... 06/15 11
: → mp19990920:3 2 2, 2 3 2, 2 2 3/3 3 3/2 3 3, 3 2 3, 3 3 2 ... 06/15 11
: → mp19990920:更正如上所示 06/15 11
我的意思是如下程式出来後
base3 = dec2base(0:3^3-1, 3) - '0' + 1;
sumsqr = sort(sum(base3.^2, 2));
sumsqr_ele = unique(sumsqr);
d = [sumsqr_ele, histc(sumsqr, sumsqr_ele)];
= 3 1
6 3
9 3
11 3
12 1
14 6
17 3
19 3
22 3
27 1
3 2 2, 2 3 2, 2 2 3
3 3 3
2 3 3, 3 2 3, 3 3 2
3 3 1, 3 1 3, 1 3 3
这些为啥不考虑,
不然d不知道怎麽截
: → ReiFu21:希望可以算到指定的大小 像是3*(100^2)这麽大 但是细节诸 06/15 11
: → ReiFu21:如把所有排列可能都列出来就不用了 感谢 06/15 11
: 推 CBET:或是用暴力法把所有平方和算出来,再用unique并计算出现次数 06/15 13
C大, 教初学者用暴力法不太好吧!
p.s. 我的推文有表达的那麽不清楚吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.67.63.26
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 18:52)
1F:→ ReiFu21:是的 有要考虑 我希望可以键入一个值 像是100 如此100以内 06/15 18:54
2F:→ ReiFu21:的值像是你打的17,19,22,27程式都要跑出来 我还没看懂你的 06/15 18:55
3F:→ ReiFu21:程式 不过我想C大可能认为这种问题无法用逻辑来跑 只能用 06/15 18:56
4F:→ ReiFu21:暴力法来解 因为我也找不出解决这个问题的逻辑 感谢你的程 06/15 18:57
5F:→ ReiFu21:式 我晚上回家再钻研 06/15 18:57
6F:推 CBET:我指的暴力法就是m大的作法,看来我的表达也不清楚 XD 06/15 19:02
7F:推 ReiFu21:不过你漏掉了 4^2+1^2+1^2=18 可能逻辑上还是不对 06/15 19:02
若您的m, n, k 都要从 1~x 的话,
把刚刚的程式中3的部分换成x即可。
此处的3表示m,n,k是3个的意思
↓
baseX = dec2base(0:x^3-1, x) - '0' + 1;
sumsqr = sort(sum(baseX.^2, 2));
sumsqr_ele = unique(sumsqr);
d = [sumsqr_ele, histc(sumsqr, sumsqr_ele)];
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 19:09)
8F:→ CBET:不过m大的作法只能用在36以内,超过36还需要修改 06/15 19:03
是27吧?
请问您的36是如何来的?
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 19:10)
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 19:11)
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 19:15)
9F:推 CBET:我本来是指 m, n, k 只能到 36,但後来发现其实只能到 10 06/15 19:23
那您的10是怎麽得来的?
我的电脑上 sqrt(realmax/3) 大到 7.7410e+153
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 20:54)
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 20:57)
10F:推 CBET:因为 dec2base(10, 11) 会等於 'A' 06/15 21:28
11F:→ CBET:m大的作法也可用 bsxfun 实现,就不用使用字串 06/15 21:30
谢谢C大,
我没考虑到进制的表示,
if x >= 2 && x<=36
baseX = dec2base(0:x^3-1, x);
if x > 10
shiftChar = char(size(baseX));
iDigit = ismember(dec2base([0:35], 36), '0123456789');
shiftChar(iDigit) = '/';
shiftChar(~iDigit) = '6';
baseX = baseX - shiftChar + 1;
else
baseX = baseX - '/';
end
sumsqr = sort(sum(baseX.^2, 2));
sumsqr_ele = unique(sumsqr);
d = [sumsqr_ele, histc(sumsqr, sumsqr_ele)];
else
error(message('MATLAB:dec2base:SecondArg'));
end
以上的code可支援 x = 2~36
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 22:01)
以下的code 可支援正整数的x
num = [0:x^3-1].';
baseX = zeros(length(num), 3)
baseX(:, 1) = floor(num/x^2);
num = rem(num, x^2);
baseX(:, 2) = floor(num/x);
num = rem(num, x);
baseX(:, 3) = num;
sumsqr = sort(sum(baseX.^2, 2));
sumsqr_ele = unique(sumsqr);
d = [sumsqr_ele, histc(sumsqr, sumsqr_ele)];
※ 编辑: mp19990920 来自: 111.67.63.26 (06/15 22:28)
※ 编辑: mp19990920 来自: 111.67.58.177 (06/15 23:41)