import sympy as sp
import itertools
import math
# Aglaea's Out of battle SPD: "A"
A = sp.symbols('A', real=True)
Base_spd = [102]
Tribbie_DDD_AA = [0.18]
Sunday_DDD_AA = 0.16
Vonwacq_AA = 0.4
# AV of Breakpoint you looking for
Cycle_AV = 150
# Number of sunday's turn in that AV
NoT = 3
# Number of sunday's ULTS in that AV assuming Sunday get 3 turn ult
SNoU = 1 + math.floor((NoT - 1)/3)
# Number of Tribbie's ULTS in that AV
TNoU = 1
for B, D in itertools.product(Base_spd, Tribbie_DDD_AA):
# Aglaea Speeds at 3~6 stacks
AS_3 = A + B * 0.51
AS_4 = A + B * 0.66
AS_5 = A + B * 0.81
AS_6 = A + B * 0.96
# Aglaea Normal AV
A_AV3 = 10000 / AS_3
A_AV4 = 10000 / AS_4
A_AV5 = 10000 / AS_5
A_AV6 = 10000 / AS_6
# GM Speeds at 3~5 stacks
GMS_3 = (B * 0.35) + (3 * 55)
GMS_4 = (B * 0.35) + (4 * 55)
GMS_5 = (B * 0.35) + (5 * 55)
GMS_6 = (B * 0.35) + (6 * 55)
# GM Normal AV
GM_AV3 = (1 - Sunday_DDD_AA) * 10000 / GMS_3
GM_AV4 = 10000 / GMS_4
GM_AV5 = 10000 / GMS_5
GM_AV6 = 10000 / GMS_6
# Actual_AV = (Remaining_AV * OLD_SPD/NEW_SPD) + Traveled_AV (turn before sunday)
Sunday_spd = (NoT - (SNoU * Sunday_DDD_AA) - Vonwacq_AA - (TNoU * D)) * 10000/Cycle_AV
Sunday_AV = (1 - Sunday_DDD_AA) * 10000/Sunday_spd
A2_AV = (A_AV3 - GM_AV3) * (AS_3 / AS_4) + GM_AV3
# Solve to get Aglaea turns before Sunday's second turn.
equation = sp.Eq(A2_AV, Sunday_AV)
solutions = sp.solve(equation, A)
# Keep only positive solutions
real_solutions = [sol.evalf(6) for sol in solutions if sol.is_real]
Sunday_spd = [math.ceil(Sunday_spd * 100)/100]
print(f"Base_spd={B}, Tribbie's DDD_AA={D} → Sunday's SPD ={Sunday_spd}, Aglaea's SPD =", real_solutions)