# Mathematica crashes with a simple For-loop

I am new to Mathematica, so I am sorry if this is a bit of a stupid question but I really am stumped.

I am trying to define a function in Mathematica that does a very specific thing, but for some reason Mathematica keeps crashing while testing it. After messing around a bit I have found where the problem lies: when trying to evaluate a simple For loop Mathematica keeps crashing (to the point where I have to force close it with Task Manager). See the image below:

vectorBasis is a function defined below. As you can see, Length[vectorBasis[perm]] is simply the number 3, so I really feel like the For-loop should print the numbers 1, 2, and 3. But this completely crashes Mathematica.

Can anyone explain to me why this happens and how I can avoid it? Thanks!

Edit: Someone asked for a copy paste-able code, so here it is:

perm = {2,3,4}
vectorBasis[perm]
Length[vectorBasis[perm]]
For[i = 1, i <= Length[vectorBasis[perm]], i++, Print[i]]

The reason that I hadn't included it is that for this to be evaluate-able you need the function vectorBasis, which relies on functions from the amplituhedronBoundaries package (paper). The definitions might be a bit convoluted, but they seem to work:

<<amplituhedronBoundaries

arrayToVec[array_, dimension_] := Module[{EmptyVec = ConstantArray[0, dimension]}, For[i = 1, i <= Length[array], i++, EmptyVec = placePart[EmptyVec, array[[i]] -> 1]]; EmptyVec]

vectorBasis[permutation_] := arrayToVec[#, Length[permutation]] & /@ hypBasis[topCell[Length[permutation], permK[permutation]]]

where hypBasis, topCell and permK are defined in the package I linked above.

• Please post a copy-pastable form of the code rather than an image. Feb 1, 2021 at 17:16
• Not directly related to the question, but learning Mathematica and using For loops are usually mutually exclusive undertakings ;) There are much better ways that you should learn. Feb 1, 2021 at 17:35
• Staples, can you, please, provide a code snippet to acquire & load the package these functions are dependent upon? It will make this question much better for future users & for those who wish to try to answer. Feb 1, 2021 at 23:31

The reason you end up in an infinite loop is that you are reusing i as iteration variable. After executing vectorBasis[perm], arrayToVec has set i to $$2$$. Therefore, every time the condition i <= Length[vectorBasis[perm]] is checked, i is reset to $$2$$, and the condition will always be satisfied. An easy fix would be to make i in arrayToVec a local variable, i.e.

arrayToVec[array_, dimension_] :=
Module[{EmptyVec = ConstantArray[0, dimension],i},
For[i = 1, i <= Length[array], i++,
EmptyVec = ReplacePart[EmptyVec, array[[i]] -> 1]];
EmptyVec
]

As @J.M. suggests, a Do loop would be a better fit for the job

arrayToVec[array_, dimension_] :=
Module[{EmptyVec = ConstantArray[0, dimension]},
Do[EmptyVec = ReplacePart[EmptyVec, array[[i]] -> 1], {i, Length[array]}]
EmptyVec
]

More compact versions without loops would be

arrayToVec[array_, dimension_] :=
ReplacePart[ConstantArray[0,dimension],#->1&/@array]

arrayToVec[array_, dimension_] :=
Sum[UnitVector[dimension,i],{i,array}]

Also, in case someone wants to reproduce this, the positroids package is required, which is bundled with the arXiv preprint 1212.6974 (this defines for example Global`permK[perm]).

• I would even go further and suggest that Do[] should replace For[] here. Feb 2, 2021 at 13:18