In [62]:
from functools import cache
import numpy as np
import matplotlib.pyplot as plt
import itertools
import math
from decimal import Decimal, getcontext
In [39]:
def make_pq(p1, p2, p3):
    @cache
    def p(i, k):
        if k < 0:
            raise ValueError("p called with k < 0")
        if k == 0:
            return [p1, p2, p3][i - 1]
        return p(i, k - 1) * (p(i, k - 1) + 2 * p(i % 3 + 1, k - 1))
    
    @cache
    def q(i, k):
        if k < 0:
            raise ValueError("q called with k < 0")
        if k == 0:
            return p(i, 0) * (p(i, 0) + 2 * p((i + 1) % 3 + 1, 0))
        return (
            q(i, k - 1) * p(i%3 + 1, k - 1) * (p(i%3 + 1, k - 1) + 2 * p(i, k - 1)) +
            q(i, k - 1) * p(i, k - 1) * (p(i, k - 1) + 2 * p((i + 1)%3 + 1, k - 1)) +
            q(i%3 + 1, k - 1) * p(i, k - 1) * (p(i, k - 1) + 2 * p((i + 1)%3 + 1, k - 1))
        )
    
    return (p, q)
In [40]:
p, q = make_pq(.1, .8, .1)
In [30]:
fig, ax = plt.subplots()
for i in [1, 2, 3]:
    data = []
    for k in range(50):
        data.append(p(i, k))
#         if data[-1] > 1:
#             print(i, k)
#             error
#     print(data[30:40])
    ax.plot(data, label=f"$i={i}$")
ax.legend()
plt.show()
In [41]:
fig, ax = plt.subplots()
for i in [1, 2, 3]:
    data = []
    for k in range(50):
        data.append(q(i, k))
    ax.plot(data, label=f"$i={i}$")
ax.legend()
plt.show()
In [81]:
def plot(p1, p2, p3, k, label=None):
    fig, ax = plt.subplots()
    p, q = make_pq(p1, p2, p3)
    colors = ["red", "blue", "green", "pink", "aqua", "lime"]
    color_index = 0
    for fun in [p, q]:
        for i in [1, 2, 3]:
            data = []
            for k_val in range(k):
                data.append(fun(i, k_val))
            ax.plot(data, label=f"${fun.__name__}_{i}$", color=colors[color_index])
            color_index += 1
    ax.legend()
    ax.set_title(f"$p_1^{(0)}={p1}$, $p_2^{(0)}={p2}$, $p_3^{(0)}={p3}$, $k \\in [0, {k}]$" if label is None else label)
    plt.savefig(f"./de/p1_{p1}-p2_{p2}-p3_{p3}-k_{k}.png")
    plt.show()
In [60]:
plot(.4, .2, .4, 50)
plot(.3, .4, .3, 50)
plot(.2, .6, .2, 50)
plot(.1, .8, .1, 50)
plot(.05, .9, .05, 50)
plot(.025, .95, .025, 50)
In [76]:
getcontext().prec = 1500
delta = 10
plot(Decimal(delta) / Decimal(100), Decimal(100 - 2 * delta) / Decimal(100), Decimal(delta) / Decimal(100), 4096)
In [78]:
getcontext().prec = 3000
delta = 10
plot(Decimal(delta) / Decimal(100), Decimal(100 - 2 * delta) / Decimal(100), Decimal(delta) / Decimal(100), 8192)
In [83]:
getcontext().prec = 1500
epsilon = Decimal(1) / Decimal(2 ** 75)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 4096, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-75}$, $k \in [0, 4096]$")
In [84]:
getcontext().prec = 3000
epsilon = Decimal(1) / Decimal(2 ** 80)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 8192, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-80}$, $k \in [0, 8192]$")
In [85]:
getcontext().prec = 6000
epsilon = Decimal(1) / Decimal(2 ** 80)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 8192, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-80}$, $k \in [0, 8192]$")
In [87]:
getcontext().prec = 6000
epsilon = Decimal(1) / Decimal(2 ** 75)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 8192, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-75}$, $k \in [0, 8192]$")
In [88]:
getcontext().prec = 12000
epsilon = Decimal(1) / Decimal(2 ** 75)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 8192, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-75}$, $k \in [0, 8192]$")
In [91]:
getcontext().prec = 12000
epsilon = Decimal(1) / Decimal(2 ** 15)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 8192, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-15}$, $k \in [0, 8192]$")
In [92]:
getcontext().prec = 12000
epsilon = Decimal(1) / Decimal(2 ** 18)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 8192, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-18}$, $k \in [0, 8192]$")
In [93]:
getcontext().prec = 12000
epsilon = Decimal(1) / Decimal(2 ** 20)
plot(epsilon, Decimal(1) - 2*epsilon, epsilon, 8192, label="$p_1^{(0)} = p_3^{(0)} = \\epsilon = 2^{-20}$, $k \in [0, 8192]$")