Message Boards Message Boards

0
|
2969 Views
|
4 Replies
|
1 Total Likes
View groups...
Share
Share this post:

Generate matrices for various angular momentum values L & test their rank?

Posted 6 years ago

The attached notebook generates matrices for various angular momentum values L and tests their rank. It does fine from L=1 to 90, and then hangs at L=91. Why? I tried to "Halt" in the debugger to diagnose the problem, but nothing happened. Memory usage is not high.

On[Assert];
c = {1/3, 0, Sqrt[2/3], 0, 1/3};
bME[Lmp_, Lm_] := 
  Module[{J3 = Lmp[[1]], m3 = -Lmp[[2]], J2 = Lm[[1]], m2 = Lm[[2]], M = Lmp[[2]] - Lm[[2]]},
   If[Abs[M] > 2, 0, -(-1)^m3 (Sqrt[(2 J3 + 1) (2 J2 + 1)/6]) 
      ThreeJSymbol[{2, 0}, {J2, 0}, {J3, 0}] c[[M + 3]] ThreeJSymbol[{2, M}, Lm, {J3, m3}]]];
bMatrix[L_] := Module[{LM = Table[{L, m}, {m, -L, L}]}, Outer[bME, LM, LM, 1]];
bRank[L_] := MatrixRank[bMatrix[L]];

(Debug) In[6]:= ranks = Monitor[Table[Module[{rnk = bRank[L]}, Assert[rnk == 2 L]; rnk], {L, 1, 100}], {L}];  
(Debug) Out[6]= $Aborted

(Debug) In[7]:= bRank[91]
(Debug) Out[7]= $Aborted
Attachments:
POSTED BY: Till Rosenband
4 Replies
Posted 6 years ago

Further testing shows that changing the value of "/6" in Sqrt in the definition of bME (matrix elements) changes the maximum L where MatrixRank succeeds, even though this is just an overall scaling factor that doesn't affect the rank. I'm using MatrixRank to verify that there is a zero eigenvalue. Perhaps there is a different function for zero-eigenvalue testing that works for higher L?

POSTED BY: Till Rosenband

It appears to be hanging in some zero testing for candidate matrix pivots, after having gone through considerable intermediate swell in row reduction.

POSTED BY: Daniel Lichtblau

Remarkable.

I am not sure, but in your matrices terms containing square roots appear.

    In[33]:= Take[#, 10] & /@ Take[bMatrix[91], 3]

    Out[33]= {{91/555, 0, Sqrt[91/181]/555, 0, 0, 0, 0, 0, 0, 0}, {0, 88/555, 0, Sqrt[6/905]/37, 0, 0, 0, 0, 0, 0},
{Sqrt[91/181]/555, 0,15391/100455, 0, (2 Sqrt[537/5])/6697, 0, 0, 0, 0, 0}}

And this in case of n = 91 may give rise to rather lengthy (exact Integer Arithmetic) simplification procedures. Try it with machine precision reals:

While

bRank[91]

doesn't com back in a reasonable amount of time (you say it "hangs")

bRank[91.]

does. As well as

In[28]:= {#, bRank[#]} & /@ N[Range[88, 93]]

Out[28]= {{88., 176}, {89., 178}, {90., 180}, {91., 182}, {92.,184}, {93., 186}}

Furthermore it seems that the rank of bMatrix[ L ] is 2 L

In[32]:= {#, bRank[#]} & /@ Range[15]

Out[32]= {{1, 2}, {2, 4}, {3, 6}, {4, 8}, {5, 10}, {6, 12}, {7,14}, {8, 16}, {9, 18}, {10, 20}, {11, 22}, {12, 24}, {13, 26}, {14, 28}, {15, 30}}

Perhaps there is a proof for this?

POSTED BY: Hans Dolhaine
Posted 6 years ago

A proof that the bRank[L] == 2L may exist, but in the absence of that, I wanted to check specific values of L with exact arithmetic. Numerical approximations are a step down in rigor. The rank test is just a way to check that there is a zero eigenvalue (matrix size is a 2L+1 square). Maybe a different function than MatrixRank can do better? Thanks for the comment.

POSTED BY: Till Rosenband
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract