Simplificando:

Factorizando (sacando factor común x):

Si el producto es cero, 
alguno de esos dos factores ha de serlo:

O bien x = 0, o bien  x = 

El punto medio M entre A y B será:

a = 1 (slider from -10 to 10, step 1)
c = 3 (slider from -100 to 100, step 1)
b = -4 (slider from -20 to 20, step 1)
f(x) = a * x^(2.0) + b * x + c
g = Simplify(f(x) - f(0.0))
h = Factor(g)
xB = If(a ≟ 0.0, 0.0, -1.0 * b / a)
texto1: "Cuando x = 0, la cuadrática corta al eje Y:

A = (0, " + c + ")"
A = Intersect(f, yAxis, 1.0)
texto2: "Por simetría, tiene que haber otro punto B
a la misma altura que A, es decir, 
otro punto B = (x, f(x)) donde f(x) = " + c + ":"
d = Line(A, xAxis)
texto3: "f(x) = " + c
texto4: f + " = " + c
texto6: g + " = 0"
texto8: h + " = 0"
texto11: "" + (-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b / a)
texto12: "Estas soluciones corresponden a 
las abscisas de los puntos A y B,
pues en ambos se cumple f(x) = " + c + ":"
texto13: "A = (0, " + c + ")    B = (" + (-1.0 * 1.0 * 1.0 * 1.0 * b / a) + ", " + c + ")"
B: (xB, f(xB))
texto15: "M = (" + (-1.0 * 1.0 * 1.0 * b / (2.0 * a)) + ", " + c + ")"
M = Midpoint(A, B)
texto16: "Por simetría, la recta x = " + (-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b / a) + " tiene que ser 
precisamente el eje de simetría de la parábola,
y como el vértice V tiene que estar en ese eje,
su abscisa tiene que ser " + (-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b / (2.0 * a)) + ":"
e = OrthogonalLine(M, d)
texto17: "V = (" + (-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b / (2.0 * a)) + ", " + (f(-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b / 2.0 * a)) + ")"
V = Intersect(f, e, 1.0)
texto18: "Por simetría, las dos raíces de la cuadrática
(en el caso de que existan)
han de estar a la misma distancia k del eje " + e + "

Así que las raíces serán:
R_1 = (" + (x(V)) + " - k, 0)      R_2 = (" + (x(V)) + " +  k,  0)"
R1: ((-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b - sqrt(b^(2.0) - 4.0 * a * c)) / (2.0 * a), 0.0)
texto01: "(" + (x(V)) + " - k, 0)"
R2: ((-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b + sqrt(b^(2.0) - 4.0 * a * c)) / (2.0 * a), 0.0)
texto02: "(" + (x(V)) + " + k, 0)"
texto19: "Por lo tanto, f(" + (x(V)) + " + k) = 0, es decir:"
texto20: a + " (" + (x(V)) + " + k)^2 + (" + b + ") (" + (x(V)) + " + k ) + (" + c + ") = 0"
texto21: a + " (" + (x(V)^(2.0)) + " + (" + (2.0 * x(V)) + ") k + k^2) + (" + b + ")  (" + (x(V)) + " + k) + (" + c + ") = 0"
texto22: b^(2.0) / (4.0 * a) + " + (" + (-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b) + ") k + (" + a + ") k^2 + (" + (-1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * 1.0 * b^(2.0) / (2.0 * a)) + ") + (" + b + ") k + (" + c + ") = 0"
texto23: a + " k^2 = " + (b^(2.0) / (4.0 * a) - c)
texto26: "k = " + (sqrt(b^(2.0) - 4.0 * a * c) / (2.0 * a))