Re: [討論] 一個簡單的量子能量相關的程式

看板MATLAB作者 (郝渴連)時間12年前 (2013/06/15 18:46), 編輯推噓4(407)
留言11則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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)

06/15 18:54, , 1F
是的 有要考慮 我希望可以鍵入一個值 像是100 如此100以內
06/15 18:54, 1F

06/15 18:55, , 2F
的值像是你打的17,19,22,27程式都要跑出來 我還沒看懂你的
06/15 18:55, 2F

06/15 18:56, , 3F
程式 不過我想C大可能認為這種問題無法用邏輯來跑 只能用
06/15 18:56, 3F

06/15 18:57, , 4F
暴力法來解 因為我也找不出解決這個問題的邏輯 感謝你的程
06/15 18:57, 4F

06/15 18:57, , 5F
式 我晚上回家再鑽研
06/15 18:57, 5F

06/15 19:02, , 6F
我指的暴力法就是m大的作法,看來我的表達也不清楚 XD
06/15 19:02, 6F

06/15 19:02, , 7F
不過你漏掉了 4^2+1^2+1^2=18 可能邏輯上還是不對
06/15 19:02, 7F
若您的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)

06/15 19:03, , 8F
不過m大的作法只能用在36以內,超過36還需要修改
06/15 19:03, 8F
是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)

06/15 19:23, , 9F
我本來是指 m, n, k 只能到 36,但後來發現其實只能到 10
06/15 19:23, 9F
那您的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)

06/15 21:28, , 10F
因為 dec2base(10, 11) 會等於 'A'
06/15 21:28, 10F

06/15 21:30, , 11F
m大的作法也可用 bsxfun 實現,就不用使用字串
06/15 21:30, 11F
謝謝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)
文章代碼(AID): #1Hl4NrXs (MATLAB)
文章代碼(AID): #1Hl4NrXs (MATLAB)