77 lines
2.1 KiB
Python
Executable File
77 lines
2.1 KiB
Python
Executable File
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
def flip(n, index):
|
|
return n ^ (1 << index)
|
|
|
|
def distance(i, j):
|
|
return bin(i ^ j).count('1')
|
|
|
|
def matrix_system_with_two_knowns(p, q, N):
|
|
S = 2 ** N
|
|
mat = np.zeros((S, S))
|
|
val = np.zeros(S)
|
|
for i in range(0, S):
|
|
if i == p:
|
|
mat[i][i] = 1.0
|
|
val[i] = 1.0
|
|
elif i == q:
|
|
mat[i][i] = 1.0
|
|
else:
|
|
mat[i][i] = -1.0
|
|
for j in range(0, N):
|
|
mat[i][flip(i,j)] = 1.0 / N
|
|
return (mat, val)
|
|
|
|
def main():
|
|
final_values = []
|
|
final_x = []
|
|
final_y = []
|
|
|
|
for N in range(11, 12):
|
|
print(N)
|
|
S = 2 ** N
|
|
distances = np.zeros((S, S))
|
|
for i in range(0, S):
|
|
for j in range(0, S):
|
|
distances[i][j] = distance(i,j)
|
|
|
|
# final_values = []
|
|
# final_basis = []
|
|
visited_distances = set()
|
|
for p in range(0, S):
|
|
for q in range(p + 1, S):
|
|
pq_distance = distances[p, q]
|
|
if pq_distance in visited_distances:
|
|
continue
|
|
visited_distances.add(pq_distance)
|
|
(mat, val) = matrix_system_with_two_knowns(p, q, N)
|
|
solution = np.linalg.inv(mat).dot(val)
|
|
for i in range(0, len(solution)):
|
|
final_x.append(distances[i, p] / N)
|
|
final_y.append(distances[i, q] / N)
|
|
final_values.append(solution[i])
|
|
|
|
# values = list(set(solution))
|
|
# values.sort()
|
|
# if len(values) <= 1:
|
|
# continue
|
|
# basis = [1.0 * i / (len(values) - 1) for i in range(len(values))]
|
|
|
|
# final_values.extend(values)
|
|
# final_basis.extend(basis)
|
|
|
|
# fig, ax = plt.subplots()
|
|
# ax.scatter(final_values, final_basis)
|
|
|
|
# print(np.linalg.lstsq((final_x, final_y), final_values))
|
|
|
|
fig = plt.figure()
|
|
ax = fig.add_subplot(projection='3d')
|
|
ax.scatter(final_x, final_y, final_values)
|
|
|
|
ax.grid(True)
|
|
plt.show()
|
|
|
|
if __name__ == "__main__":
|
|
main() |