The code is as follows:
import numpy as np
unitvec_2 = np.empty((2, 2, 1))
unitvec_4 = np.empty((16, 16, 1))
swap23 = np.empty((16, 16))
unitvec_2[0] = np.array([[1],[0]])
unitvec_2[1] = np.array([[0],[1]])
for i in range (2):
for j in range (2):
for k in range (2):
for l in range (2):
unitvec_4[(i<<3) + (j<<2) + (k<<1) + l] = np.kron(unitvec_2[i],np.kron(unitvec_2[j],np.kron(unitvec_2[k],unitvec_2[l])))
print(i,j,k,l,unitvec_4[(i<<3) + (j<<2) + (k<<1) + l])
for i in range (2):
for j in range (2):
for k in range (2):
for l in range (2):
swap23 += np.dot(unitvec_4[(i<<3) + (j<<2) + (k<<1) + l], unitvec_4[(i<<3) + (k<<2) + (j<<1) + l].T)
print("swap23 ",swap23)
The expected value for swap23 is a permutation matrix with one 1 in every row and column and 0 at other places. And the above calculation doesn’t involve large numbers. However, sometimes it gives the right answer:
[[1.00e+000 5.43e-322 0.00e+000 5.43e-322 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 1.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 1.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 1.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 1.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 1.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 1.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
1.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 1.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 1.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 1.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 1.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 1.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 1.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
1.00e+000 0.00e+000]
[0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000 0.00e+000
0.00e+000 1.00e+000]]
, some times it gives awful answer:
swap23 [[1.00000000e+000 2.14642139e-314 0.00000000e+000 7.41098469e-323
4.94065646e-324 0.00000000e+000 3.11371153e+238 6.11257029e+228
1.17233372e+214 6.54498157e-087 3.33168246e-028 8.88237201e+247
1.27701512e+232 2.34840919e+251 1.27246553e+232 1.78743824e+161]
[2.63687074e+092 1.14484110e+243 2.40492367e-057 5.98181669e-154
2.11671204e+214 1.69337240e-152 5.35721093e+199 1.10153801e+155
6.13333360e+228 1.17233372e+214 4.78179675e+180 1.23542249e-259
1.89294634e+219 1.33856865e-152 1.90459150e+185 2.31459741e-152]
[8.70855369e+183 1.81450395e-152 1.01766142e-028 2.59455076e+161
1.00000000e+000 3.70644534e-081 9.17715252e+170 7.36102817e+223
1.47039297e+224 4.08279450e+155 7.22933768e+159 1.38692357e+219
6.65000323e-114 9.47836492e-076 3.23581072e+174 3.03426184e-086]
[1.19140408e+190 2.02812576e+174 3.19086831e+175 1.27581003e+232
3.27430266e-114 1.00000000e+000 2.31882009e-152 1.67792004e+243
1.82159989e+185 1.42853558e+248 1.71898006e+161 7.03540903e+199
1.27734650e-152 1.21697904e-152 7.26612806e+223 7.29489665e+175]
[2.50951934e+156 8.32100623e-072 1.08471795e+155 3.15470529e+180
5.77538073e+228 5.81922958e+252 8.18434960e-085 7.04101559e+199
1.47039297e+224 1.53331452e+228 1.17233372e+214 3.09011156e+169
4.90892366e+252 5.48471621e+241 6.01432367e+175 2.97258191e+222]
[1.27640997e-152 8.78422036e+247 8.76421391e+252 1.89122289e+219
7.87265942e+276 1.46294547e+195 3.81995955e+180 1.81596891e-152
4.52176622e+217 4.19334009e+228 2.45127715e+198 9.75020166e+199
9.23528171e+242 2.52960802e-258 4.47593816e-091 7.12931004e+159]
[2.61191759e+209 4.24819624e+180 5.98147394e-154 1.67687798e+243
2.31462827e-152 3.37248732e+063 1.00000000e+000 1.10285893e+155
1.05777503e-153 2.63420327e-085 1.96086546e+243 8.02236232e-095
2.08063594e-115 2.08707750e-115 5.98147463e-154 1.67687798e+243]
[2.31462827e-152 3.58251229e+246 6.11248948e+228 1.24003791e+180
1.41481375e+161 2.32159328e-152 2.21208738e+214 6.11208869e+228
1.71870555e+161 3.17095858e+180 1.18439477e-089 2.13780573e+161
1.81270012e-152 5.30482713e+180 9.18856866e+170 6.01334682e-154]
[1.69375695e+190 3.34374575e+020 2.35900702e+251 6.97302468e+252
3.94646018e+180 4.91459762e+252 2.11329293e+214 1.19133502e+190
1.00000000e+000 4.77295148e+180 3.17095857e+180 1.69375780e+190
1.38692357e+219 9.07688407e+223 2.20892684e+161 4.82410896e+228]
[6.01346953e-154 5.81241632e+180 9.76508605e+199 2.38954692e+180
3.17095857e+180 2.28746621e+199 1.01150409e+261 1.68794498e+219
1.46923330e+195 2.30908182e+251 1.99613098e+161 1.87673448e-152
2.04736806e+190 1.69375668e+190 1.17567371e+214 1.69593624e-152]
[1.67667305e+243 1.39232419e-258 1.57434280e+161 4.26137297e+257
6.19490021e+223 2.15094357e-314 5.21501744e-310 1.46923443e+195
9.75019399e+199 4.63965331e+199 1.45909028e-258 1.27734658e-152
1.11493677e+277 4.71236239e+257 1.65516235e-153 2.44047875e-152]
[3.47649048e+183 3.43515227e+228 9.77824555e+199 6.01334653e-154
1.45518165e-152 7.35310752e+223 6.12030389e+257 4.70102847e+180
1.17567369e+214 6.19062304e+223 6.51684233e+029 1.47142318e+195
2.60971984e+180 1.58350845e+203 1.27734658e-152 4.64334692e+199]
[4.76660077e+180 3.94814797e+180 1.81363727e-152 1.78488214e+161
1.26253237e-258 4.25109693e+228 1.81596891e-152 3.17095863e+180
2.00051298e+161 1.28036948e-152 1.09910079e+248 8.78418848e+247
4.70106415e+180 1.23542248e-259 2.59345432e+161 1.05894156e-153]
[4.96254305e+063 9.77824555e+199 6.01334653e-154 1.42689898e+248
7.20100767e+252 2.31594550e+251 8.54516092e+194 9.66297415e+141
6.80275364e+199 1.46923002e+195 3.01471758e+161 1.00000000e+000
1.17548053e+214 8.77445506e-153 3.61653706e+132 2.43194418e-152]
[1.75533829e+156 1.91084853e+214 5.99774802e+180 9.13611954e+242
6.98071306e+194 1.87650144e-152 3.17095868e+180 2.32067919e-152
1.27276404e+232 2.32158966e-152 4.56406683e+275 1.15312080e+214
2.34786568e+251 3.52337924e+246 8.79345187e+199 4.84760471e+111]
[7.35989720e+223 1.28625724e+248 5.03515679e+223 8.54516092e+194
1.47709045e+248 1.72965980e+156 4.59541050e-072 4.22055928e+275
1.13279022e-153 1.81786179e+185 1.17567372e+214 1.42737859e+228
2.67725852e-152 1.94533523e+227 1.91572875e+227 1.00000000e+000]]
What is the reason and how to avoid that?