import numpy as np
import matplotlib.pyplot as plt
A = np.array([[9, -1, 2],
[-2, 8, 4],
[1, 1, 8]], dtype=np.float64)
k_values = np.arange(1, 200)
k_values = k_values.astype(int)
norm_1_inf_values = []
norm_F_values = []
norm_2_values = []
for k in k_values:
A_k = np.linalg.matrix_power(A, k)
norm_1_inf = np.linalg.norm(A_k, ord=1)**(1/k)
norm_F = np.linalg.norm(A_k, ord='fro')**(1/k)
norm_2 = np.linalg.norm(A_k, ord=2)**(1/k)
norm_1_inf_values.append(norm_1_inf)
norm_F_values.append(norm_F)
norm_2_values.append(norm_2)
norm_1_inf_values = np.array(norm_1_inf_values) - 10
norm_F_values = np.array(norm_F_values) - 10
norm_2_values = np.array(norm_2_values) - 10
plt.plot(k_values, norm_1_inf_values, label=r'$\| \cdot \|_1 = \| \cdot \|_\infty$')
plt.plot(k_values, norm_F_values, label=r'$\| \cdot \|_F$')
plt.plot(k_values, norm_2_values, label=r'$\| \cdot \|_2$')
# set log-log
plt.xscale('log')
plt.yscale('log')
# remove x-ticks
# plt.xticks([])
plt.xlabel(r'$k$')
plt.ylabel(r'$\|A^k\|^{\frac{1}{k}} - \|A^\infty\|^{\frac{1}{\infty}}$')
plt.legend()
plt.savefig("Gelfand's formula.svg")
plt.show()