diff --git a/assets/10_125-crop.png b/assets/10_125-crop.png new file mode 100644 index 0000000..11a033c Binary files /dev/null and b/assets/10_125-crop.png differ diff --git a/assets/10_125.png b/assets/10_125.png new file mode 100644 index 0000000..c836377 Binary files /dev/null and b/assets/10_125.png differ diff --git a/assets/optimizations-lattice-calls.jpg b/assets/optimizations-lattice-calls.jpg new file mode 100644 index 0000000..7122299 Binary files /dev/null and b/assets/optimizations-lattice-calls.jpg differ diff --git a/assets/splice-signs-problem.png b/assets/splice-signs-problem.png new file mode 100644 index 0000000..d63befc Binary files /dev/null and b/assets/splice-signs-problem.png differ diff --git a/assets/times-knots.json b/assets/times-knots.json new file mode 100644 index 0000000..c7664ea --- /dev/null +++ b/assets/times-knots.json @@ -0,0 +1,2978 @@ +[ + 0.01, + 0.02, + 0.03, + 0.03, + 0.06, + 0.06, + 0.06, + 0.06, + 0.09, + 0.08, + 0.13, + 0.07, + 0.09, + 0.13, + 0.2, + 0.16, + 0.16, + 0.22, + 0.16, + 0.18, + 0.18, + 0.19, + 0.16, + 0.24, + 0.2, + 0.2, + 0.22, + 0.24, + 0.23, + 0.24, + 0.26, + 0.24, + 0.11, + 0.11, + 0.12, + 0.15, + 0.15, + 0.26, + 0.28, + 0.32, + 0.26, + 0.22, + 0.35, + 0.29, + 0.32, + 0.33, + 0.27, + 0.31, + 0.34, + 0.43, + 0.25, + 0.42, + 0.26, + 0.39, + 0.37, + 0.37, + 0.44, + 0.5, + 0.45, + 0.44, + 0.37, + 0.54, + 0.35, + 0.48, + 0.39, + 0.64, + 0.41, + 0.47, + 0.4, + 0.26, + 0.34, + 0.39, + 0.41, + 0.43, + 0.56, + 0.29, + 0.36, + 0.38, + 0.3, + 0.17, + 0.26, + 0.22, + 0.34, + 0.13, + 0.26, + 0.36, + 0.32, + 0.55, + 0.51, + 0.41, + 0.5, + 0.47, + 0.47, + 0.55, + 0.64, + 0.42, + 0.99, + 0.65, + 0.58, + 0.57, + 0.44, + 0.88, + 1.06, + 0.48, + 0.77, + 0.78, + 0.63, + 0.69, + 0.75, + 0.54, + 0.79, + 0.55, + 0.77, + 0.65, + 0.61, + 1.05, + 0.53, + 0.48, + 0.57, + 0.57, + 0.6, + 0.9, + 0.75, + 0.85, + 0.85, + 0.87, + 0.74, + 0.95, + 0.66, + 0.77, + 0.64, + 0.89, + 0.65, + 0.5, + 0.89, + 0.75, + 0.64, + 0.76, + 0.66, + 0.94, + 1.05, + 0.99, + 0.85, + 1.01, + 0.6, + 0.62, + 0.52, + 0.55, + 0.62, + 0.76, + 0.63, + 0.66, + 0.97, + 1.03, + 0.66, + 0.89, + 1.01, + 0.49, + 0.76, + 0.42, + 0.58, + 0.71, + 1.09, + 1.77, + 0.95, + 0.58, + 0.75, + 0.77, + 0.68, + 0.78, + 0.82, + 0.87, + 1.25, + 0.65, + 0.63, + 0.77, + 0.67, + 1.09, + 1.38, + 0.91, + 0.84, + 0.68, + 0.93, + 0.89, + 0.78, + 0.53, + 0.84, + 0.6, + 0.8, + 1.15, + 0.76, + 0.74, + 0.89, + 0.76, + 0.75, + 1.27, + 1.65, + 1.21, + 0.94, + 1.05, + 0.74, + 0.92, + 1.1, + 1.6, + 1.06, + 1.15, + 1.2, + 0.34, + 0.28, + 0.37, + 0.39, + 0.57, + 0.34, + 0.39, + 0.59, + 0.73, + 0.56, + 0.73, + 0.59, + 0.59, + 0.52, + 0.3, + 0.32, + 1.07, + 0.31, + 1.42, + 0.5, + 0.52, + 1.01, + 0.76, + 1, + 1.13, + 0.68, + 0.85, + 0.6, + 1.34, + 0.46, + 0.66, + 0.72, + 0.65, + 0.56, + 0.91, + 0.37, + 0.54, + 0.55, + 1.22, + 0.89, + 1.02, + 2.05, + 2.83, + 2.74, + 1.75, + 1.98, + 2.01, + 1.85, + 1.93, + 1.69, + 1.78, + 1.78, + 1.52, + 0.96, + 2.58, + 2.2, + 1.81, + 2.02, + 1.86, + 2.46, + 2.06, + 1.18, + 2.13, + 1.43, + 2.88, + 4.58, + 4.57, + 1.6, + 2.02, + 1.77, + 2.37, + 1.81, + 1.82, + 1.35, + 1.34, + 1.65, + 2.22, + 1.25, + 1.72, + 1.98, + 1.47, + 1.67, + 1.73, + 1.76, + 1.74, + 1.63, + 1.27, + 2.16, + 2.46, + 2.23, + 1.81, + 1.96, + 1.7, + 1.5, + 1.93, + 1.52, + 1.54, + 1.64, + 1.3, + 0.68, + 1.86, + 1.99, + 1.56, + 1.82, + 1.4, + 1.04, + 2.19, + 1.89, + 1.97, + 1.97, + 2.51, + 1.52, + 1.61, + 1.48, + 1.79, + 1.27, + 3.22, + 1.23, + 1.42, + 3.03, + 1.74, + 1.74, + 1.78, + 1.67, + 1.51, + 1.17, + 1.59, + 1.44, + 1.58, + 1.24, + 1.11, + 1.39, + 1.87, + 1.29, + 3.09, + 1.58, + 2.34, + 1.6, + 1.39, + 2.13, + 2.83, + 1.67, + 1.97, + 1.35, + 1.46, + 1.81, + 1.12, + 1.18, + 1.49, + 1.74, + 1.16, + 1.22, + 1.45, + 1.32, + 1.61, + 1.9, + 1.87, + 1.62, + 1.72, + 1.07, + 2.14, + 2.12, + 1.4, + 2.17, + 2.36, + 2.13, + 3.3, + 2.11, + 1.9, + 1.55, + 1.88, + 2.58, + 1.67, + 1.41, + 1.43, + 1.44, + 1.79, + 1.27, + 1.74, + 1.43, + 0.95, + 1.65, + 1.33, + 1.97, + 0.87, + 1.1, + 2.22, + 1.44, + 2.13, + 2.04, + 2.03, + 2.21, + 1.61, + 2.58, + 1.01, + 2.42, + 2.15, + 1.75, + 1.81, + 1.6, + 2.61, + 1.33, + 2.01, + 1.49, + 1.99, + 1.19, + 0.83, + 1.7, + 1.66, + 1.78, + 2.73, + 3.99, + 2.61, + 1.85, + 1.02, + 1.03, + 1.28, + 1.03, + 1.1, + 0.56, + 0.72, + 0.79, + 0.75, + 1, + 0.89, + 0.92, + 1.4, + 2.18, + 0.7, + 1.39, + 1.04, + 1.14, + 1.21, + 1.03, + 1.04, + 0.6, + 2.01, + 1.26, + 1.08, + 0.8, + 1.52, + 0.65, + 0.84, + 0.91, + 1.17, + 0.75, + 0.66, + 0.92, + 1.11, + 1.18, + 0.74, + 0.9, + 1.7, + 1.38, + 1.01, + 1.41, + 1.74, + 1.17, + 1.13, + 0.95, + 1.06, + 0.77, + 0.89, + 0.94, + 0.92, + 0.67, + 0.76, + 2.04, + 2.13, + 1.42, + 0.68, + 2.11, + 1.18, + 3.21, + 0.89, + 0.69, + 1.57, + 1.19, + 1.27, + 2.76, + 1.04, + 0.79, + 0.51, + 0.68, + 1.19, + 1.12, + 0.56, + 0.41, + 1.43, + 1.21, + 2.15, + 2.55, + 2.79, + 4.36, + 4.52, + 1.53, + 1.62, + 1.97, + 1.51, + 2.1, + 1.83, + 1.57, + 1.44, + 1.93, + 1.69, + 1.51, + 2.46, + 1.83, + 1.62, + 1.78, + 1.51, + 2.08, + 1.72, + 1.83, + 2.82, + 2.03, + 2.23, + 1.74, + 1.54, + 1.71, + 1.47, + 2.44, + 1.61, + 1.87, + 2.48, + 1.75, + 2.26, + 3.91, + 3.82, + 3.07, + 3.65, + 1.63, + 2.35, + 1.88, + 2.29, + 2.17, + 1.63, + 2.29, + 2.71, + 1.4, + 3.17, + 2.45, + 3.4, + 3.07, + 2.61, + 2.43, + 1.57, + 0.72, + 1, + 1.68, + 0.93, + 1.62, + 1.28, + 1.02, + 2.07, + 1.59, + 1.78, + 1.53, + 1.91, + 1.73, + 1.72, + 1.56, + 2.04, + 1.6, + 1.44, + 1.63, + 2.53, + 1.67, + 1.87, + 2.16, + 1.45, + 1.83, + 3.55, + 0.69, + 0.69, + 0.82, + 0.66, + 0.77, + 0.7, + 0.64, + 0.68, + 0.68, + 0.51, + 0.51, + 0.98, + 1, + 1.07, + 1.26, + 2.5, + 2.08, + 2.05, + 1.83, + 1.81, + 1.82, + 1.35, + 0.75, + 0.98, + 1.06, + 0.63, + 0.84, + 0.95, + 0.79, + 0.66, + 0.68, + 0.56, + 0.86, + 0.95, + 0.34, + 2.75, + 1.71, + 2.73, + 2.14, + 2.31, + 3.25, + 2.33, + 3.51, + 2.53, + 2.43, + 2.92, + 2.39, + 1.9, + 1.58, + 2.27, + 1.75, + 1.67, + 1.97, + 1.63, + 1.65, + 3.57, + 2.25, + 4.8, + 1.88, + 3.79, + 1.92, + 4.17, + 2.71, + 1.61, + 3.41, + 3.28, + 2.87, + 3.89, + 3.78, + 2.88, + 4.4, + 3.42, + 1.71, + 2.87, + 2.51, + 3.24, + 1.64, + 3.67, + 2.18, + 1.84, + 3.86, + 2.14, + 3.12, + 2.45, + 3.93, + 2.27, + 1.88, + 3.39, + 2.37, + 1.98, + 3.23, + 2.35, + 1.82, + 1.63, + 2.18, + 2.71, + 1.59, + 1.18, + 1.79, + 1.61, + 1.53, + 2.06, + 1.65, + 2.66, + 2.3, + 1.73, + 1.8, + 3.08, + 2.3, + 3.95, + 1.78, + 2.28, + 2.58, + 1.98, + 2.18, + 1.8, + 2.98, + 2.24, + 4.04, + 1.21, + 3.68, + 1.25, + 2.11, + 1.29, + 1.76, + 1.48, + 1.93, + 1.66, + 1, + 1.52, + 4.51, + 1.98, + 2.11, + 2.11, + 1.29, + 1.93, + 1.43, + 1.25, + 1.75, + 1.52, + 1.44, + 1.77, + 1.49, + 2.57, + 1.12, + 2, + 2.68, + 2.28, + 1.12, + 2.22, + 2.62, + 2.84, + 3.5, + 2.72, + 4.28, + 1.4, + 3.66, + 3.33, + 0.84, + 1.71, + 3.39, + 1.34, + 2.73, + 2.32, + 2.11, + 1.12, + 2.16, + 2.05, + 2.08, + 1.3, + 1.22, + 0.62, + 1.28, + 0.96, + 0.64, + 1.17, + 1.86, + 1.75, + 1.07, + 1.69, + 2.23, + 1.88, + 1.74, + 1.05, + 0.99, + 3.45, + 2.12, + 1.33, + 1.12, + 1.15, + 1.5, + 1.42, + 1.16, + 1.48, + 1.14, + 1.22, + 1.8, + 2.31, + 1.19, + 1.53, + 1.88, + 1.8, + 1.84, + 0.83, + 1.49, + 0.64, + 1.64, + 1.39, + 2.28, + 1.01, + 2.78, + 2.36, + 3.45, + 1.34, + 0.55, + 0.52, + 1.44, + 2.9, + 2.72, + 1.25, + 9.38, + 7.87, + 5.57, + 7.95, + 6.37, + 7.18, + 7.61, + 6.69, + 4.12, + 9.88, + 6.26, + 5.52, + 7.74, + 8.07, + 7.09, + 7.29, + 8.89, + 6.62, + 7.02, + 7.65, + 6.55, + 6.08, + 7.61, + 5.13, + 5.45, + 4.47, + 5.14, + 3.93, + 6.75, + 5.79, + 4.21, + 4.62, + 3.94, + 3.11, + 4.17, + 3.51, + 2.83, + 1.76, + 6.35, + 6.45, + 6.28, + 3.38, + 5, + 7.7, + 6.42, + 4.73, + 4.61, + 5.69, + 5.57, + 4.57, + 4.97, + 2.86, + 4.2, + 3.87, + 2.93, + 2.03, + 4.58, + 4.56, + 5.45, + 6.81, + 4.94, + 2.23, + 9.73, + 4.32, + 4.5, + 5.16, + 7.3, + 5.71, + 8.88, + 8.27, + 6.51, + 4.59, + 6.71, + 9.54, + 6.62, + 5.66, + 7.3, + 3.35, + 5.77, + 6.38, + 4.96, + 4.26, + 4.74, + 5.64, + 2.84, + 3.74, + 4.16, + 6.98, + 3.8, + 4.92, + 5.28, + 5.85, + 3.09, + 3.29, + 5.42, + 2.4, + 2.49, + 4.14, + 4, + 6.14, + 5.64, + 4.16, + 3.4, + 3.33, + 3.97, + 3.02, + 5.09, + 4.94, + 4.59, + 3.57, + 4.28, + 2.72, + 3.84, + 4.01, + 5.14, + 3.03, + 4.48, + 2.53, + 3.63, + 4.36, + 2.24, + 2.5, + 5.13, + 3.75, + 4.87, + 4.72, + 3.91, + 2.64, + 4.06, + 3.25, + 4.56, + 4.78, + 6.28, + 5.6, + 4.17, + 9.73, + 5.85, + 4.46, + 6.25, + 4.17, + 4.65, + 3.47, + 3.22, + 2.5, + 2.91, + 2.72, + 1.84, + 4.46, + 6.57, + 4.22, + 5.46, + 1.9, + 1.82, + 6.6, + 6.4, + 2.45, + 3.58, + 2.48, + 2.29, + 3.05, + 1.69, + 4.06, + 3.45, + 3.53, + 2.53, + 3.18, + 1.91, + 1.32, + 1.01, + 5.22, + 5.95, + 3.72, + 3.25, + 4.79, + 4.77, + 3.42, + 4.39, + 3.99, + 3.41, + 3.45, + 3.46, + 3.77, + 3.21, + 7.17, + 6.77, + 4.14, + 4.04, + 6.69, + 6.33, + 4.55, + 5.21, + 4.21, + 2.25, + 2.23, + 2.99, + 2.25, + 1.54, + 5.79, + 8.13, + 5, + 3.83, + 8.26, + 6.9, + 4.98, + 5.62, + 3.68, + 5.96, + 4.86, + 9.02, + 6.06, + 6.63, + 5.04, + 8.4, + 8.48, + 6.92, + 4.55, + 8.03, + 5.37, + 6.17, + 4.85, + 4.83, + 11.77, + 5.51, + 6.98, + 6.73, + 6.6, + 6.89, + 7.54, + 5.01, + 5.15, + 9.39, + 6.57, + 9.44, + 5.09, + 8.04, + 5.03, + 6.88, + 5.68, + 2.12, + 6.91, + 5.58, + 6.94, + 3.11, + 6, + 5.37, + 4.54, + 3.44, + 5.44, + 5.27, + 4.1, + 3.84, + 2.91, + 3.29, + 2.18, + 2.15, + 4.6, + 3.01, + 4.14, + 2.79, + 4.64, + 6.89, + 4.7, + 3.74, + 5.84, + 5.6, + 4.03, + 3.95, + 8.53, + 4.33, + 2.82, + 4.55, + 3.62, + 4.55, + 3.02, + 4.29, + 4.37, + 3.2, + 2.82, + 3.63, + 5.46, + 5.13, + 6.48, + 6.44, + 6.19, + 4.82, + 5.34, + 6.32, + 5.83, + 5.4, + 4, + 3.28, + 6.66, + 5.25, + 4.28, + 5.61, + 5.17, + 3.07, + 2.82, + 4.26, + 4.03, + 4.15, + 2.46, + 3.22, + 3.59, + 4.11, + 3.66, + 3.63, + 4.74, + 4.63, + 4.16, + 3.91, + 3.63, + 6.38, + 5.2, + 5.15, + 5.96, + 4.82, + 4.41, + 3.84, + 3.21, + 4.17, + 3.95, + 4.47, + 5.65, + 5.03, + 4.27, + 2.89, + 5.23, + 4.49, + 2.57, + 5.55, + 4.38, + 5.57, + 6.93, + 10.42, + 4.05, + 4.97, + 3.64, + 3.48, + 4.33, + 5.18, + 7.17, + 4.92, + 4.15, + 3.25, + 3.06, + 3.66, + 4.23, + 4.46, + 6.58, + 6.4, + 7.98, + 4.31, + 6.77, + 4.97, + 2.61, + 3.31, + 7.23, + 5.48, + 8, + 6.84, + 7.4, + 5.92, + 6.77, + 2.37, + 3.37, + 2.51, + 2.89, + 0.98, + 1.76, + 1.62, + 2.2, + 3.88, + 3.89, + 1.65, + 1.84, + 4.2, + 2.82, + 1.27, + 1.56, + 3.58, + 3.28, + 3.3, + 3.16, + 2.87, + 3.85, + 5.11, + 5.68, + 4.81, + 3.64, + 3.06, + 2.97, + 5.12, + 3.15, + 3.27, + 2.15, + 3.84, + 4.37, + 3.41, + 3.71, + 2.13, + 5.2, + 5.42, + 4.53, + 4.67, + 4.15, + 5.87, + 4.42, + 3.02, + 3.25, + 2.27, + 2.61, + 4.25, + 4.2, + 4.42, + 3.87, + 4.94, + 6.93, + 6.7, + 3.34, + 3.02, + 2.06, + 2.71, + 2.83, + 1.72, + 6.64, + 5.43, + 3.49, + 3.04, + 4.3, + 5.38, + 3.98, + 3.55, + 3.66, + 4.26, + 2.88, + 2.37, + 5.54, + 6.8, + 2.92, + 3.06, + 2.42, + 2.48, + 3.51, + 2.38, + 4.34, + 1.87, + 2.84, + 4.38, + 4.81, + 4.45, + 4.97, + 2.75, + 2, + 6.42, + 5.37, + 6.54, + 4.67, + 6.77, + 6.16, + 4.62, + 3.64, + 2.19, + 4.05, + 3.82, + 4.09, + 4.04, + 3.66, + 4.16, + 2.43, + 1.63, + 4.29, + 5.34, + 3.71, + 5.27, + 3.44, + 2.52, + 3.21, + 5.27, + 3.95, + 2.06, + 1.48, + 4.25, + 4.47, + 3.92, + 4.3, + 5.63, + 3.93, + 5.25, + 3.01, + 4.07, + 3.78, + 3.69, + 3.68, + 3.36, + 7.96, + 5.82, + 6.02, + 5.72, + 8.99, + 4.61, + 3.79, + 5.76, + 5.37, + 5.6, + 5.59, + 4.94, + 6.53, + 6.01, + 4.23, + 3.93, + 6.64, + 4.94, + 5.46, + 4.95, + 5.39, + 7.73, + 6.77, + 3.25, + 3.67, + 3.29, + 8.69, + 5.43, + 8.5, + 7.24, + 6.38, + 5.99, + 7.14, + 8.72, + 7.19, + 6.69, + 2.47, + 3.12, + 3.55, + 3.05, + 3.05, + 3.97, + 1.58, + 2.54, + 2.83, + 3.13, + 2.29, + 4.37, + 4.2, + 3.58, + 4.43, + 5.23, + 3.28, + 2.72, + 2.95, + 1.8, + 2.76, + 5.42, + 4.85, + 5.26, + 3.26, + 2.8, + 3.64, + 3.2, + 3.58, + 4.09, + 4.61, + 2.66, + 2.62, + 3.84, + 3.18, + 3.83, + 4.05, + 3.21, + 5.01, + 4.24, + 3.96, + 2.5, + 3.37, + 4.62, + 1.06, + 1.67, + 2.24, + 3.89, + 1.35, + 1.59, + 2.07, + 3.37, + 2.98, + 3.21, + 4.51, + 4, + 4.85, + 2.67, + 4.8, + 3.49, + 5.14, + 3.45, + 1.76, + 3.55, + 1.68, + 3.03, + 3.89, + 3.44, + 3.04, + 3.4, + 3.43, + 3.34, + 4.37, + 3.14, + 3.02, + 2.39, + 3.09, + 4.32, + 2.48, + 3.32, + 2.68, + 2.57, + 5.06, + 5.32, + 4.3, + 3.12, + 3.79, + 1.35, + 4.52, + 3.96, + 3.92, + 4.37, + 3.14, + 4.3, + 5.51, + 5.52, + 3.72, + 5.22, + 4.45, + 4.58, + 3.16, + 3.66, + 1.71, + 4.04, + 1.51, + 4.28, + 3.58, + 3.57, + 2.65, + 1.87, + 2.68, + 1.69, + 2.28, + 5.16, + 2.9, + 4.86, + 3.25, + 1.84, + 2.72, + 1.81, + 3.41, + 3.45, + 3.67, + 2.83, + 4.38, + 3.88, + 3.43, + 6.18, + 4.5, + 3.92, + 4.21, + 3.4, + 3.91, + 3.8, + 4.24, + 3.29, + 4.02, + 1.78, + 5.38, + 3.48, + 3.47, + 4.12, + 3.8, + 3.7, + 2.89, + 3.38, + 3.08, + 2.25, + 4.31, + 2.74, + 2.23, + 2.05, + 2.17, + 3.8, + 4.97, + 4.3, + 2.95, + 2.13, + 1.46, + 1.29, + 4.57, + 4.15, + 4.56, + 4.95, + 5.02, + 5.88, + 5.15, + 4.43, + 4.18, + 3.77, + 3.15, + 5.47, + 4.01, + 7.55, + 4.07, + 6.29, + 3.36, + 4.29, + 4.77, + 4.7, + 5.71, + 3.82, + 2.7, + 3.22, + 0.94, + 1.42, + 2.42, + 2.36, + 4.94, + 3.1, + 0.7, + 1.33, + 5.38, + 1.76, + 2.39, + 3.49, + 3.07, + 3.33, + 1.95, + 3.31, + 1.61, + 1.6, + 4.02, + 1.54, + 2.82, + 2.51, + 4.98, + 2.48, + 2.46, + 2.98, + 2.34, + 2.12, + 1.16, + 1.48, + 3.7, + 3.8, + 2.8, + 2.08, + 2.05, + 6.48, + 2.2, + 1.54, + 5.85, + 5.36, + 3.7, + 6.48, + 6.77, + 1.3, + 2.11, + 6.26, + 1.17, + 2.59, + 3.48, + 5.09, + 6.68, + 2.59, + 6.74, + 3.62, + 3.75, + 6.56, + 2.75, + 5.27, + 4.71, + 2.46, + 3.9, + 3.89, + 5.99, + 2.63, + 2.8, + 2.83, + 2.64, + 3.24, + 3.61, + 4.29, + 3.93, + 2.06, + 4.27, + 1.91, + 2.42, + 1.37, + 1.88, + 4.38, + 2.44, + 3.7, + 1.28, + 2.46, + 3.91, + 3.46, + 1.98, + 2.68, + 0.93, + 0.53, + 5.54, + 3.68, + 5.02, + 5.08, + 3.87, + 3.93, + 4.38, + 3.05, + 4.59, + 2.49, + 2.57, + 1.82, + 2.42, + 2.39, + 4.17, + 6.05, + 5.92, + 6.25, + 2.05, + 2.15, + 1.73, + 1.92, + 1.64, + 1.79, + 2.59, + 2.56, + 2.85, + 3.17, + 2.77, + 2.76, + 2.52, + 1.08, + 1.55, + 2.13, + 0.88, + 1.55, + 1.68, + 1.5, + 1.58, + 1.42, + 2.7, + 1.53, + 2.5, + 2.82, + 3.94, + 4.37, + 1.48, + 2.43, + 3.21, + 2.71, + 2.1, + 3.33, + 3.94, + 5.14, + 3.36, + 1.99, + 3.16, + 3.79, + 3.37, + 2.82, + 2.41, + 3.46, + 9.35, + 7.23, + 9.49, + 5.48, + 5.8, + 5.05, + 4.57, + 3.83, + 5.23, + 10.01, + 2.2, + 2.45, + 1.17, + 1.53, + 2.91, + 1.33, + 1.95, + 5.91, + 5.27, + 6.67, + 3.85, + 5.51, + 4.96, + 4.09, + 4.97, + 4.85, + 4.34, + 3.77, + 4.57, + 4.06, + 5.08, + 6.01, + 2.35, + 3.11, + 3.9, + 2.95, + 3.36, + 4.28, + 7.26, + 7.06, + 4.46, + 5.31, + 4.94, + 2.25, + 2.73, + 2.8, + 1.89, + 4.59, + 5.73, + 5.35, + 2.35, + 2.93, + 3.43, + 2.95, + 1.88, + 2.23, + 4.31, + 2.07, + 2.31, + 4.18, + 1.54, + 2.28, + 4.77, + 3.15, + 2.58, + 2.56, + 4.53, + 5.84, + 3.42, + 4.29, + 3.13, + 1.76, + 2.09, + 3.9, + 4.14, + 2.48, + 2.52, + 4.19, + 2.85, + 2.92, + 4.19, + 3.68, + 4.38, + 5.26, + 5.2, + 5.51, + 3.7, + 4.02, + 4.98, + 4.81, + 4.16, + 4.16, + 4.14, + 4.23, + 7.25, + 5.06, + 3.77, + 5.55, + 4.38, + 4.44, + 4.28, + 5.57, + 4.32, + 3.05, + 2.65, + 3.09, + 4.31, + 6.86, + 4.87, + 10.74, + 5.34, + 7.09, + 5.13, + 6.56, + 7.02, + 4.19, + 4.65, + 5.24, + 3.21, + 4.22, + 3.85, + 4.68, + 6.72, + 3.74, + 4.63, + 4.79, + 4.29, + 3.13, + 3.86, + 7.75, + 9.25, + 6.25, + 6.9, + 7.69, + 6.36, + 4.36, + 7.96, + 7.76, + 12.24, + 5.38, + 4.28, + 2.6, + 6.74, + 2.41, + 3.38, + 8.09, + 7.63, + 7.97, + 3.73, + 3.11, + 3.66, + 3.07, + 8.66, + 10.08, + 10.32, + 9.91, + 5.91, + 2.36, + 6.44, + 5.19, + 4.31, + 1.15, + 1.61, + 1.38, + 1.59, + 0.96, + 1.66, + 1.38, + 1.59, + 3.28, + 3.54, + 3.66, + 4.62, + 2.28, + 1.43, + 4.74, + 5.07, + 4.8, + 3.63, + 3.32, + 3.53, + 2.33, + 3.25, + 3.12, + 5.6, + 1.56, + 2.52, + 3.86, + 3.7, + 3.36, + 3.55, + 3.78, + 3.63, + 2.73, + 2.52, + 3.14, + 1.96, + 1.26, + 2.86, + 4.7, + 2.27, + 4.82, + 2, + 3.89, + 4.78, + 5.09, + 4.6, + 4.3, + 5.19, + 4.92, + 7.08, + 3.88, + 4.45, + 5.3, + 3.33, + 3.77, + 4.17, + 3.63, + 2.64, + 2.6, + 3.46, + 3.96, + 4.52, + 2.95, + 3.1, + 4.9, + 3.97, + 3.68, + 3.24, + 2.22, + 4.48, + 5.55, + 6.99, + 4.99, + 6.3, + 5.73, + 8.86, + 5.14, + 5.21, + 5.84, + 4.91, + 3.63, + 3.46, + 5.71, + 5.57, + 5.19, + 8.59, + 8.65, + 4.03, + 6.9, + 4.74, + 8.02, + 3.08, + 4.46, + 3.99, + 6.8, + 4.88, + 6.05, + 4.27, + 1.86, + 2.34, + 1.56, + 1.17, + 1.68, + 2, + 1.15, + 1.6, + 2.41, + 0.98, + 1.63, + 2.28, + 1.72, + 1.36, + 1.45, + 1.55, + 3.41, + 1.49, + 4.17, + 1.61, + 1.61, + 2.39, + 2.12, + 1.39, + 0.62, + 3.06, + 2.52, + 5.39, + 2.32, + 3.53, + 4.98, + 4.02, + 0.87, + 1.22, + 1.93, + 1.49, + 1.33, + 1.55, + 2.48, + 2.09, + 1.33, + 0.65, + 5.95, + 2.78, + 3.45, + 3.37, + 3.09, + 3.87, + 4.88, + 2.81, + 3.4, + 2.85, + 3.65, + 4.15, + 2.64, + 3.31, + 2.56, + 3.15, + 2.29, + 2.65, + 3.01, + 3.14, + 5.58, + 7.25, + 4.6, + 5.68, + 2.92, + 3.52, + 5.6, + 3.16, + 4.03, + 6.26, + 3.91, + 3.8, + 2.71, + 3.03, + 3.26, + 5.32, + 3.65, + 3.83, + 3.56, + 5.27, + 4.4, + 4.74, + 3.99, + 3.8, + 5.73, + 5.54, + 5.88, + 1.22, + 2.55, + 4.37, + 4.94, + 2.02, + 2.74, + 2.5, + 2.88, + 3.48, + 2.2, + 2.22, + 2.64, + 4.33, + 3.48, + 3.3, + 5.36, + 4.19, + 3.49, + 3.64, + 1.17, + 1.56, + 1.85, + 2.41, + 3.93, + 2.96, + 3.4, + 2.64, + 2.83, + 1.07, + 1.39, + 1.78, + 2.11, + 3.18, + 2.55, + 4.94, + 3.85, + 3.95, + 5.24, + 3.31, + 4.78, + 3.95, + 4.43, + 3.37, + 3.81, + 2.43, + 2.07, + 1.98, + 1.81, + 2.17, + 4.53, + 2.51, + 2.28, + 1.86, + 2.08, + 3.79, + 2.78, + 4.15, + 3.51, + 4.96, + 1.06, + 1.54, + 1.91, + 1.37, + 1.93, + 0.77, + 1.04, + 2.51, + 1.71, + 0.94, + 1.16, + 1.72, + 1.6, + 0.94, + 0.73, + 1.52, + 5.42, + 4.7, + 4.69, + 6.41, + 6.63, + 5.14, + 5.26, + 5.23, + 4.27, + 5.85, + 7.81, + 4.31, + 2.98, + 9.37, + 6.22, + 4.63, + 9.63, + 4.94, + 4.83, + 5.57, + 4.81, + 4.72, + 4.75, + 6.41, + 3.69, + 5.16, + 10.18, + 4.85, + 8.5, + 4.6, + 6.81, + 7.75, + 4.48, + 7.61, + 8.06, + 6.2, + 3.42, + 3.89, + 8.43, + 3.57, + 2.74, + 3.21, + 4.86, + 2.36, + 3.38, + 2.97, + 9.23, + 8.41, + 3.27, + 5.1, + 2.68, + 9.56, + 8.86, + 3.75, + 9.27, + 3.78, + 9.2, + 5.78, + 2.76, + 3.69, + 3.39, + 2.9, + 3.94, + 2.52, + 3.88, + 4.12, + 3.13, + 3.49, + 4.23, + 3.98, + 3.36, + 4.55, + 3.9, + 4.54, + 4.17, + 5.29, + 1.82, + 2.27, + 2.58, + 2.85, + 2.87, + 3.7, + 3.86, + 3.92, + 2.72, + 4.52, + 3.96, + 5.73, + 2.9, + 3.83, + 4.64, + 4.61, + 4.84, + 1.97, + 2.87, + 2.78, + 2.39, + 2.71, + 3.77, + 2.62, + 3.2, + 3.39, + 1.55, + 2.72, + 2.47, + 3.27, + 2.48, + 1.94, + 2.75, + 3.02, + 3.43, + 2.83, + 1.46, + 1.59, + 2.26, + 1.78, + 1.86, + 2.92, + 1.77, + 1.65, + 0.87, + 2.88, + 3.59, + 3.91, + 4.09, + 4.42, + 4.46, + 5.03, + 5.31, + 2.01, + 2.33, + 3.24, + 3.36, + 1.78, + 2.13, + 2.89, + 3.4, + 2.88, + 2.52, + 3.04, + 3.15, + 1.82, + 1.87, + 1.85, + 1.8, + 2.18, + 1.61, + 1.32, + 0.88, + 1.6, + 3.91, + 2.26, + 2.44, + 1.41, + 3.11, + 1.42, + 3.75, + 2.02, + 2.18, + 2.37, + 2.58, + 3.46, + 1.63, + 4.15, + 2.43, + 1.82, + 1.94, + 2.44, + 2.32, + 2.17, + 2.59, + 2.62, + 2.41, + 3.96, + 3.15, + 5.27, + 2.27, + 2.55, + 2.79, + 2.42, + 3.17, + 1.31, + 3.32, + 2.03, + 1.57, + 3.92, + 2.27, + 3.72, + 2.55, + 1.5, + 1.52, + 2.01, + 1.76, + 1.64, + 2.42, + 2.58, + 2.21, + 1.42, + 1.15, + 1.2, + 1.83, + 3.47, + 2.75, + 3.2, + 2.08, + 3.47, + 3.17, + 2, + 2.3, + 3.22, + 2.59, + 3.61, + 2.68, + 5, + 1.28, + 2.95, + 1.62, + 1.31, + 1.89, + 1.33, + 3.71, + 1.78, + 2.25, + 1.92, + 2.19, + 3.35, + 2.67, + 4.93, + 1.86, + 3.84, + 4.23, + 6.11, + 0.77, + 1, + 0.83, + 1.07, + 1.1, + 1.77, + 1.62, + 1.45, + 2.14, + 0.67, + 1.05, + 1.37, + 1.05, + 1.23, + 1.6, + 1.1, + 1.14, + 1.64, + 0.97, + 1.77, + 1.34, + 2.3, + 2.94, + 2.64, + 2.23, + 3.04, + 3.58, + 1.28, + 1.44, + 2.08, + 2.29, + 2.58, + 2.38, + 2, + 3.5, + 2.46, + 3.07, + 2.48, + 1.53, + 1.77, + 1.55, + 1.79, + 2.06, + 1.71, + 1.31, + 0.9, + 4.45, + 4.4, + 5.18, + 3.85, + 5.91, + 5.8, + 4.48, + 4.43, + 5.63, + 4.8, + 5.18, + 5.71, + 5.58, + 5.13, + 4.21, + 6.39, + 4.67, + 3.89, + 4.44, + 4.74, + 5.2, + 6.2, + 2.89, + 4.64, + 3.78, + 4.48, + 2.91, + 4.33, + 4.43, + 3.77, + 3.22, + 4.02, + 4.46, + 3.53, + 4.86, + 6.7, + 1.79, + 1.69, + 1.98, + 2.67, + 3.42, + 3.05, + 1.61, + 1.92, + 2.46, + 2.8, + 2.84, + 1.5, + 4.29, + 2.65, + 1.92, + 2.33, + 2.98, + 1.3, + 1.46, + 2.24, + 2.49, + 3.01, + 2.64, + 1.68, + 2.1, + 1.98, + 2.18, + 2.59, + 2.91, + 1.97, + 1.75, + 3.68, + 0.96, + 1.73, + 1.59, + 1.68, + 2.83, + 2.22, + 2.28, + 2.27, + 2.34, + 2.11, + 2.56, + 2.09, + 2.45, + 2.39, + 3.83, + 3.46, + 2.81, + 2.22, + 2.71, + 1.68, + 2.64, + 1.43, + 3.56, + 1.32, + 2.43, + 2.73, + 4.18, + 1.5, + 1.48, + 1.53, + 3.32, + 2.85, + 1.06, + 2.08, + 3.77, + 3.71, + 3.77, + 3.44, + 3.82, + 1.49, + 1.16, + 1.12, + 2.25, + 2.97, + 2.96, + 3.18, + 2.35, + 2.44, + 1.89, + 3.43, + 2.5, + 2.42, + 2.44, + 2.4, + 2.68, + 0.94, + 1.23, + 0.89, + 2.04, + 2.13, + 1.4, + 3.83, + 1.69, + 2.63, + 1.55, + 1.55, + 2.8, + 1.29, + 2.65, + 1.64, + 1.64, + 1.88, + 1.44, + 3.64, + 2.48, + 3.11, + 3.62, + 2.05, + 2.4, + 3.11, + 5.65, + 3.54, + 1.94, + 1.62, + 3.17, + 1.14, + 1.62, + 4.01, + 1.98, + 1.99, + 3.01, + 2.28, + 1.76, + 2.26, + 2.26, + 2.72, + 1.68, + 1.99, + 2.34, + 1.48, + 1.11, + 4.62, + 2.48, + 2.26, + 1.24, + 1.06, + 4.35, + 1.52, + 2.05, + 2.09, + 0.92, + 2.98, + 4.39, + 4.94, + 3.36, + 1.07, + 4.91, + 2.23, + 3.74, + 0.81, + 1.17, + 1.59, + 0.92, + 1.16, + 1.88, + 0.6, + 0.73, + 0.65, + 0.46, + 6.35, + 1.04, + 0.73, + 2.12, + 2.25, + 3.36, + 1.74, + 1.81, + 1.81, + 2.05, + 1.6, + 1.36, + 1.76, + 2.74, + 1.69, + 1.91, + 2.26, + 2.18, + 1.54, + 1.72, + 1.48, + 1.81, + 1.95, + 2.48, + 1.2, + 1.45, + 1.12, + 1.22, + 3.52, + 3.36, + 2.37, + 2.29, + 2.62, + 4.3, + 4.09, + 3.86, + 2.29, + 3.93, + 1.31, + 3.39, + 2.62, + 2.74, + 2.41, + 1.82, + 7.73, + 5.88, + 0.68, + 0.9, + 2.03, + 8.13, + 2.58, + 4.61, + 1.52, + 3.98, + 2.07, + 3.14, + 2.62, + 1.89, + 2.27, + 3.61, + 3.15, + 2.99, + 1.75, + 3.58, + 1.88, + 0.85, + 2.37, + 1.58, + 1.61, + 2.49, + 0.81, + 1.01, + 2.16, + 4.32, + 1.94, + 3.52, + 9.3, + 1.05, + 2.75, + 3.12, + 8.82, + 7.87, + 2.76, + 1.99, + 3.18, + 2.03, + 2.54, + 1.79, + 1.16, + 2.2, + 2.32, + 1.99, + 1.97, + 1.56, + 0.67, + 1, + 0.83, + 1.65, + 0.47, + 0.68, + 0.99, + 0.73, + 1.58, + 3.15, + 1.49, + 0.67, + 0.45, + 1.17, + 1.48, + 6.89, + 2.45, + 2.75, + 1.91, + 11.31, + 1.38, + 1.48, + 2.42, + 1.13, + 1.55, + 2.56, + 3.14, + 9.1, + 1.77, + 1.3, + 0.58, + 0.91, + 1.42, + 1.23, + 0.77, + 8.95, + 1.57, + 1.03, + 0.95, + 8.3, + 7.93, + 1.43, + 3.56, + 3.93, + 3.52, + 3.56, + 1.48, + 1.44, + 4.86, + 3.04, + 4.37, + 3.23, + 3.66, + 2.5, + 3.13, + 1.98, + 4.21, + 2.83, + 2.03, + 2.78, + 1.67, + 3.9, + 5.64, + 1.31, + 2.5, + 3.78, + 3.47, + 5.15, + 3.02, + 1.22, + 0.94, + 2.91, + 0.92, + 0.84, + 0.84, + 2.3, + 1.81, + 2.53, + 0.98, + 2.09, + 1.87, + 4.32, + 3.46, + 1.66, + 0.84, + 0.87, + 2.36, + 1.16, + 1.35, + 1.6, + 1.23, + 1.62, + 1.08, + 2.89, + 3.39, + 4.33, + 2.72, + 3.64, + 3.58, + 2.82, + 2.61, + 2.31, + 3.37, + 2.17, + 1.78, + 2.14, + 2.65, + 1.68, + 2.55, + 1.67, + 2.17, + 2.11, + 1.82, + 2.22, + 4.03, + 3.83, + 4.32, + 4.2, + 1.73, + 1.79, + 2.59, + 2.18, + 3.04, + 2.11, + 1.77, + 1.94, + 2.35, + 2.15, + 2.59, + 2.97, + 4.03, + 2.54, + 4.63, + 5.96, + 5.93, + 4.63, + 8.32, + 2.7, + 2.23, + 2.93, + 1.61, + 4.21, + 3.96, + 3.29, + 4.28, + 3.1, + 3.46, + 3.45, + 3.54, + 4.69, + 5.25, + 0.82, + 1.22, + 1.01, + 1.32, + 0.73, + 1.75, + 3.11, + 5.71, + 5.48, + 4.06, + 4.16, + 3.77, + 3.49, + 3.55, + 3.24, + 3.06, + 3.4, + 3.37, + 2.78, + 3.09, + 3.65, + 4.1, + 3.82, + 3.13, + 3.34, + 3.36, + 1.97, + 1.88, + 0.96, + 1.82, + 1.6, + 1.98, + 2.2, + 2.23, + 2.56, + 1.94, + 3.07, + 2.66, + 3.35, + 3.3, + 3.9, + 4.52, + 3.61, + 3.89, + 4.51, + 4.17, + 1.44, + 1.88, + 2.53, + 2.91, + 3.58, + 2.57, + 1.4, + 1.55, + 4.25, + 3.53, + 2.51, + 1.57, + 2.02, + 4.03, + 4.1, + 2.34, + 3.12, + 4.64, + 2.19, + 4.63, + 2.24, + 2.54, + 3.2, + 2.18, + 3.56, + 2.41, + 1.82, + 2.72, + 1.91, + 3.48, + 3.56, + 2.84, + 3.24, + 4.25, + 2.37, + 2.09, + 2.63, + 3.38, + 2.94, + 5.3, + 5.28, + 5.63, + 8.49, + 5.1, + 3.96, + 4.14, + 4.59, + 4.69, + 3.7, + 3.61, + 4.91, + 4.45, + 4.9, + 1.91, + 1.99, + 1.89, + 2.25, + 2.42, + 1.99, + 2.84, + 4.88, + 6.16, + 2.42, + 4.16, + 4.89, + 2.41, + 8.16, + 6.07, + 4.38, + 5.72, + 5.77, + 3.5, + 6.26, + 6.92, + 4.31, + 5.08, + 4.65, + 3.51, + 4.21, + 3.3, + 4.09, + 3.76, + 4.54, + 2.4, + 2.69, + 2.66, + 2.83, + 2.99, + 1.8, + 1, + 3.57, + 3.92, + 3.46, + 3.16, + 2.76, + 3.82, + 3.73, + 3.81, + 3.37, + 4.15, + 3.3, + 6.2, + 6.27, + 2.19, + 3.33, + 3.21, + 3.54, + 3.96, + 3.06, + 2.63, + 4.52, + 4.17, + 3.73, + 3.56, + 3.43, + 4.2, + 2.94, + 2.82, + 4.02, + 3.45, + 2.62, + 1.58 +] diff --git a/assets/times-links.json b/assets/times-links.json new file mode 100644 index 0000000..d7af182 --- /dev/null +++ b/assets/times-links.json @@ -0,0 +1,4189 @@ +[ + 0, + 0.02, + 0.02, + 0.04, + 0.04, + 0.05, + 0.05, + 0.06, + 0.06, + 0.04, + 0.06, + 0.1, + 0.08, + 0.07, + 0.07, + 0.08, + 0.06, + 0.1, + 0.07, + 0.08, + 0.06, + 0.06, + 0.05, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.07, + 0.04, + 0.06, + 0.08, + 0.11, + 0.06, + 0.06, + 0.14, + 0.12, + 0.15, + 0.13, + 0.04, + 0.04, + 0.06, + 0.08, + 0.2, + 0.19, + 0.19, + 0.17, + 0.15, + 0.16, + 0.16, + 0.16, + 0.12, + 0.12, + 0.07, + 0.1, + 0.19, + 0.17, + 0.15, + 0.16, + 0.13, + 0.12, + 0.17, + 0.17, + 0.18, + 0.16, + 0.13, + 0.12, + 0.13, + 0.15, + 0.07, + 0.09, + 0.27, + 0.23, + 0.26, + 0.2, + 0.21, + 0.21, + 0.22, + 0.21, + 0.26, + 0.15, + 0.33, + 0.2, + 0.24, + 0.16, + 0.24, + 0.17, + 0.19, + 0.38, + 0.19, + 0.34, + 0.18, + 0.18, + 0.26, + 0.27, + 0.35, + 0.36, + 0.36, + 0.37, + 0.35, + 0.36, + 0.35, + 0.35, + 0.1, + 0.09, + 0.16, + 0.14, + 0.25, + 0.25, + 0.24, + 0.21, + 0.26, + 0.25, + 0.32, + 0.28, + 0.33, + 0.31, + 0.3, + 0.32, + 0.25, + 0.24, + 0.26, + 0.27, + 0.38, + 0.35, + 0.41, + 0.34, + 0.43, + 0.32, + 0.47, + 0.32, + 0.37, + 0.32, + 0.34, + 0.28, + 0.24, + 0.2, + 0.24, + 0.17, + 0.32, + 0.3, + 0.26, + 0.27, + 0.34, + 0.32, + 0.3, + 0.3, + 0.36, + 0.43, + 0.38, + 0.38, + 0.26, + 0.32, + 0.26, + 0.28, + 0.3, + 0.31, + 0.33, + 0.38, + 0.28, + 0.32, + 0.25, + 0.24, + 0.27, + 0.26, + 0.17, + 0.19, + 0.26, + 0.25, + 0.25, + 0.26, + 0.21, + 0.16, + 0.11, + 0.14, + 0.4, + 0.41, + 0.37, + 0.39, + 0.35, + 0.33, + 0.3, + 0.31, + 0.45, + 0.45, + 0.39, + 0.38, + 0.37, + 0.32, + 0.22, + 0.22, + 0.29, + 0.29, + 0.34, + 0.34, + 0.29, + 0.31, + 0.3, + 0.27, + 0.42, + 0.4, + 0.32, + 0.35, + 0.29, + 0.29, + 0.32, + 0.33, + 0.36, + 0.35, + 0.18, + 0.18, + 0.2, + 0.21, + 0.19, + 0.2, + 0.21, + 0.2, + 0.26, + 0.23, + 0.22, + 0.21, + 0.29, + 0.3, + 0.9, + 0.76, + 0.74, + 0.68, + 0.76, + 0.63, + 0.69, + 0.66, + 0.57, + 0.5, + 0.56, + 0.52, + 0.41, + 0.55, + 0.37, + 0.52, + 0.6, + 0.26, + 0.72, + 0.4, + 0.45, + 0.3, + 0.4, + 0.31, + 0.5, + 0.36, + 0.52, + 0.33, + 0.56, + 0.28, + 0.59, + 0.37, + 0.5, + 0.78, + 0.45, + 0.71, + 0.34, + 0.32, + 0.34, + 0.35, + 0.54, + 0.53, + 0.34, + 0.35, + 0.35, + 0.36, + 0.41, + 0.41, + 0.52, + 0.53, + 0.53, + 0.51, + 0.54, + 0.56, + 0.55, + 0.52, + 0.15, + 0.16, + 0.28, + 0.27, + 0.17, + 0.17, + 0.11, + 0.12, + 0.24, + 0.21, + 0.22, + 0.2, + 0.16, + 0.17, + 0.26, + 0.27, + 0.31, + 0.3, + 0.3, + 0.29, + 0.25, + 0.23, + 0.28, + 0.28, + 0.14, + 0.15, + 0.13, + 0.13, + 0.28, + 0.28, + 0.27, + 0.32, + 0.27, + 0.27, + 0.2, + 0.2, + 0.21, + 0.21, + 0.89, + 0.8, + 0.72, + 0.63, + 0.54, + 0.72, + 0.51, + 0.49, + 0.6, + 0.51, + 0.62, + 0.55, + 0.56, + 0.52, + 0.49, + 0.57, + 0.5, + 0.43, + 0.41, + 0.49, + 0.62, + 0.59, + 0.65, + 0.53, + 0.62, + 0.63, + 0.67, + 0.64, + 0.62, + 0.65, + 0.54, + 0.53, + 0.23, + 0.17, + 0.5, + 0.53, + 0.95, + 0.86, + 0.65, + 0.68, + 0.57, + 0.53, + 0.82, + 0.84, + 0.88, + 0.91, + 0.82, + 0.98, + 0.64, + 0.65, + 0.78, + 0.78, + 0.72, + 0.71, + 0.58, + 0.59, + 0.83, + 0.91, + 0.66, + 0.56, + 0.91, + 0.96, + 0.71, + 0.7, + 0.76, + 0.66, + 0.48, + 0.56, + 0.69, + 0.62, + 0.7, + 0.65, + 0.5, + 0.58, + 0.68, + 0.68, + 0.98, + 1.05, + 1.04, + 1.04, + 0.61, + 0.74, + 0.69, + 0.72, + 0.64, + 0.68, + 0.61, + 0.57, + 0.53, + 0.48, + 0.51, + 0.53, + 0.6, + 0.63, + 0.42, + 0.47, + 0.45, + 0.59, + 0.49, + 0.46, + 0.59, + 0.67, + 0.65, + 0.58, + 0.37, + 0.68, + 0.65, + 0.61, + 0.66, + 0.65, + 0.8, + 0.58, + 0.63, + 0.49, + 0.39, + 0.44, + 0.41, + 0.44, + 0.66, + 0.65, + 0.87, + 0.9, + 0.32, + 0.32, + 0.5, + 0.49, + 0.45, + 0.47, + 0.3, + 0.38, + 0.21, + 0.24, + 0.64, + 0.62, + 0.52, + 0.44, + 0.68, + 0.66, + 0.55, + 0.55, + 0.95, + 0.98, + 0.69, + 0.64, + 0.62, + 0.63, + 0.9, + 0.91, + 0.93, + 0.89, + 0.8, + 0.79, + 0.99, + 0.95, + 0.55, + 0.58, + 0.58, + 0.68, + 0.58, + 0.59, + 0.49, + 0.44, + 0.49, + 0.48, + 0.43, + 0.41, + 0.65, + 0.64, + 0.44, + 0.43, + 0.69, + 0.71, + 0.8, + 0.85, + 0.72, + 0.74, + 0.95, + 0.93, + 0.75, + 0.77, + 0.57, + 0.64, + 0.62, + 0.58, + 0.44, + 0.53, + 0.83, + 0.84, + 0.59, + 0.64, + 0.6, + 0.6, + 0.81, + 0.75, + 0.61, + 0.6, + 0.63, + 0.62, + 0.53, + 0.53, + 0.48, + 0.51, + 0.66, + 0.71, + 0.79, + 0.78, + 0.94, + 0.93, + 0.77, + 0.76, + 1.01, + 0.9, + 0.44, + 0.41, + 0.42, + 0.43, + 0.52, + 0.59, + 0.65, + 0.68, + 0.35, + 0.38, + 0.48, + 0.58, + 0.76, + 0.78, + 0.53, + 0.56, + 0.4, + 0.38, + 0.48, + 0.49, + 0.54, + 0.52, + 0.54, + 0.51, + 0.58, + 0.58, + 0.56, + 0.52, + 0.43, + 0.44, + 0.53, + 0.73, + 0.47, + 0.45, + 0.83, + 0.89, + 0.61, + 0.61, + 2.33, + 1.37, + 2.48, + 1.42, + 2.35, + 1.38, + 0.89, + 1.27, + 1.27, + 1.27, + 0.88, + 0.88, + 0.59, + 0.33, + 0.46, + 0.47, + 0.53, + 0.57, + 0.36, + 0.3, + 0.2, + 0.17, + 0.53, + 0.53, + 0.32, + 0.3, + 0.56, + 0.57, + 1.39, + 1.05, + 1.21, + 1, + 1.41, + 1.13, + 1.17, + 0.86, + 1.35, + 1.16, + 1.43, + 1.06, + 1.22, + 0.97, + 1.1, + 0.96, + 0.77, + 0.64, + 0.68, + 0.62, + 0.74, + 0.99, + 0.74, + 0.98, + 1.18, + 0.65, + 1.27, + 0.76, + 1.1, + 0.72, + 1.14, + 0.81, + 1.19, + 0.58, + 1.28, + 0.68, + 1.13, + 0.63, + 1.21, + 0.67, + 0.87, + 0.59, + 0.92, + 0.59, + 0.81, + 0.57, + 0.97, + 0.67, + 1.12, + 0.86, + 1.18, + 0.79, + 0.72, + 1.35, + 0.84, + 1.55, + 0.87, + 1.43, + 1.11, + 1.63, + 0.69, + 0.86, + 0.67, + 0.9, + 0.63, + 0.66, + 0.57, + 0.58, + 0.86, + 0.86, + 0.63, + 0.57, + 0.78, + 0.65, + 0.8, + 0.63, + 0.7, + 0.72, + 0.72, + 0.62, + 0.77, + 0.39, + 0.9, + 0.51, + 0.96, + 0.52, + 1.39, + 0.65, + 0.82, + 0.63, + 1.11, + 0.56, + 0.7, + 0.41, + 1.15, + 0.5, + 1.32, + 0.95, + 1.38, + 0.97, + 1.16, + 1.74, + 1.18, + 1.8, + 0.94, + 1.14, + 0.6, + 1.17, + 0.58, + 0.62, + 0.76, + 0.76, + 0.57, + 0.59, + 0.61, + 0.6, + 0.58, + 0.56, + 0.59, + 0.57, + 0.58, + 0.57, + 0.78, + 0.75, + 0.74, + 0.8, + 0.69, + 0.65, + 0.68, + 0.72, + 0.73, + 0.75, + 0.75, + 0.71, + 0.98, + 0.94, + 0.97, + 0.97, + 1, + 1, + 0.67, + 0.81, + 0.68, + 0.81, + 0.76, + 0.89, + 0.78, + 0.89, + 1.05, + 0.63, + 1.26, + 0.79, + 1.15, + 0.75, + 1.15, + 0.76, + 0.99, + 0.7, + 0.97, + 0.66, + 1.28, + 1.05, + 0.91, + 0.72, + 1.24, + 1.69, + 0.79, + 1.21, + 1.51, + 0.72, + 1.67, + 0.79, + 1.1, + 1.32, + 1.11, + 1.39, + 0.8, + 0.82, + 0.74, + 0.85, + 1.18, + 1.28, + 1.28, + 1.26, + 1.36, + 1.46, + 1.69, + 1.69, + 1.16, + 1.18, + 1.26, + 1.21, + 1.25, + 1.22, + 2.09, + 2.14, + 1.93, + 1.29, + 2.13, + 1.91, + 1.93, + 1.77, + 2.28, + 1.97, + 1.75, + 1.77, + 1.85, + 1.36, + 1.32, + 1.32, + 1.36, + 1.39, + 1.15, + 1.13, + 1.37, + 1.49, + 1.14, + 1.07, + 1.33, + 1.45, + 1.8, + 1.28, + 2.07, + 1.44, + 2.07, + 1.25, + 2.05, + 1.26, + 1.72, + 1.19, + 1.91, + 1.31, + 1.84, + 1.23, + 1.92, + 1.17, + 1.59, + 1.41, + 1.67, + 1.42, + 1.54, + 1.25, + 1.56, + 1.23, + 1.08, + 1.36, + 1.13, + 1.44, + 1.13, + 1.45, + 1.11, + 1.55, + 1.15, + 1.56, + 1.1, + 1.46, + 1.07, + 1.38, + 1.01, + 1.39, + 0.4, + 0.39, + 0.67, + 0.56, + 0.56, + 0.48, + 0.34, + 0.33, + 0.64, + 0.64, + 0.5, + 0.47, + 0.32, + 0.29, + 0.56, + 0.56, + 0.38, + 0.37, + 0.33, + 0.3, + 0.6, + 0.54, + 0.53, + 0.54, + 0.44, + 0.4, + 1.09, + 0.69, + 0.76, + 0.75, + 0.66, + 0.68, + 0.45, + 0.49, + 0.86, + 0.82, + 0.35, + 0.31, + 0.47, + 0.49, + 0.53, + 0.53, + 0.55, + 0.55, + 0.49, + 0.55, + 0.77, + 0.43, + 1.24, + 1.21, + 0.46, + 1.19, + 1.09, + 1.11, + 1.16, + 1.17, + 1.36, + 1.3, + 0.71, + 0.7, + 0.3, + 0.04, + 0.89, + 0.51, + 0.45, + 0.33, + 0.29, + 0.22, + 0.64, + 0.68, + 0.52, + 0.53, + 0.48, + 0.5, + 0.46, + 0.39, + 0.47, + 0.46, + 0.31, + 0.33, + 0.5, + 0.5, + 0.41, + 0.42, + 0.49, + 0.49, + 0.28, + 0.27, + 0.28, + 0.24, + 0.5, + 0.48, + 0.51, + 0.55, + 0.63, + 0.64, + 0.3, + 0.36, + 0.78, + 0.78, + 0.4, + 0.38, + 0.62, + 0.67, + 0.52, + 0.53, + 0.34, + 0.36, + 0.28, + 0.27, + 0.47, + 0.48, + 0.64, + 0.64, + 2.65, + 1.28, + 2.31, + 1.02, + 2.32, + 1.21, + 2.41, + 1.12, + 2.35, + 1.14, + 1.11, + 1.31, + 1.01, + 0.82, + 1.82, + 1.61, + 1.43, + 1.29, + 1.29, + 1.33, + 1.06, + 1.01, + 1.25, + 1.07, + 1.03, + 0.87, + 1.22, + 0.99, + 1.07, + 1.01, + 1.12, + 1, + 0.95, + 0.88, + 1.25, + 0.94, + 1.33, + 1.05, + 1.23, + 0.89, + 1.56, + 1.21, + 1.25, + 1.01, + 1.42, + 1.15, + 0.85, + 0.47, + 1.2, + 0.79, + 1.1, + 0.9, + 1.04, + 1.02, + 0.97, + 1.13, + 0.97, + 1.03, + 1.04, + 0.85, + 1.16, + 1.42, + 1.45, + 0.98, + 0.88, + 0.86, + 0.69, + 1.48, + 1.59, + 0.8, + 0.97, + 0.83, + 1.56, + 1.65, + 1.04, + 1.74, + 1.97, + 2.02, + 1.03, + 0.95, + 1.85, + 1.65, + 1.1, + 0.91, + 1.69, + 0.88, + 1.35, + 1.36, + 1.64, + 1.64, + 0.91, + 0.91, + 1.11, + 1.18, + 0.72, + 0.71, + 0.36, + 0.03, + 0.63, + 0.62, + 1.01, + 1.07, + 1.09, + 1.11, + 1.08, + 1.08, + 0.9, + 0.9, + 1.28, + 1.21, + 0.5, + 0.53, + 0.54, + 0.6, + 1.03, + 1.03, + 1.08, + 1.17, + 0.94, + 1.01, + 1.15, + 1.11, + 1.48, + 1.15, + 1.76, + 1.41, + 0.81, + 0.58, + 0.83, + 0.6, + 1.07, + 1.2, + 1.31, + 1.45, + 0.7, + 0.84, + 0.97, + 0.9, + 1.56, + 1.41, + 1.63, + 1.3, + 1.77, + 1.26, + 1.85, + 1.32, + 1.21, + 0.96, + 1.21, + 0.99, + 0.98, + 0.64, + 1.1, + 0.8, + 1.05, + 0.97, + 1.19, + 1.03, + 1.31, + 1.46, + 1.45, + 1.42, + 1.77, + 1.9, + 1.62, + 1.74, + 1.98, + 1.68, + 1.99, + 1.52, + 1.46, + 1.58, + 1.39, + 1.58, + 0.61, + 0.63, + 0.68, + 0.68, + 1.01, + 0.94, + 0.88, + 1.03, + 0.78, + 0.61, + 1.17, + 0.86, + 1.55, + 2.22, + 1.54, + 1.42, + 1.88, + 1.7, + 1.6, + 2.36, + 1.45, + 1.37, + 2.37, + 1.51, + 0.76, + 1.4, + 0.84, + 0.71, + 1.83, + 2.12, + 1.63, + 0.68, + 2, + 2.35, + 1.63, + 1.78, + 2.01, + 1.25, + 0.87, + 0.68, + 1.29, + 1.13, + 0.33, + 0.93, + 1.3, + 1.06, + 1.15, + 1.03, + 1.26, + 1.06, + 1.19, + 1.07, + 2.3, + 1.69, + 2.2, + 1.78, + 2.18, + 1.53, + 1.88, + 1.61, + 1.53, + 1.53, + 1.24, + 1.62, + 1.44, + 1.5, + 1.2, + 1.32, + 1.61, + 1.35, + 1.33, + 1.35, + 1.41, + 1.4, + 1.27, + 1.31, + 2.49, + 1.64, + 2.56, + 1.74, + 2.39, + 1.42, + 2.54, + 1.43, + 2.05, + 1.48, + 2, + 1.37, + 1.86, + 1.06, + 1.85, + 1.32, + 1.53, + 2.25, + 1.89, + 2.51, + 1.77, + 1.7, + 1.58, + 1.53, + 1.93, + 2.09, + 2.22, + 2.16, + 2.13, + 1.76, + 0.91, + 1.46, + 1.22, + 1.83, + 1.66, + 2.26, + 1.23, + 1.81, + 1.58, + 1.88, + 0.92, + 1.29, + 1.16, + 1.72, + 0.79, + 1.3, + 0.93, + 1.36, + 1.87, + 1.87, + 2.15, + 2.17, + 2.05, + 2.05, + 1.29, + 1.34, + 1.01, + 1.01, + 1.61, + 1.85, + 0.87, + 0.99, + 1.59, + 1.57, + 1.04, + 1, + 1.28, + 2.12, + 2.09, + 2.05, + 3.02, + 3.18, + 2.87, + 2.01, + 1.96, + 2.64, + 2.14, + 1.17, + 0.86, + 1.6, + 2.06, + 1.15, + 2.52, + 2.14, + 2.41, + 2.71, + 1.66, + 1.6, + 1.36, + 1.2, + 0.97, + 0.94, + 1.93, + 1.89, + 1.89, + 1.85, + 1.72, + 1.77, + 1.35, + 1.57, + 1.73, + 1.71, + 1.54, + 1.72, + 1.29, + 1.32, + 1.69, + 1.69, + 1.48, + 1.5, + 1.55, + 1.56, + 1.42, + 1.29, + 1.75, + 1.69, + 1.64, + 1.57, + 1.36, + 1.46, + 0.81, + 0.91, + 1.64, + 1.65, + 1.23, + 1.4, + 1.5, + 1.85, + 1.86, + 1.85, + 1.25, + 1.27, + 0.98, + 0.92, + 1.35, + 1.31, + 2.12, + 1.86, + 2.13, + 2.2, + 1.21, + 1.2, + 2.07, + 2.26, + 1.92, + 2.32, + 1.15, + 1.13, + 0.86, + 0.86, + 0.96, + 1.05, + 1.38, + 1.51, + 1.28, + 1.43, + 1.37, + 1.34, + 1.02, + 1.17, + 1.27, + 1.28, + 1.62, + 1.47, + 1.5, + 1.58, + 0.94, + 1.04, + 1.07, + 1.02, + 1.23, + 1.2, + 1.47, + 1.45, + 0.85, + 0.93, + 0.98, + 0.91, + 1.1, + 1.11, + 2.31, + 2.2, + 0.85, + 0.97, + 1.36, + 1.35, + 1.44, + 1.43, + 1.35, + 1.32, + 1.1, + 1.06, + 1.22, + 1.31, + 1.12, + 1.13, + 0.89, + 0.87, + 0.91, + 0.77, + 1.26, + 1.37, + 1.34, + 1.28, + 1.47, + 1.7, + 1.34, + 1.38, + 1.47, + 1.45, + 1.28, + 1.3, + 0.96, + 0.9, + 1.08, + 1.27, + 1.27, + 1.37, + 0.91, + 0.99, + 1.47, + 1.54, + 1.16, + 1.17, + 1.08, + 1.03, + 0.81, + 0.88, + 1.27, + 1.24, + 1.06, + 1.19, + 1.13, + 1.11, + 0.83, + 0.9, + 1.19, + 1.21, + 0.81, + 0.79, + 1.3, + 1.72, + 2.72, + 2.82, + 1.32, + 1.27, + 1.08, + 2.2, + 1.44, + 2.46, + 1.28, + 1.36, + 1.12, + 1.14, + 2.62, + 1.86, + 0.74, + 1.95, + 0.79, + 1.93, + 0.65, + 0.63, + 0.8, + 0.68, + 2.03, + 0.82, + 0.54, + 0.55, + 1.91, + 1.74, + 2.04, + 1.05, + 1.06, + 1.02, + 0.75, + 0.82, + 0.67, + 0.72, + 0.75, + 0.75, + 0.71, + 0.65, + 1.23, + 1.21, + 0.84, + 0.94, + 0.89, + 0.86, + 0.88, + 1.07, + 0.83, + 0.87, + 0.75, + 0.78, + 0.85, + 0.83, + 0.64, + 0.57, + 0.81, + 0.86, + 1.08, + 1.08, + 0.87, + 0.86, + 0.62, + 0.71, + 0.84, + 0.77, + 0.52, + 0.56, + 0.39, + 0.36, + 2.02, + 2, + 1.87, + 1.94, + 1.31, + 1.61, + 1.29, + 1.3, + 1.29, + 1.52, + 1.5, + 1.42, + 1.67, + 1.68, + 1.37, + 1.21, + 1.39, + 1.34, + 1.35, + 1.32, + 2.06, + 1.92, + 1.32, + 1.41, + 1.19, + 1.25, + 1.38, + 1.36, + 1.2, + 1.25, + 1.33, + 1.33, + 1.08, + 1.09, + 1.83, + 1.86, + 1.22, + 1.68, + 2.06, + 2.09, + 2.05, + 1.93, + 1.32, + 1.57, + 1.99, + 1.94, + 1.1, + 1.1, + 1.3, + 1.24, + 1.38, + 1.41, + 1.25, + 1.26, + 1.6, + 1.53, + 1.29, + 1.29, + 1.28, + 0.93, + 1.41, + 1.45, + 1.24, + 1.16, + 1.07, + 1.03, + 1.21, + 1.26, + 1.79, + 1.88, + 1.71, + 1.68, + 1.48, + 1.63, + 1.41, + 1.37, + 1.66, + 1.8, + 1.23, + 1.18, + 1.09, + 1.06, + 1.2, + 1.22, + 1.07, + 1.07, + 1.49, + 1.5, + 1.77, + 1.8, + 1.65, + 1.54, + 1.52, + 1.53, + 1.8, + 1.79, + 1.9, + 1.84, + 1.51, + 1.56, + 1.43, + 1.35, + 1.71, + 2.09, + 1.64, + 1.69, + 1.36, + 1.33, + 1.85, + 1.71, + 1.27, + 1.4, + 1.74, + 1.69, + 1.81, + 1.62, + 1.62, + 1.42, + 0.88, + 0.89, + 1.01, + 1.08, + 0.7, + 0.72, + 1.28, + 1.23, + 0.92, + 1.02, + 1.29, + 1.28, + 1.38, + 1.42, + 1.41, + 1.36, + 1.18, + 1.08, + 1.23, + 1.18, + 0.93, + 0.81, + 2.33, + 1.14, + 2.29, + 1.13, + 1.05, + 1.15, + 0.92, + 0.8, + 2.06, + 2.26, + 2.82, + 1.51, + 3.06, + 1.57, + 1.9, + 3.3, + 2.79, + 2.59, + 1.16, + 1.52, + 1.27, + 1.51, + 2.82, + 2.96, + 2.6, + 2.52, + 1.36, + 1.3, + 1.56, + 1.63, + 1.97, + 0.91, + 1.06, + 1.07, + 1.22, + 1.47, + 1.03, + 0.99, + 0.65, + 0.59, + 1.55, + 1.83, + 1.4, + 1.41, + 1.17, + 1.24, + 2.62, + 2.65, + 1.78, + 1.84, + 1.61, + 1.58, + 1.9, + 1.93, + 2.09, + 2.03, + 1.43, + 1.78, + 2, + 2.03, + 1.58, + 1.58, + 1.37, + 1.45, + 1.47, + 1.58, + 1.42, + 1.47, + 2.07, + 1.9, + 1.04, + 1.03, + 1.36, + 1.37, + 1.27, + 1.39, + 0.99, + 0.97, + 0.95, + 0.85, + 2.08, + 2.07, + 2.49, + 2.47, + 2.39, + 2.42, + 2.4, + 1.89, + 1.85, + 1.69, + 0.88, + 0.91, + 2.05, + 1.97, + 1.56, + 1.54, + 1.34, + 1.34, + 1.45, + 1.5, + 1.16, + 1.02, + 0.75, + 0.78, + 1.2, + 1.35, + 1.3, + 1.31, + 1.24, + 1.21, + 1.59, + 1.59, + 1.5, + 1.48, + 1.32, + 1.3, + 2.59, + 2.65, + 2.05, + 1.99, + 0.64, + 0.74, + 0.76, + 0.89, + 0.9, + 0.87, + 1.08, + 1.03, + 1.21, + 1.21, + 1.09, + 1.08, + 1.66, + 1.95, + 1.47, + 1.63, + 1.26, + 1.28, + 0.64, + 0.69, + 1.22, + 1.21, + 0.96, + 0.93, + 0.48, + 0.59, + 0.9, + 0.98, + 0.84, + 0.93, + 0.87, + 0.82, + 1.58, + 1.55, + 1.46, + 1.39, + 1.76, + 1.78, + 1.37, + 1.32, + 1.43, + 1.5, + 1.38, + 1.36, + 1.32, + 1.28, + 1.16, + 1.14, + 1.35, + 1.37, + 1.15, + 1.17, + 1.71, + 1.64, + 1.67, + 1.56, + 2.01, + 2.01, + 1.3, + 1.38, + 1.12, + 1.14, + 1.42, + 1.35, + 1.7, + 1.61, + 1.69, + 1.69, + 1.65, + 1.72, + 1.46, + 1.39, + 0.7, + 0.71, + 1.27, + 1.28, + 0.72, + 0.8, + 0.57, + 0.72, + 1.31, + 1.31, + 1.12, + 1.24, + 1.46, + 1.48, + 1.52, + 1.54, + 0.82, + 0.93, + 1.43, + 1.43, + 1.58, + 1.58, + 0.88, + 0.95, + 1.26, + 1.25, + 1.18, + 1.17, + 1.11, + 1.13, + 1.64, + 1.63, + 1.14, + 1.21, + 1.36, + 1.37, + 1.81, + 3.23, + 1.02, + 0.94, + 1.08, + 0.99, + 1.08, + 1.21, + 1.61, + 1.7, + 2.77, + 1.31, + 1.71, + 1.72, + 0.85, + 0.84, + 0.89, + 0.86, + 1.32, + 1.39, + 1.08, + 0.88, + 1.16, + 1.14, + 2.71, + 3.18, + 1.56, + 3.01, + 2.74, + 1.27, + 3.11, + 1.34, + 1.5, + 1.63, + 3.19, + 1.31, + 3.47, + 1.85, + 3.53, + 3.68, + 1.07, + 1.09, + 2.87, + 1.47, + 1.21, + 1.16, + 1.21, + 1.18, + 4.78, + 2.52, + 4.64, + 1.85, + 4.36, + 2.46, + 4.03, + 2.22, + 4.96, + 2.29, + 4.57, + 2.12, + 4.56, + 2.19, + 2.55, + 2.5, + 1.95, + 1.55, + 1.55, + 1.52, + 2.02, + 2.03, + 2.09, + 2.11, + 1.63, + 1.57, + 1.28, + 1.26, + 0.9, + 1.04, + 1.25, + 1.23, + 1.22, + 1.26, + 1.22, + 1.15, + 1.57, + 1.57, + 0.44, + 0.45, + 0.66, + 0.66, + 0.69, + 0.71, + 0.8, + 0.8, + 0.51, + 0.59, + 0.61, + 0.6, + 0.78, + 0.74, + 0.52, + 0.5, + 0.91, + 0.89, + 1.08, + 1.13, + 1.36, + 1.43, + 0.54, + 0.57, + 0.7, + 0.67, + 1.71, + 1.64, + 0.72, + 0.61, + 1.01, + 0.95, + 0.95, + 0.93, + 0.86, + 0.85, + 0.72, + 0.73, + 1.44, + 1.44, + 1.18, + 1.17, + 1.51, + 1.52, + 1.16, + 0.97, + 0.97, + 0.99, + 1.13, + 1.16, + 2.92, + 2.35, + 2.56, + 2.01, + 3.79, + 2.71, + 3.09, + 2.1, + 3.58, + 2.55, + 3.19, + 1.91, + 2.96, + 1.97, + 2.43, + 1.53, + 2.15, + 2.19, + 2.6, + 2.16, + 2.3, + 2.2, + 2.34, + 2.06, + 2.68, + 2.3, + 2.35, + 1.83, + 2.62, + 2.28, + 2.4, + 1.99, + 2.27, + 1.91, + 2.3, + 1.87, + 2.55, + 2.05, + 2.4, + 1.97, + 2.22, + 1.92, + 2.36, + 1.99, + 2.08, + 1.77, + 2.12, + 1.76, + 1.32, + 1.19, + 1.35, + 1.11, + 2.1, + 2.37, + 2.14, + 2.53, + 1.48, + 2.19, + 1.47, + 2.03, + 2.06, + 2.66, + 2.02, + 2.67, + 1.93, + 2.15, + 1.94, + 2.21, + 2.73, + 1.6, + 4.16, + 2.96, + 2.51, + 1.62, + 3.87, + 2.72, + 4.02, + 2.26, + 3.62, + 1.82, + 3.44, + 1.73, + 3.64, + 1.9, + 2.52, + 1.12, + 2.76, + 1.34, + 2.07, + 1.55, + 1.88, + 1.39, + 2.57, + 1.59, + 2.46, + 1.39, + 3.32, + 2.31, + 4.68, + 1.64, + 4.82, + 1.89, + 4.79, + 1.61, + 2.29, + 1.2, + 2.19, + 1.17, + 3.15, + 1.49, + 6.68, + 2.59, + 4.31, + 1.79, + 4.67, + 3.91, + 1.97, + 3.39, + 2.13, + 1.77, + 3.88, + 3.38, + 2.62, + 1.98, + 3.86, + 2.91, + 2.37, + 1.49, + 1.17, + 1.03, + 1.62, + 0.95, + 1.44, + 1.04, + 1.64, + 1.06, + 2.06, + 1.15, + 2.07, + 1.58, + 2.27, + 1.78, + 1.95, + 1.37, + 2.92, + 1.95, + 3.64, + 2.53, + 3.32, + 2.1, + 3.42, + 2.39, + 2.86, + 1.95, + 3.95, + 3.07, + 2.7, + 1.86, + 1.7, + 1.39, + 2.02, + 1.69, + 2.44, + 1.73, + 3.39, + 5.11, + 1.79, + 3.77, + 1.73, + 3.11, + 1.74, + 3.12, + 2.81, + 4.41, + 2.45, + 3.98, + 1.73, + 2.99, + 2.3, + 3.51, + 1.57, + 2.05, + 1.55, + 1.74, + 1.76, + 1.23, + 1.76, + 1.35, + 1.45, + 1.94, + 1.43, + 1.88, + 1.33, + 1.81, + 1.31, + 1.52, + 1.69, + 1.69, + 1.75, + 1.76, + 2.88, + 2.81, + 2.41, + 2.48, + 2.52, + 2.55, + 2.29, + 2.28, + 1.49, + 1.52, + 1.51, + 1.46, + 2.15, + 1.7, + 2.06, + 1.78, + 1.74, + 1.89, + 1.88, + 1.76, + 1.67, + 0.75, + 2.57, + 1.22, + 2.22, + 0.96, + 2.69, + 1.36, + 1.26, + 0.83, + 1.3, + 0.75, + 1.7, + 1.13, + 1.56, + 0.96, + 1.97, + 1.28, + 1.88, + 1.02, + 2.29, + 1.12, + 2.77, + 1.47, + 1.76, + 1.22, + 1.74, + 1.08, + 1.63, + 1.09, + 1.85, + 1.15, + 1.7, + 0.88, + 1.95, + 1.12, + 2.16, + 1.07, + 2.43, + 1.35, + 1.85, + 1.28, + 2.14, + 1.3, + 1.67, + 1.02, + 1.47, + 0.94, + 1.89, + 0.88, + 1.86, + 1.09, + 2.02, + 1.2, + 2.16, + 1.31, + 2.52, + 1.3, + 2.7, + 1.5, + 1.71, + 1.08, + 1.47, + 1.02, + 1.95, + 1.2, + 1.92, + 1.14, + 2.75, + 1.58, + 2.74, + 1.51, + 1.51, + 3.09, + 1.55, + 3.11, + 1.38, + 2.81, + 1.56, + 3.19, + 1.95, + 3.03, + 2.43, + 3.52, + 1.63, + 2.31, + 2.13, + 2.59, + 1.38, + 2.79, + 2.13, + 3.4, + 1.73, + 2.03, + 1.52, + 1.97, + 1.7, + 1.69, + 1.65, + 1.73, + 1.67, + 1.83, + 1.36, + 1.35, + 1.7, + 1.76, + 1.69, + 1.6, + 1.1, + 1.11, + 1.52, + 1.42, + 0.99, + 1.09, + 1.05, + 1.17, + 1.19, + 1.2, + 1.06, + 1.14, + 1.68, + 1.68, + 1.59, + 1.59, + 1.78, + 1.86, + 1.89, + 2.04, + 2.28, + 2.3, + 1.79, + 1.81, + 1.14, + 1.18, + 2.08, + 2.18, + 1.33, + 1.35, + 1.75, + 1.85, + 1.18, + 1.32, + 1.45, + 1.43, + 1.95, + 1.87, + 2.06, + 2.01, + 0.94, + 0.88, + 1.37, + 1.3, + 1.1, + 1.06, + 3.19, + 1.12, + 1.71, + 1.38, + 1.94, + 1.85, + 1.54, + 1.52, + 3.95, + 1.78, + 1.11, + 1.22, + 1.31, + 3.17, + 3.77, + 1.12, + 1.23, + 1.08, + 4.34, + 2.13, + 4.32, + 2, + 1.69, + 1.42, + 2.15, + 4.62, + 4.14, + 3.94, + 1.26, + 3.62, + 2.2, + 1.86, + 1.9, + 4.02, + 2.41, + 2.12, + 1.38, + 1.45, + 1.8, + 1.9, + 3.76, + 1.87, + 1.44, + 1.52, + 1.45, + 1.7, + 1.48, + 1.41, + 2.44, + 2.4, + 1.04, + 1.33, + 2.36, + 2.19, + 1.55, + 1.65, + 2.02, + 2.19, + 1.56, + 1.66, + 2.13, + 2.25, + 2.19, + 2.27, + 1.25, + 1.35, + 2.13, + 2.13, + 1.24, + 1.24, + 1.13, + 1.09, + 1.21, + 1.2, + 1.23, + 1.3, + 1.59, + 1.63, + 1.35, + 1.29, + 1.69, + 1.62, + 1.01, + 0.86, + 1.09, + 1.33, + 1.68, + 1.67, + 1.86, + 1.89, + 4.55, + 3.48, + 3.74, + 2.53, + 4, + 3.01, + 3.46, + 2.48, + 3.3, + 3.7, + 2.17, + 2.71, + 3.03, + 3.65, + 1.87, + 2.55, + 2.12, + 2.26, + 2.07, + 2.24, + 2.29, + 2.99, + 2.3, + 2.85, + 1.8, + 2.19, + 1.7, + 2.25, + 1.53, + 1.84, + 1.87, + 2.18, + 2.29, + 2.01, + 2.29, + 1.97, + 1.87, + 1.44, + 1.98, + 1.4, + 2.63, + 1.98, + 2.24, + 1.68, + 2.97, + 1.72, + 2.68, + 1.52, + 2.07, + 1.53, + 2.12, + 1.48, + 2.29, + 1.56, + 2.24, + 1.63, + 2.38, + 1.56, + 2.41, + 1.52, + 3.88, + 2.47, + 4.07, + 2.51, + 4.5, + 2.05, + 4.59, + 2.03, + 2.05, + 1.4, + 2.39, + 1.79, + 3.31, + 2.2, + 2.53, + 1.7, + 2.44, + 3.5, + 2.9, + 3.83, + 2.11, + 3.64, + 1.88, + 3.65, + 2.37, + 4.59, + 2.34, + 4.39, + 1.98, + 3.64, + 1.84, + 3.76, + 3.16, + 3.93, + 2.42, + 2.93, + 3.46, + 1.46, + 3.32, + 1.57, + 3.78, + 1.9, + 3.96, + 2.14, + 3.42, + 1.61, + 3.13, + 1.65, + 3.09, + 1.77, + 3.05, + 1.78, + 2.35, + 2.89, + 2.07, + 2.57, + 2.31, + 2.14, + 2.33, + 2.22, + 3.62, + 4.1, + 3.71, + 4.44, + 3.22, + 3.25, + 3.56, + 3.57, + 3.36, + 3.66, + 3.3, + 3.91, + 2.55, + 2.77, + 2.86, + 3.01, + 1.56, + 2.07, + 1.84, + 2.2, + 1.89, + 1.92, + 1.89, + 1.52, + 2.58, + 2.53, + 2.72, + 2.61, + 2.86, + 3.03, + 3.81, + 3.93, + 1.89, + 1.93, + 1.98, + 2.19, + 1.76, + 1.95, + 1.26, + 2.03, + 1.99, + 2.06, + 2.28, + 2.19, + 1.96, + 2.04, + 2.35, + 2.42, + 2.37, + 2.46, + 2.57, + 2.4, + 2.84, + 2.95, + 3.26, + 3.22, + 2.47, + 2.54, + 2.94, + 5.05, + 2.27, + 2.13, + 2.62, + 2.54, + 2.88, + 2.98, + 3.51, + 3.46, + 3.11, + 2.68, + 3.17, + 3.33, + 4.88, + 5.53, + 5.07, + 2.28, + 5.61, + 5.51, + 3.53, + 3.39, + 6.2, + 6.47, + 6.56, + 7.22, + 2.72, + 2.58, + 2.76, + 2.29, + 5.07, + 2.06, + 5.46, + 3.32, + 2.58, + 2.59, + 3.02, + 2.32, + 3.15, + 2.4, + 3.99, + 3.07, + 3.37, + 1.63, + 3.37, + 1.64, + 3.5, + 2.65, + 3.84, + 2.8, + 3.23, + 1.6, + 3.21, + 1.6, + 3.43, + 3.83, + 3.27, + 3.55, + 2.28, + 2.78, + 2.28, + 2.77, + 2.99, + 2.35, + 3.19, + 2.54, + 3.64, + 2.74, + 3.91, + 3.06, + 3.7, + 3.02, + 3.75, + 3.06, + 3.75, + 2.94, + 3.66, + 2.64, + 1.88, + 2.43, + 2, + 2.54, + 1.79, + 2.46, + 1.92, + 2.53, + 2.27, + 2.17, + 2.35, + 2.82, + 2.19, + 2.6, + 1.87, + 2.07, + 0.82, + 0.82, + 1.33, + 1.36, + 1.03, + 1.19, + 1.01, + 1, + 1.6, + 1.54, + 1.28, + 1.4, + 0.88, + 0.89, + 1.62, + 1.62, + 1.28, + 1.22, + 0.64, + 0.61, + 1.16, + 1.28, + 0.72, + 1.01, + 0.46, + 0.46, + 1.02, + 1.04, + 0.76, + 0.6, + 0.79, + 0.78, + 1.17, + 1.11, + 1.2, + 1.29, + 0.46, + 0.47, + 0.92, + 0.93, + 0.89, + 0.86, + 0.99, + 0.96, + 1.69, + 1.75, + 1.92, + 1.86, + 1.59, + 1.58, + 0.54, + 0.52, + 0.93, + 1.01, + 0.92, + 0.83, + 0.54, + 0.53, + 1.17, + 1.24, + 0.84, + 0.63, + 1.13, + 1.18, + 1.68, + 1.75, + 1.4, + 1.73, + 1.87, + 1.91, + 1.3, + 1.15, + 1.65, + 1.68, + 0.96, + 0.91, + 1.61, + 1.62, + 0.85, + 0.92, + 1.62, + 1.58, + 0.59, + 0.64, + 1.08, + 1.08, + 0.35, + 0.34, + 0.73, + 0.67, + 0.61, + 0.66, + 0.51, + 0.53, + 1.08, + 1.09, + 0.79, + 0.76, + 1.11, + 1.14, + 1.33, + 1.5, + 1.21, + 1.2, + 1.05, + 1.1, + 1.45, + 1.51, + 1.54, + 1.62, + 1.25, + 1.24, + 1.47, + 1.52, + 1.67, + 1.65, + 1.38, + 1.17, + 1.31, + 1.4, + 1.33, + 1.32, + 1.35, + 1.35, + 1.31, + 1.56, + 1.11, + 1.25, + 1.02, + 1.06, + 1.67, + 1.69, + 1.41, + 1.39, + 1, + 1.13, + 1.23, + 1.14, + 1.04, + 1.03, + 1.04, + 1.08, + 1.23, + 1.33, + 0.89, + 0.96, + 1.02, + 0.96, + 1.17, + 1.11, + 1.81, + 1.64, + 1.38, + 1.45, + 0.91, + 0.98, + 0.78, + 0.74, + 0.72, + 0.79, + 1.18, + 1.08, + 0.76, + 0.72, + 1.09, + 1.1, + 1.21, + 1.25, + 1.23, + 1.26, + 1.36, + 1.35, + 0.88, + 0.98, + 1.63, + 1.64, + 1.42, + 1.4, + 1.25, + 1.28, + 0.85, + 0.93, + 0.93, + 0.73, + 0.63, + 0.69, + 1.27, + 1.29, + 1.18, + 1.24, + 1.05, + 1.06, + 1.02, + 0.96, + 0.76, + 0.88, + 1, + 1.02, + 1.04, + 0.97, + 0.74, + 0.74, + 1.26, + 1.02, + 0.98, + 1.05, + 1.42, + 1.3, + 1.46, + 1.65, + 1.41, + 1.23, + 1.55, + 1.56, + 1.33, + 1.35, + 0.87, + 0.89, + 1.55, + 1.46, + 1.33, + 1.33, + 1.28, + 1.27, + 1.37, + 1.38, + 0.9, + 1.01, + 0.96, + 0.94, + 1.59, + 1.68, + 1.55, + 1.35, + 1.49, + 1.49, + 1.02, + 1.01, + 1.2, + 1.18, + 0.91, + 0.94, + 1.01, + 1.03, + 1, + 1.01, + 1.49, + 1.33, + 1.16, + 1.16, + 0.85, + 0.78, + 0.9, + 1, + 1.13, + 0.99, + 1.11, + 1.14, + 0.55, + 0.49, + 0.49, + 0.46, + 0.7, + 0.71, + 1.23, + 1.24, + 0.88, + 0.87, + 0.54, + 0.53, + 1.32, + 1.31, + 0.72, + 0.86, + 0.46, + 0.48, + 0.39, + 0.38, + 0.72, + 0.72, + 1.15, + 1.17, + 0.95, + 0.91, + 0.37, + 0.57, + 1.34, + 1.38, + 0.73, + 0.82, + 0.84, + 0.82, + 0.55, + 0.55, + 1.17, + 1.17, + 1.42, + 1.4, + 1.57, + 1.34, + 0.69, + 0.79, + 1.72, + 1.94, + 1.23, + 1.23, + 0.97, + 1.14, + 1.48, + 1.48, + 0.77, + 0.75, + 1.25, + 1.25, + 1.29, + 1.28, + 0.99, + 1.02, + 0.89, + 0.92, + 1.22, + 1.16, + 1.29, + 1.3, + 1.63, + 1.63, + 1.29, + 0.99, + 1.23, + 1.24, + 1.05, + 1.09, + 1.09, + 1.15, + 1.01, + 0.98, + 0.95, + 0.82, + 1.1, + 1.14, + 1.15, + 1.06, + 1.25, + 1.23, + 0.98, + 1.01, + 0.72, + 0.72, + 1.31, + 1.43, + 1.12, + 1.13, + 1.82, + 1.76, + 1.33, + 1.35, + 1.46, + 1.52, + 2.37, + 2.34, + 1.67, + 1.69, + 0.98, + 1.14, + 1.36, + 1.4, + 1.01, + 1, + 1.34, + 1.33, + 1.07, + 1.1, + 1.14, + 1.12, + 1.42, + 0.97, + 1.12, + 1.19, + 1.17, + 1.19, + 1.23, + 1.21, + 1.02, + 0.86, + 2.11, + 2.08, + 0.99, + 1.25, + 4.24, + 1.35, + 0.93, + 1.05, + 1.09, + 1.21, + 1.28, + 1.28, + 1.2, + 1.22, + 1.32, + 1.15, + 1.78, + 1.8, + 0.8, + 0.8, + 0.73, + 0.71, + 1.12, + 1.08, + 1.14, + 0.88, + 0.57, + 0.69, + 0.92, + 0.88, + 3.86, + 4.06, + 0.98, + 0.98, + 1.06, + 1.39, + 1.14, + 1.19, + 1.31, + 4.72, + 0.99, + 0.91, + 1.33, + 1.03, + 1.22, + 1.22, + 1.62, + 1.93, + 0.85, + 1.02, + 0.75, + 0.59, + 0.44, + 0.55, + 1.59, + 1.28, + 1.6, + 5.38, + 4.84, + 0.82, + 0.97, + 0.93, + 0.78, + 0.82, + 4.81, + 4.9, + 1.12, + 1.15, + 0.57, + 4.76, + 1.02, + 4.79, + 1.11, + 0.9, + 0.58, + 0.61, + 1.08, + 1.32, + 1.05, + 0.94, + 0.71, + 0.78, + 4.71, + 1.45, + 3.97, + 0.87, + 1.04, + 1.24, + 1.02, + 1.15, + 6.32, + 2.54, + 4.42, + 2.6, + 6.36, + 2.57, + 5.51, + 2.13, + 5.15, + 1.98, + 4.57, + 2.29, + 2.05, + 1.49, + 2.5, + 2.31, + 2.21, + 2.61, + 1.64, + 2.15, + 1.48, + 1.44, + 2.39, + 2.84, + 2.28, + 1.57, + 1.21, + 1.24, + 0.95, + 0.93, + 0.83, + 0.82, + 0.47, + 0.51, + 3.87, + 3.67, + 2.71, + 2.66, + 2.79, + 2.34, + 2.04, + 1.98, + 3.04, + 2.6, + 2.22, + 1.83, + 3.99, + 3.83, + 2.84, + 2.64, + 3.04, + 3, + 1.97, + 1.86, + 3.01, + 2.82, + 2.28, + 2.22, + 3.38, + 3.18, + 2.24, + 2.21, + 2.97, + 2.44, + 2.49, + 1.83, + 3.01, + 2.02, + 1.92, + 1.31, + 2.6, + 1.99, + 2.41, + 1.51, + 3.52, + 3.23, + 2.91, + 2.51, + 2.59, + 3.11, + 2.24, + 2.08, + 2.78, + 2.19, + 2.47, + 1.78, + 3.02, + 2.82, + 2.68, + 2.18, + 2.56, + 2.57, + 1.74, + 1.67, + 2.03, + 1.72, + 1.85, + 1.61, + 2.9, + 2.65, + 2.54, + 2.3, + 2.67, + 2.63, + 1.81, + 1.83, + 1.92, + 1.84, + 2.02, + 1.7, + 2.51, + 2.43, + 2.53, + 2.39, + 2.38, + 2.37, + 2.72, + 2.53, + 2.99, + 2.7, + 2.14, + 1.88, + 2.35, + 2.04, + 1.77, + 1.56, + 2.48, + 1.63, + 1.68, + 1.21, + 2.47, + 1.21, + 2.09, + 0.96, + 3.12, + 2.89, + 3.16, + 2.85, + 1.18, + 2.42, + 2.72, + 2.36, + 3.03, + 1.12, + 2.77, + 1.13, + 1.36, + 2.49, + 1.36, + 2.17, + 1.45, + 1.57, + 1.5, + 1.61, + 2.33, + 2.08, + 1.96, + 1.69, + 2.27, + 1.8, + 2.07, + 1.57, + 2.61, + 2.18, + 2.74, + 2.16, + 2.78, + 2.5, + 2.46, + 2.07, + 2.74, + 2.13, + 2.7, + 1.98, + 3.05, + 2.36, + 3.11, + 2.55, + 3.39, + 3.14, + 2.51, + 2.36, + 2.9, + 2.36, + 2.66, + 2.18, + 3.74, + 3.16, + 3.73, + 3.13, + 3.01, + 2.64, + 2.62, + 2.24, + 3.37, + 3.1, + 3.66, + 3.32, + 2.47, + 2.52, + 2.34, + 2.35, + 2.68, + 2.5, + 3.14, + 3.08, + 4.21, + 3.31, + 3.66, + 2.74, + 3.2, + 2.43, + 3.07, + 2.26, + 1.81, + 0.85, + 3.66, + 2.74, + 3.17, + 2.58, + 2.78, + 2.14, + 2.72, + 2.33, + 1.9, + 1.49, + 2.45, + 1.96, + 2.39, + 1.91, + 2.54, + 1.93, + 2.26, + 1.77, + 1.96, + 1.67, + 2.4, + 1.96, + 2.41, + 2.18, + 2.43, + 2.2, + 3.46, + 3.14, + 2.82, + 2.52, + 2.68, + 2.29, + 2.62, + 2.35, + 2.03, + 1.3, + 3.16, + 2.86, + 3.64, + 2.86, + 3.73, + 3.09, + 2.77, + 2.35, + 3.29, + 2.77, + 4.12, + 3.12, + 4.49, + 3.37, + 3.29, + 2.52, + 4.08, + 3.25, + 2.13, + 1.8, + 2.95, + 2.13, + 2.63, + 2.08, + 2.71, + 1.89, + 1.74, + 0.91, + 1.97, + 1.26, + 2.52, + 2.55, + 2.32, + 1.95, + 3.09, + 2.34, + 1.81, + 2.11, + 5.99, + 3.82, + 1.72, + 2.56, + 2.78, + 2.2, + 2.28, + 1.62, + 2.42, + 2.57, + 1.65, + 2.04, + 2.78, + 4.97, + 2.65, + 1.84, + 2.7, + 1.94, + 2.09, + 1.49, + 2.4, + 2.29, + 2.05, + 2.11, + 2.72, + 0.82, + 2.25, + 1.81, + 5.76, + 5.84, + 2.25, + 2.28, + 1.72, + 1.65, + 1.84, + 1.84, + 2.42, + 2.1, + 2.6, + 2, + 1.89, + 1.57, + 1.66, + 6.49, + 1.55, + 1.59, + 6.29, + 1.67, + 6.83, + 1.5, + 6.01, + 1.68, + 6.86, + 2.53, + 7.24, + 2.23, + 1.93, + 2.09, + 2.64, + 2.32, + 6.85, + 2.08, + 2.72, + 6.03, + 2.66, + 3.12, + 3.09, + 2.42, + 1.34, + 0.48, + 1.15, + 0.04, + 3.85, + 3.52, + 2.41, + 2.42, + 3.39, + 3.34, + 1.39, + 1.37, + 3.34, + 3.36, + 2.61, + 1.79, + 1.15, + 3.13, + 1.8, + 1.48, + 1.91, + 1.91, + 2.86, + 2.36, + 3.17, + 3.3, + 2.71, + 2.69, + 2.28, + 1.96, + 2.31, + 2.25, + 2.8, + 2.5, + 2.7, + 2.76, + 2.04, + 1.85, + 1.4, + 1.05, + 3.21, + 2.46, + 3.6, + 2.77, + 2.42, + 2.01, + 2.94, + 2.54, + 2.5, + 1.91, + 3.2, + 2.64, + 2.27, + 1.03, + 2.22, + 1.05, + 3.15, + 2.42, + 2.29, + 1.72, + 3.06, + 2.13, + 3.25, + 2.25, + 2.51, + 1.58, + 3.1, + 2.33, + 2.78, + 2.76, + 3.54, + 3.56, + 2.71, + 2.65, + 2.53, + 2.62, + 1.48, + 1.34, + 1.09, + 1.01, + 2.06, + 2.09, + 2.4, + 2.31, + 2.07, + 2.12, + 2.51, + 2.64, + 1.98, + 2.01, + 2.59, + 2.72, + 3.11, + 2.92, + 2.58, + 2.69, + 2.62, + 2.66, + 2.62, + 2.66, + 2.39, + 2.43, + 3.2, + 3.33, + 1.9, + 1.54, + 1.09, + 1.15, + 2.54, + 2.41, + 2.38, + 2.4, + 1.89, + 1.9, + 2.61, + 2.57, + 1.85, + 1.89, + 1.51, + 1.47, + 0.37, + 0.38, + 2.41, + 2.5, + 2.18, + 2.18, + 2.05, + 2.02, + 2.16, + 2.19, + 2.9, + 2.97, + 1.07, + 0.81, + 1.19, + 0.96, + 2.46, + 2.38, + 2.91, + 3, + 2.89, + 2.85, + 3.17, + 3.19, + 2.65, + 2.45, + 2.31, + 2.23, + 2.36, + 2.54, + 2.32, + 2.32, + 3.25, + 3.31, + 2.76, + 2.83, + 2.56, + 2.59, + 2.61, + 2.61, + 1.77, + 1.72, + 0.72, + 0.72, + 2.34, + 2.3, + 2.53, + 2.47, + 1.53, + 1.62, + 0.71, + 0.69, + 0.54, + 0.79, + 1.11, + 1.25, + 2.24, + 2.47, + 2.95, + 1.81, + 1.62, + 1.18, + 0.48, + 0.7, + 0.91, + 0.9, + 0.63, + 0.58, + 2.57, + 2.53, + 2.84, + 2.88, + 1.87, + 2.87, + 0.85, + 0.91, + 2.03, + 2.01, + 2.32, + 2.35, + 2.12, + 2.12, + 2.29, + 2.22, + 2.34, + 2.39, + 2.72, + 2.77, + 0.63, + 1.21, + 1.51, + 1.5, + 2.27, + 2.15, + 3.21, + 3.28, + 1.26, + 1.35, + 1.21, + 1.23, + 2.33, + 2.3, + 2.93, + 2.85, + 1.76, + 1.86, + 1.41, + 0.85, + 2.47, + 2.51, + 3.16, + 3, + 2.54, + 2.57, + 2.57, + 2.66, + 2.33, + 2.41, + 3.42, + 3.39, + 2.53, + 2.61, + 2.75, + 2.93, + 2.1, + 2.18, + 2.73, + 2.61, + 2.11, + 2.05, + 2.75, + 2.69, + 1.58, + 1.6, + 0.79, + 0.81, + 1.89, + 1.76, + 2.05, + 2.01, + 2.11, + 2.07, + 0.98, + 0.57, + 0.39, + 0.43, + 1.38, + 1.71, + 1.95, + 1.82, + 2.19, + 2.06, + 2.35, + 2.6, + 2.12, + 2.23, + 1.04, + 0.96, + 2.01, + 2, + 2.45, + 2.56, + 2.04, + 2, + 0.51, + 0.87, + 2.01, + 1.8, + 1.67, + 1.8, + 2.05, + 2.09, + 0.95, + 0.93, + 1.12, + 1.09, + 2.2, + 2.24, + 2.64, + 2.75, + 2.29, + 2.37, + 2.86, + 2.7, + 4.96, + 4.63, + 3.25, + 3.06, + 4.29, + 4.1, + 2.37, + 2.05, + 4.2, + 3.82, + 3.23, + 2.73, + 4.23, + 3.4, + 1.63, + 1.16, + 2.71, + 2.19, + 2.85, + 2.59, + 3.67, + 3.54, + 3.28, + 3.01, + 2.52, + 2.73, + 3.26, + 3.55, + 2.07, + 1.67, + 2.14, + 1.78, + 1.55, + 1.73, + 2.22, + 2.79, + 1.56, + 1.55, + 1.86, + 2.05, + 1.87, + 1.6, + 2.18, + 1.83, + 1.44, + 0.98, + 1.14, + 1.31, + 3.11, + 2.96, + 3.29, + 3.28, + 2.3, + 3, + 2.78, + 3.55, + 2.62, + 2.53, + 2.47, + 1.66, + 2.85, + 2.58, + 2.83, + 2.61, + 1.76, + 1.22, + 2.52, + 2.01, + 2.17, + 1.39, + 2.93, + 2.4, + 2.23, + 2.23, + 2.42, + 2.39, + 1.82, + 1.59, + 1.78, + 1.57, + 3.65, + 6.4, + 2.47, + 1.47, + 2.29, + 2.01, + 3.33, + 2.78, + 4.01, + 2.03, + 2.3, + 1.28, + 3.23, + 2.33, + 3.16, + 1.92, + 2.28, + 3.22, + 2.23, + 6.93, + 3.16, + 3.01, + 3.87, + 3.65, + 4.5, + 4.89, + 9.01, + 4.08, + 4.7, + 2.98, + 4.02, + 2.12, + 8.78, + 4.12, + 4, + 3.56, + 3, + 1.95, + 2.97, + 1.41, + 4.32, + 3.73, + 4.04, + 3.27, + 4.28, + 2.14, + 3.75, + 2.11, + 3.03, + 3.6, + 2.59, + 3.38, + 2.84, + 8.46, + 3.62, + 3.21, + 4.05, + 8.93, + 9.23, + 3.31, + 9.74, + 8.55, + 4.07, + 8.46, + 2.87, + 2.14, + 2.81, + 2.34, + 2.61, + 0.6, + 1.58, + 0.71, + 2.08, + 3.06, + 6.82, + 7.37, + 2.99, + 2.81, + 2.12, + 3, + 4.93, + 4.49, + 4, + 3.37, + 4.23, + 3.69, + 4.65, + 4.01, + 1.66, + 1.81, + 0.92, + 0.88, + 1.73, + 1.45, + 1.31, + 1.65, + 4.75, + 4.13, + 3.8, + 3.39, + 4.21, + 3.23, + 4.37, + 3.98, + 3.31, + 3.2, + 3.63, + 3.42, + 3.82, + 3.83, + 4.59, + 4.3, + 3.81, + 3.18, + 4.79, + 4.23, + 1.64, + 1.63, + 2.12, + 1.9, + 3.74, + 3.73, + 4.45, + 4.06, + 3.96, + 3.45, + 4.9, + 3.97, + 2.03, + 2.4, + 3.22, + 3.1, + 2.39, + 2.26, + 2.11, + 1.93, + 2.88, + 2.99, + 3.48, + 3.23, + 3.2, + 3.31, + 3.55, + 3.66, + 4.07, + 4.15, + 2.87, + 4, + 3.72, + 3.47, + 3.21, + 4.28, + 3.58, + 3.58, + 2.87, + 3.41, + 3.43, + 3.18, + 3.09, + 3.25, + 4.84, + 4.99, + 5.58, + 5.67, + 5.52, + 5.59, + 4.43, + 4.59, + 3.64, + 3.28, + 3.7, + 3.19, + 4.65, + 3.36, + 4.91, + 3.4, + 2.21, + 2.02, + 2.32, + 2.55, + 2.69, + 2.39, + 2.53, + 2.61, + 5.96, + 3.49, + 6.62, + 4.41, + 5.36, + 3.17, + 6, + 3.89, + 4.94, + 2.92, + 5.31, + 3.66, + 3.86, + 1.95, + 3.82, + 2.56 +] diff --git a/main.pdf b/main.pdf index 2fbd852..9e56f5e 100644 Binary files a/main.pdf and b/main.pdf differ diff --git a/main.typ b/main.typ index 26a3860..98059f4 100644 --- a/main.typ +++ b/main.typ @@ -5,7 +5,6 @@ #import "@preview/cetz:0.3.4" - #let kL = $L$ #let dotss = $space dots.c space$ @@ -175,7 +174,7 @@ The defining axioms of the Kauffman polynomial are the following, given a link d We will later be seeing that the Kauffman polynomial can be defined in a more explicit way, using a recursive definition that is the one we will be using to derive our algorithm. -== Computational Knot Theory += Computational Knot Theory The first problem in computational knot theory is to find a good representation for knots and links. There are various common representations in the literature, such as: @@ -193,7 +192,7 @@ The first problem in computational knot theory is to find a good representation There are also other codes like *Braid representations* and *DT (Dowker-Thistlethwaite) Codes* we will not be using in this project. -=== PD codes +== PD codes The main source for the section is the article on #link("https://knotinfo.math.indiana.edu/descriptions/pd_notation.html")[PD notation from KnotInfo]. The PD code for a link is generated by labelling each arc of the link with a number. Then we choose a starting point for each component and process each component in order. @@ -286,7 +285,7 @@ Every directed crossing appears only once as an over-crossing so this algorithm `[(6,1,7,2), (8,3,5,4), (2,5,3,6), (4,7,1,8)]` } -=== SG Codes +== SG Codes Gauss originally developed a notation called *Gauss codes* based on labelling each crossing of a knot with a number and keeping track of when we walk an over-crossing or an under-crossing using a sign. This produces a list of numbers where each number appears exactly twice with different signs. This has a few problems like the fact that this doesn't distinguish a knot vs its mirror. @@ -316,7 +315,7 @@ Output: List> Converting one code to the other is not too much work as one just need to first do a labelling step to convert crossing labels and then convert the over/under-strand and left/right-handedness relations between the two notations. -=== Comparison of PD and SG codes +== Comparison of PD and SG codes We will now see how SG codes are better suited for the manipulations (switching and splicing) we need to do on a link. Indeed the #link("https://katlas.org/wiki/Setup")[KnotTheory Mathematica package] when computing the Kauffman polynomial converts the input link from *PD code* into *SG code* as this is better suited for doing manipulations directly on the crossings. @@ -344,7 +343,7 @@ Finally SG codes are also more "space efficient". Let $N$ be a number of bits to - PD codes use $approx 4n times N$ bits of information, four numbers for each item. -- SG codes use $approx 2n times (N + 2) + k times ceil(log_2(n))$ bits of information. Each crossing appears twice and we store its id and over/under and handedness information, we also need to store the structure of the list with $k times ceil(log_2(n))$ more bits. +- SG codes use $approx 2n times (N + 1.5) + k times ceil(log_2(n))$ bits of information. Each crossing appears twice and we store its id and over/under and handedness (each pair has the same handedness so we can store it only once per crossing) information, we also need to store the structure of the list with $k times ceil(log_2(n))$ more bits. So PD codes are simpler and compact to store (and generate from a diagram) but SG codes are more space efficient and easy to manipulate. @@ -586,11 +585,11 @@ So PD codes are simpler and compact to store (and generate from a diagram) but S #pagebreak() -=== Link reconstruction from code +== Link reconstruction from code We briefly mention that reconstructing a link from a PD or SG code is not trivial and there are various approaches used by various softwares that can be used for this task. -==== Linear Integer Programming +=== Linear Integer Programming For example the #link("https://doc.sagemath.org/html/en/reference/knots/sage/knots/link.html")[KnotTheory package in Sage] has a #link("https://doc.sagemath.org/html/en/reference/knots/sage/knots/link.html#sage.knots.link.Link.plot")[`Link.plot()`] method that thats a link that can be constructed using a PD code and then plots it as follows #[ @@ -615,13 +614,13 @@ For example the #link("https://doc.sagemath.org/html/en/reference/knots/sage/kno Sage internally uses a #link("https://github.com/sagemath/sage/blob/e0cf1e41d419feb9ddbc0e3c54823928a01587dc/src/sage/knots/link.py#L3639")[_mixed integer linear programming_ (MILP)] solver to generate a knot diagram from a PD code. Another library called #link("https://github.com/3-manifolds/Spherogram/blob/725086a1d8c5d1381ff6a70315047efd8e0dac3f/spherogram_src/links/orthogonal.py")[Spherogram] instead uses _network flows_. The problem here is to find an orthogonal presentation for the link with the _minimum number of left and right bends_ #footnote[#link("https://www.sciencedirect.com/science/article/pii/S0096300305002778")[A better heuristic for area-compaction of orthogonal representations]]. -==== Planar Graph Embeddings +=== Planar Graph Embeddings Another approach used by #link("https://knotfol.io/")[KnotFolio] is based on #link("https://en.wikipedia.org/wiki/Tutte_embedding")[Tutte embeddings]. A *Tutte embedding or barycentric embedding* of a simple, 3-vertex-connected, planar graph is a crossing-free straight-line embedding with the properties that the outer face is a convex polygon and that each interior vertex is at the average (or barycenter) of its neighbors' positions. This condition that every point is the average of its neighbors can be easily expressed as a system of linear equations where some points on a chosen outer face have been fixed. When the graph is planar and 3-vertex-connected the linear system is non degenerate and has a unique solution. -== Algorithm for computing the Kauffman Polynomial += Computing the Kauffman Polynomial Let's now recap the main formal algorithm for computing the Kauffman polynomial. @@ -650,6 +649,8 @@ Let's now recap the main formal algorithm for computing the Kauffman polynomial. ) ] +=== First Approach + Let now $K$ be an oriented link with $n$ components so $K = K_1 union dotss union K_n$. #definition[ @@ -669,7 +670,7 @@ Let now $K$ be an oriented link with $n$ components so $K = K_1 union dotss unio $ ] -*Algorithm.* Here follows the algorithm that computes $kL_(K)(a,z)$. +*Closed Form Algorithm.* Here follows the algorithm that computes $kL_(K)(a,z)$. 1. If $K = hat(K)$ is a _standard unknot_ then $kL_K (a, z) colon.eq a^w(K)$ @@ -708,13 +709,48 @@ Let now $K$ be an oriented link with $n$ components so $K = K_1 union dotss unio $ ] +=== Second Approach + +After a first implementation of the algorithm we noticed that it is not very efficient to compute using this closed form algorithm. In this case the naive implementation of the algorithm of just applying the rules recursively is more efficient and we only use the closed form for handling the base cases and the case of multiple components. + +The final algorithm we implemented is the following: + +*Algorithm*: We apply the following rules recursively + +1. If $K$ is a standard unlink then return $a^w(K)$. + +2. If $K$ has groups of components that overlap each other then we can apply the following rules, let $K = K_1 union.sq dotss union.sq K_n$ be these groups of components one overling the other and let $d = (a + a^(-1)) slash z - 1$ then + + $ + kL(K_1 union.sq dotss union.sq K_n) = d^(n-1) kL(K_1) dotss kL(K_n) + $ + +3. If $K$ is a linked component then we find $hat(K)$, the standard unlink for $K$, and pick the first available crossing $c$ to switch, then we have the following cases based on the crossing over/under type and handedness that can be reduced to the following two cases + + $ + kL(skein.over) = z (kL(skein.h) + kL(skein.v)) - kL(skein.under) + $ + + $ + kL(skein.under) = z (kL(skein.h) + kL(skein.v)) - kL(skein.over) + $ + + actually due to the symmetry of the Kauffman polynomial we can just use the same rule for both cases, so we can write + + $ + kL(K) = z (kL(E_c K) + kL(e_c K)) - kL(S_c K) + $ + + where $E_c K$ and $e_c K$ have one less crossing and $S_c K$ has the same crossings as $K$ but is one step closer to the standard unlink. + + #pagebreak() -== Python Implementation += Python Implementation The approach has been a mix of bottom-up and top-down. First we defined a couple of classed `SignedGaussCode` and `PDCode` to work with these codes and easily convert between each other. -=== SG Codes +== SG Codes We are now going to walk thorough the class that lets use work nicely with *SG codes*. The the classes we are going to use are all _frozen data-classes_ to ensure immutability and enforce a more functional programming style. @@ -725,39 +761,60 @@ We are now going to walk thorough the class that lets use work nicely with *SG c body } +// @dataclass(frozen=True) ```python -@dataclass(frozen=True) class SignedGaussCodeCrossing: id: int over_under: typing.Literal[+1, -1] handedness: typing.Literal[+1, -1] - def is_over(self) -> bool: ... - def is_under(self) -> bool: ... - def is_left(self) -> bool: ... - def is_right(self) -> bool: ... - def opposite(self) -> SignedGaussCodeCrossing: ... - def switch(self) -> SignedGaussCodeCrossing: ... - def flip_handedness(self) -> SignedGaussCodeCrossing: ... + def is_over(self) -> bool: + def is_under(self) -> bool: + def is_left(self) -> bool: + def is_right(self) -> bool: + def opposite(self) -> SGCodeCrossing: + def switch(self) -> SGCodeCrossing: + def flip_handedness(self) -> SGCodeCrossing: + ``` +// @dataclass(frozen=True) ```python -@dataclass(frozen=True) -class SignedGaussCode: +class SGCode: components: list[list[SignedGaussCodeCrossing]] - def writhe(self): ... - def reverse(self): ... - def mirror(self): ... - def to_std_unknot(self) -> SignedGaussCode: ... - def std_unknot_switching_sequence(self) -> list[int]: ... - def apply_switching_sequence(self, seq: list[int]) -> SignedGaussCode: ... - def splice_h(self, id: int): ... - def splice_v(self, id: int): ... - def switch_crossing(self, id: int): ... + # static methods + def from_tuples(self, components: list[list[tuple[int, int]]]) -> SignedGaussCode: + def from_pd(pd_code: PDCode) -> SGCode: + + def relabel(self) -> SGCode: + def to_minimal(self) -> SGCode: + + def writhe(self) -> int: + def crossings_count(self) -> int: + + def reverse(self, ids: list[int]): + def mirror(self): + + def overlies_decomposition(self) -> list[list[int]]: + + def std_unknot_switching_sequence(self) -> list[int]: + def apply_switching_sequence(self, seq: list[int]) -> SGCode: + def first_switch_to_std_unknot(self) -> (int | bool): + + def sublink(self, component_ids: list[int]) -> SGCode: + + def get_crossing_handedness(self, id: int) -> Sign: + def get_crossing_indices(self, id: int) -> list[tuple[int, int, SGCodeCrossing]]: + + def switch_crossing(self, id: int) -> SGCode: + def splice_h(self, id: int, orthogonal: Sign = +1) -> SGCode: + def splice_v(self, id: int) -> SGCode: ``` -==== Writhe +Let's now walk through the most important methods of this class. + +=== Writhe One of the first important things we need is to compute the *writhe* $w(K)$ of a link, this can easily be done with signed gauss codes as its a list of tuples where the second entry is the crossing sign. Let $L$ be an oriented link with components $C_1, ..., C_k$ each with crossings $c_(i, j)$ with $i = 1, ..., k$ and $j = 1, ..., |C_i|$. @@ -788,7 +845,7 @@ Let's notice that here each crossing appears twice, once as over-crossing and on ) ] -==== Standard Unknot +=== Standard Unknot The next building block for computing the Kauffman polynomial is detecting and computing the *standard unknot or unlink*. Formally this is done by taking the _planar shadow_ and a directed starting point on each component of the link. Then we can walk along the shadow of each component in order and make each crossing an over-crossing when passing on it on the first time. @@ -871,7 +928,20 @@ def apply_switching_sequence(self, seq: list[int]) -> SGCode: ]) ``` -==== Crossing Splices +In the actual Kauffman polynomial computation we just compute the first available crossing id in the sequence and apply just that one. + +```py +def first_switch_to_std_unknot(self) -> (int | bool): + visited_crossings: set[int] = set() + for component in self.components: + for crossing in component: + if crossing.id not in visited_crossings and crossing.is_under(): + return crossing.id + visited_crossings.add(crossing.id) + return False +``` + +=== Crossing Splices The splicing code is more involved due to the number of cases to analyze, let's first see formally what we need to do. @@ -934,11 +1004,42 @@ where $C_k = (c_k, s_k)$ as a pair of crossing *id* and *sign*. To apply the spl ) $ -Handling the reversed part is actually more involved than just reversing the list of crossings. We also need to correct all the signs of the crossings to account for the new orientation. To do this we need to flip the crossing sign of all crossing ids that occur in this part we are reversing. Notice this can end up even alter signs of crossings in other components so we need to be careful. The code that handles with reversing is the following +Handling the reversed part is actually more involved than just reversing the list of crossings. We also need to correct all the signs of the crossings to account for the new orientation as showed in @splice-signs-problem. + +#figure( + image("assets/splice-signs-problem.png", width: 80%), + caption: [Crossing signs problem after splice], +) -TODO: Code snippet -The code for the *vertical splices* is omitted as the cases are the same as for the horizontal splices with a minor change. All the cases for vertical splices are shown below in the following diagram and we can see that the output lists are the same as in the previous splice case just switched based on the crossing sign. +To do this we need to flip the crossing sign of all crossing ids that occur in this part we are reversing. Notice this can end up even alter signs of crossings in other components so we need to be careful. Let's see for example the code for the negative crossing horizontal splice case + +```py +over_crossing_ids = set(c.id for c in l2 if c.is_over()) +under_crossing_ids = set(c.id for c in l2 if c.is_under()) +non_self_crossing_ids = over_crossing_ids ^ under_crossing_ids + +def update_signs(strand: Iterable[SGCodeCrossing]): + return [ + c.flip_handedness() if c.id in non_self_crossing_ids else c + for c in strand + ] + +return SGCode([ + *( + update_signs(component) + for i, component in enumerate(self.components) + if i != component_index + ), + [ + *update_signs(l1), + *update_signs(reversed(l2)), + *update_signs(l3), + ], +]) +``` + +The code for the *vertical splices* is omitted as the cases are the same as for the horizontal splices just flipped with respect to handedness. All the cases for vertical splices are shown below in the following diagram and we can see that the output lists are the same as in the previous splice case just switched based on the crossing sign. #figure( image("assets/operations-splice-v-cases.png"), @@ -949,88 +1050,469 @@ So the final code is just a conversion of all this cases to list slicing and re- #pagebreak() -= Appendix +== Code for computing the Kauffman polynomial -== Enhancing SGCode rejoining code - -The initial code to do horizontal and vertical splices looked something like the following +The final code for computing the Kauffman polynomial is the following, the main idea of the algorithm was already described previously. The code is implemented in a functional style and uses the `SGCode` class defined above to represent the links. At the top level we define globals variables using the `sympy` library for working with polynomials. ```py -... -if handedness == HANDED_LEFT: - return SGCode([ - *(component[:] - for i, component in enumerate(self.components) - if i != component_index), - [ - *l1, - *l3, - ], - l2, - ]) -else: - return SGCode([ - *(component[:] - for i, component in enumerate(self.components) - if i != component_index), - [ - *l1, - *l2[::-1], - *l3, - ], - ]) +a, z = symbols("a z") +d = (a + 1 / a) / z - 1 + +def kauffman_polynomial(link: SGCode) -> Poly: + if len(link.components) == 0: + return 0 + + component_groups = link.overlies_decomposition() + + if len(component_groups) == 1: + unknot_index = link.first_switch_to_std_unknot() + + link_rev = link.reverse() + unknot_index_rev = link_rev.first_switch_to_std_unknot() + + if unknot_index == False or unknot_index_rev == False: + return a ** link.writhe() + else: + link_switched = link.switch_crossing(unknot_index) + link_spliced_h = link_switched.splice_h(unknot_index) + link_spliced_v = link_switched.splice_v(unknot_index) + + k_link_spliced_h = kauffman_polynomial(link_spliced_h) + k_link_spliced_v = kauffman_polynomial(link_spliced_v) + k_link_switched = kauffman_polynomial(link_switched) + + return ( + z * (k_link_spliced_h + k_link_spliced_v) + - k_link_switched + ) + else: + result = 1 + for k, component_ids in enumerate(component_groups): + new_link = link.sublink(component_ids) + if k > 0: + result *= d + + result *= kauffman_polynomial(new_link) + + return result ``` -This is actually wrong as this is not correcting the signs of all crossing from the reversed strand. The corrected code for the second case is not very readable +Given this we can also write a function for computing the normalized Kauffman polynomial $F_K(a, z) = a^(-w(K)) L_K(a, z)$ as follows ```py -over_crossing_ids = set(c.id for c in l2 if c.is_over()) -under_crossing_ids = set(c.id for c in l2 if c.is_under()) -non_self_crossing_ids = over_crossing_ids.symmetric_difference(under_crossing_ids) +def f_polynomial(link: SGCode) -> Poly: + return (a ** (-link.writhe())) * kauffman_polynomial(link) +``` -update_signs = lambda strand: [ - c.flip_handedness() if c.id in non_self_crossing_ids else c - for c in strand -] +#pagebreak() + + +=== Debugging and Optimizations + +The code (omitted from above, see the github repository for the full code) has actually been instrumented with some helper function to ease debugging and optimizations. + +- Use the `cache` python decorator to memoize all calls to `kauffman_polynomial`. + +- Another decorator called `log_input_output` helps with debug printing the traces like the following for the Hopf link + + #[ + #set par(leading: 5pt) + + ``` + ● kauffman_polynomial([[(+1, +1), (-2, +1)], [(+2, +1), (-1, +1)]]) + │ [i] not cached... + │ [i] applying skein + │ [i] splice h, lambda = [2, ...] + │ ● kauffman_polynomial([[(+1, -1), (-1, -1)]]) + │ │ [i] not cached... + │ │ [i] standard unknot form + │ └─▶ 1/a + │ [i] splice v, lambda = [2, ...] + │ ● kauffman_polynomial([[(+1, +1), (-1, +1)]]) + │ │ [i] not cached... + │ │ [i] standard unknot form + │ └─▶ a + │ [i] switch, lambda = [2, ...] + │ ● kauffman_polynomial([[(+1, +1), (+2, -1)], [(-1, +1), (-2, -1)]]) + │ │ [i] not cached... + │ │ [i] split link: [[0], [1]] + │ │ ● kauffman_polynomial([[]]) + │ │ │ [i] not cached... + │ │ │ [i] standard unknot form + │ │ └─▶ 1 + │ │ ● kauffman_polynomial([[]]) + │ │ └─▶ 1 + │ └─▶ a/z - 1 + 1/(a * z) + └─▶ a * z - a/z + 1 + z/a - 1/(a * z) + ```] + +- Finally there is another decorator called `polynomial_wrapper` that help with applying optimizations to function calls and is defined as follows + + ```py + OptimizationType = Literal['expand', 'relabel', 'to_minimal'] + + def polynomial_wrapper(optimizations: set[OptimizationType] = {'expand'}): + def decorator(func: Callable[[SGCode], Poly]) -> Callable[[SGCode], Poly]: + @functools.wraps(func) + def wrapper(link: SGCode) -> Poly: + # First we convert to minimal rotated form and only then we relabel, + # this ensures a consistent indexing for the cache. + if 'to_minimal' in optimizations: + link = link.to_minimal() + if 'relabel' in optimizations: + link = link.relabel() + + result = func(link) + + if 'expand' in optimizations: + result = sympy.expand(result) + + return result + return wrapper + return decorator + ``` + + This applies `sympy.expand(...)` to keep the resulting polynomial simplified and prepends each call with the two following optimizations + + - `to_minimal`: This "rotates" the list of each component in the SG code, brining each list in _minimal lexicographical order_. + + - `relabel`: After minimal rotation we apply a relabelling to increase the chances of hitting the cache decorator. + + These two optimization decrease the number of total recursive calls by almost an order of magnitude, for example for the case of knot `12n_888` we have the following optimization lattice with number of calls in blue and time of execution in green. + + #figure(image("assets/optimizations-lattice-calls.jpg", width: 45%)) + + As we can see the most important optimization is the `to_minimal` one that by its own reduces the total number of calls from $29"k"$ to $8"k"$ but relabelling is still able to help a bit more. + +All optimizations are enabled by default in the final program and debugging traces are disabled to not impact the speed. + +== Experiments + +The main achievement of this project was to check all (normalized) Kauffman polynomials present in the #link("https://knotinfo.math.indiana.edu/")[KnotInfo database]. Using the python package `database_knotinfo` we loaded all the data present in the database and wrote a script called `./check_knotinfo.py` with the following options -SGCode([ - *( - update_signs(component) - for i, component in enumerate(self.components) - if i != component_index - ), - [ - *update_signs(l1), - *update_signs(reversed(l2)), - *update_signs(l3), - ], -]) ``` +usage: check_knotinfo.py [-h] [--knots] [--links] [-c COUNT] -== Nice Typst Stuff +Calculate the Kauffman polynomial of a knot or link. -All combinations of `skein-generic` typst function +options: + -h, --help show this help message and exit + --knots Include knots from database + --links Include links from database + -c, --count COUNT Number of knots to test per database +``` -#[ - #set align(center + horizon) +This uses the `multiprocessing` library to parallelize the computation of the Kauffman polynomial for each call of the Kauffman polynomial and checks all the databases of knots and links in a couple of minutes. + +We run this on all knots and links in the database and found the following results: + +- For *links*: All 4187 include the Kauffman polynomial and are all correctly computed by our algorithm. + +- For *knots*: Out of 12965 knots only 2977 knots include the Kauffman polynomial (they are computed only up to 12 crossing even if there are up to 13 crossings knots in the database) and _we found a mismatch in the computation of the polynomial of $10_125$_. + +=== The knot $10_125$ - #for kind in ("over", "under") { - [*Kind:* #raw(repr(kind))] +#align( + center, + grid( + columns: 2, + gutter: 1.5em, + image("assets/10_125-crop.png", height: 5cm), + scale( + x: -100%, + image("assets/10_125-crop.png", height: 5cm), + ), + ), +) + +This knot is _chiral_ meaning that it is not equivalent to its mirror. Our algorithm computes the following polynomial for this knot + +// z**8*(a**2 + 1)/a**2 +// + z**6*(-6*a**2 - 6)/a**2 +// + z**4*(2*a**4 + 13*a**2 + 11)/a**2 +// + z**2*(a**6 - 6*a**4 - 15*a**2 - 8)/a**2 + (3*a**4 + 7*a**2 + 3)/a**2 +// + z**7*(a**4 + 2*a**2 + 1)/a**3 +// + z**5*(-5*a**4 - 11*a**2 - 6)/a**3 +// + z**3*(a**6 + 8*a**4 + 17*a**2 + 10)/a**3 + z*(a**8 - a**6 - 6*a**4 - 8*a**2 - 4)/a**3 + +$ + F_(10_125)(a, z) = + & z^8 (1 / a^2 + 1) + z^7 (a + 2 / a + 1 / a^3) + z^6 (-6 - 6 / a^2) \ + &+ space z^5 (-5 a - 11 / a - 6 / a^3) + + z^4 (2 a^2 + 13 + 11 / a^2) \ + &+ space z^3 (a^3 + 8 a + 17 / a + 10 / a^3) + + z^2 (a^4 - 6 a^2 - 15 - 8 / a^2) \ + &+ space z (a^5 - a^3 - 6 a - 8 / a - 4 / a^3) + + 3 a^2 + 7 + 3 / a^2 +$ + +while the polynomial for the knot present in KnotInfo is the following + +// z**8*(a**2 + 1) +// + z**6*(-6*a**2 - 6) +// + z**7*(a**4 + 2*a**2 + 1)/a +// + z**5*(-6*a**4 - 11*a**2 - 5)/a +// + z**4*(11*a**4 + 13*a**2 + 2)/a**2 + (3*a**4 + 7*a**2 + 3)/a**2 +// + z**3*(10*a**6 + 17*a**4 + 8*a**2 + 1)/a**3 +// + z**2*(-8*a**6 - 15*a**4 - 6*a**2 + 1)/a**4 + z*(-4*a**8 - 8*a**6 - 6*a**4 - a**2 + 1)/a**5 + +$ + F'_(10_125)(a, z) = + & z^8 (a^2 + 1) + z^7 (a^3 + 2 a + 1 / a) + z^6 (-6 a^2 - 6) \ + &+ space z^5 (-6 a^3 - 11 a - 5 / a) + + z^4 (11 a^2 + 13 + 2 / a^2) \ + &+ space z^3 (10 a^3 + 17 a + 8 / a + 1 / a^3) + + z^2 (-8 a^2 - 15 - 6 / a^2 + 1 / a^4) \ + &+ space z (-4 a^3 - 8 a - 6 / a - 1 / a^3 + 1 / a^5) + + 3 a^2 + 7 + 3 / a^2 +$ + +Then we noticed that they are related by the substitution $(a mapsto 1 slash a, z mapsto z)$. The Kauffman polynomial has this property that inverts the $a$ when computing the mirror image of a knot, in this sense it is able to distinguish chiral variants of knots. + +So we checked using the implementation of the Kauffman polynomial using one in the `KnotTheory` Mathematica package. We used the PD code present in the KnotInfo database and found that the result of Mathematica and of our algorithm *match*. This makes us believe that there is a problem in KnotInfo and that the column for the PD code or for the Kauffman polynomial are not correctly synchronized. + +=== Performance Analysis + +We also checked the performance of our algorithm on all knots and links in the database up to 12 crossings (these are the ones with the Kauffman polynomial in the database). The results are shown in the following histograms, each bar counts the number of knots that took the amount of time in the relative bin. + +#let times-knots = json("assets/times-knots.json") +#let times-links = json("assets/times-links.json") + +#align( + center, + grid( + columns: 2, + gutter: 2em, grid( - columns: 4, - gutter: 1.5em, - ..( - ((+1, +1), (+1, -1), (-1, +1), (-1, -1)).map(direction => { - ((true, true), (false, true), (true, false), (false, false)).map(arrows => { - skein-generic( - kind: kind, - direction: direction, - arrows: arrows, - ) - [#direction \ #arrows] + rows: 2, + gutter: 1em, + { + import "@preview/lilaq:0.3.0" as lq + import "@preview/oxifmt:0.2.1": strfmt + + let max-value = 0 + for t in times-knots { + if t > max-value { + max-value = t + } + } + + let steps = range(13).map(x => (strfmt("{:.1}s", float(x)), x + 0.0, x + 1.0)) + let counts = (:) + + for t in times-knots { + let (step, _, _) = steps.find(interval => { + let (_, a, b) = interval + return a <= t and t <= b }) - }) - ).flatten() - ) - } -] + + if not step in counts { + counts.insert(step, 0) + } + + counts.insert(step, counts.at(step) + 1) + } + + let ys = counts.values() + let xs = range(ys.len()) + + lq.diagram( + yaxis: ( + ticks: range(0, 700, step: 100), + subticks: none, + ), + xaxis: ( + ticks: steps + .map(((l, _, _)) => l) + .map(scale.with(80%)) + .map(rotate.with(-45deg, reflow: true)) + .map(align.with(right)) + .enumerate(), + subticks: none, + ), + legend: (position: left + top), + margin: 5%, + + lq.bar( + xs, + ys, + offset: 0.5, + ), + ) + }, + [ + #set text(size: 9pt) + Histogram of knots times + ] + ), + grid( + rows: 2, + gutter: 1em, + { + import "@preview/lilaq:0.3.0" as lq + import "@preview/oxifmt:0.2.1": strfmt + + let max-value = 0 + for t in times-links { + if t > max-value { + max-value = t + } + } + + let steps = range(10).map(x => (strfmt("{:.1}s", float(x)), x + 0.0, x + 1.0)) + let counts = (:) + + for t in times-links { + let (step, _, _) = steps.find(interval => { + let (_, a, b) = interval + return a <= t and t <= b + }) + + if not step in counts { + counts.insert(step, 0) + } + + counts.insert(step, counts.at(step) + 1) + } + + let ys = counts.values() + let xs = range(ys.len()) + + lq.diagram( + yaxis: ( + ticks: range(0, 1700, step: 200), + subticks: none, + ), + xaxis: ( + ticks: steps + .map(((l, _, _)) => l) + .map(scale.with(80%)) + .map(rotate.with(-45deg, reflow: true)) + .map(align.with(right)) + .enumerate(), + subticks: none, + ), + legend: (position: left + top), + margin: 5%, + + lq.bar( + xs, + ys, + offset: 0.5, + ), + ) + }, + [ + #set text(size: 9pt) + Histogram of links times + ] + ), + ), +) + +We can see that the times are just about of a couple of seconds per knot or link. This could be improved by using more sophisticated caching techniques but we did not implement this as the performance was already good enough for our purposes. + += Conclusion + +In this project we implemented the Kauffman polynomial from scratch in Python using signed Gauss codes. We compared the results of our algorithm with the ones present in the KnotInfo database and found an error in the computation of the polynomial of the knot $10_125$. We believe that the error is due to a mismatch between the PD code stored in the database with the corresponding Kauffman polynomial. + + + + + + + + + + + + + + +// #pagebreak() + +// = Appendix + +// == Enhancing SGCode rejoining code + +// The initial code to do horizontal and vertical splices looked something like the following + +// ```py +// ... +// if handedness == HANDED_LEFT: +// return SGCode([ +// *(component[:] +// for i, component in enumerate(self.components) +// if i != component_index), +// [ +// *l1, +// *l3, +// ], +// l2, +// ]) +// else: +// return SGCode([ +// *(component[:] +// for i, component in enumerate(self.components) +// if i != component_index), +// [ +// *l1, +// *l2[::-1], +// *l3, +// ], +// ]) +// ``` + +// This is actually wrong as this is not correcting the signs of all crossing from the reversed strand. The corrected code for the second case is not very readable + +// ```py +// over_crossing_ids = set(c.id for c in l2 if c.is_over()) +// under_crossing_ids = set(c.id for c in l2 if c.is_under()) +// non_self_crossing_ids = over_crossing_ids.symmetric_difference(under_crossing_ids) + +// update_signs = lambda strand: [ +// c.flip_handedness() if c.id in non_self_crossing_ids else c +// for c in strand +// ] + +// SGCode([ +// *( +// update_signs(component) +// for i, component in enumerate(self.components) +// if i != component_index +// ), +// [ +// *update_signs(l1), +// *update_signs(reversed(l2)), +// *update_signs(l3), +// ], +// ]) +// ``` + +// == Nice Typst Stuff + +// All combinations of `skein-generic` typst function + +// #[ +// #set align(center + horizon) + +// #for kind in ("over", "under") { +// [*Kind:* #raw(repr(kind))] +// grid( +// columns: 4, +// gutter: 1.5em, +// ..( +// ((+1, +1), (+1, -1), (-1, +1), (-1, -1)).map(direction => { +// ((true, true), (false, true), (true, false), (false, false)).map(arrows => { +// skein-generic( +// kind: kind, +// direction: direction, +// arrows: arrows, +// ) +// [#direction \ #arrows] +// }) +// }) +// ).flatten() +// ) +// } +// ] diff --git a/theme.typ b/theme.typ index 5cdedf6..bbce781 100644 --- a/theme.typ +++ b/theme.typ @@ -239,7 +239,7 @@ abstract } - outline(depth: 3, indent: 1em) + outline(depth: 2, indent: 1em) // Display the article's contents. v(29pt, weak: true)