First version

Change-Id: Ia0022a4f5c351fcf571d198d2e1def998b2689d2
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4f8adcf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+__pycache__/
+media/
diff --git a/img/arsmagna.png b/img/arsmagna.png
new file mode 100644
index 0000000..39daa30
--- /dev/null
+++ b/img/arsmagna.png
Binary files differ
diff --git a/img/cardano.jpg b/img/cardano.jpg
new file mode 100644
index 0000000..905df4a
--- /dev/null
+++ b/img/cardano.jpg
Binary files differ
diff --git a/img/factions.png b/img/factions.png
new file mode 100644
index 0000000..8c907ef
--- /dev/null
+++ b/img/factions.png
Binary files differ
diff --git a/img/girard.jpg b/img/girard.jpg
new file mode 100644
index 0000000..7006f91
--- /dev/null
+++ b/img/girard.jpg
Binary files differ
diff --git a/img/inventionnouvelle.png b/img/inventionnouvelle.png
new file mode 100644
index 0000000..519c381
--- /dev/null
+++ b/img/inventionnouvelle.png
Binary files differ
diff --git a/img/meditationes.png b/img/meditationes.png
new file mode 100644
index 0000000..c3053e6
--- /dev/null
+++ b/img/meditationes.png
Binary files differ
diff --git a/img/newton.jpg b/img/newton.jpg
new file mode 100644
index 0000000..1d39117
--- /dev/null
+++ b/img/newton.jpg
Binary files differ
diff --git a/img/pacioli.jpg b/img/pacioli.jpg
new file mode 100644
index 0000000..f4e8ccf
--- /dev/null
+++ b/img/pacioli.jpg
Binary files differ
diff --git a/img/sommepuissances.png b/img/sommepuissances.png
new file mode 100644
index 0000000..d016bd8
--- /dev/null
+++ b/img/sommepuissances.png
Binary files differ
diff --git a/img/sommepuissances2.png b/img/sommepuissances2.png
new file mode 100644
index 0000000..3aec1e8
--- /dev/null
+++ b/img/sommepuissances2.png
Binary files differ
diff --git a/img/suma.png b/img/suma.png
new file mode 100644
index 0000000..ddbf2e8
--- /dev/null
+++ b/img/suma.png
Binary files differ
diff --git a/img/viete.jpeg b/img/viete.jpeg
new file mode 100644
index 0000000..3942c43
--- /dev/null
+++ b/img/viete.jpeg
Binary files differ
diff --git a/img/waring.jpg b/img/waring.jpg
new file mode 100644
index 0000000..312a82c
--- /dev/null
+++ b/img/waring.jpg
Binary files differ
diff --git a/symmetric_polynomials.py b/symmetric_polynomials.py
new file mode 100644
index 0000000..6a4ff7f
--- /dev/null
+++ b/symmetric_polynomials.py
@@ -0,0 +1,346 @@
+#!/usr/bin/env python
+
+from manimlib.imports import *
+
+def get_title(title_str = "Història"):
+    title = TextMobject(title_str)
+    title.scale(1.5)
+    title.to_edge(UP)
+    return title
+
+def create_image(source, scale=2.5):
+    img = ImageMobject(source)
+    img.scale(scale)
+    return img
+
+def create_label(img, desc):
+    label = TextMobject(desc)
+    label.scale(0.7)
+    label.next_to(img, DOWN)
+    return label
+
+class IntroHistoria(Scene):
+    def construct(self):
+        title = get_title()
+
+        self.play(Write(title))
+        self.wait(1.5)
+
+        pol = TexMobject("p(x) = ", "x^n + a_{n-1} x^{n-1} + \ldots + a_0")
+        pol0, pol1 = pol.split();
+
+        pol2 = TexMobject("\\prod_{i = 1}^n (x - ", "\\alpha_i", ")")
+        pol2_1, alpha_pol, pol2_3 = pol2.split()
+
+        vieta1 = TexMobject("a_{n-1} = ", "\\alpha_1", " + \ldots + ", "\\alpha_n")
+        vieta1_i, vieta1_alpha1, vieta1_plus, vieta1_alphan = vieta1.split()
+
+        vietamore = TexMobject("\\vdots")
+
+        vieta2 = TexMobject("a_0 = ", "\\alpha_1", " \cdot \ldots \cdot ", "\\alpha_n")
+        vieta2_i, vieta2_alpha1, vieta2_prod, vieta2_alphan = vieta2.split()
+
+        general_vieta = TexMobject("(-1)^k a_{n-k} = \\sum_{1 \\le i_1 < i_2 < \\cdots < i_k \\le n} \\left( \\prod_{j=1}^k \\alpha_{i_j} \\right)")
+        general_vieta_desc = TextMobject("Fòrmules de Viète")
+
+        vietas = VGroup(vieta1, vietamore, vieta2)
+        vietamore.next_to(vieta1, DOWN, buff = 0.4)
+        vieta2.next_to(vietamore, DOWN, buff = 0.4)
+        vietas.next_to(pol, DOWN, buff = 1)
+        flow = VGroup(pol, vietas)
+        flow.center()
+
+        # This should be done after the flow is centered:
+        pol2.next_to(pol0, RIGHT)
+        general_vieta.align_to(vietas, UP)
+        general_vieta_desc.next_to(vietas, DOWN)
+
+        alpha_pol2 = alpha_pol.copy()
+        alpha_pol3 = alpha_pol.copy()
+        alpha_pol4 = alpha_pol.copy()
+
+        framebox = SurroundingRectangle(general_vieta, buff = .15)
+        framebox.set_stroke(WHITE, 4)
+
+        # Animations:
+        self.play(Write(pol))
+        self.wait(1.5)
+
+        self.play(Transform(pol1, pol2))
+        self.wait(1.5)
+
+        self.play(ApplyMethod(
+            alpha_pol.set_color, RED,
+            rate_func = there_and_back,
+            run_time = 2
+        ))
+        self.wait(1.5)
+
+        self.play(
+            Write(vieta1),
+            Transform(alpha_pol, vieta1_alpha1),
+            Transform(alpha_pol2, vieta1_alphan)
+        )
+        self.wait(1.5)
+
+        self.play(FadeIn(vietamore))
+        self.play(
+            Write(vieta2),
+            Transform(alpha_pol3, vieta2_alpha1),
+            Transform(alpha_pol4, vieta2_alphan)
+        )
+        self.wait(1.5)
+
+        self.play(Transform(vietas, general_vieta))
+        self.wait(1.5)
+        
+        self.play(
+            FadeIn(framebox),
+            FadeInFrom(general_vieta_desc, UP)
+        )
+        self.wait(1.5)
+
+class LucaPacioli(Scene):
+    def construct(self):
+        title = get_title()
+        self.add(title)
+        self.wait(1.5)
+
+        luca = create_image("img/pacioli.jpg")
+        luca.to_edge(LEFT, buff=1)
+        luca_desc = create_label(luca, "Luca Pacioli (c. 1445-1509)")
+
+        suma = create_image("img/suma.png")
+        suma.to_edge(RIGHT, buff=1)
+        suma_desc = create_label(suma, "\\textit{Summa de arithmetica} (1494)")
+
+        self.play(
+            FadeIn(luca),
+            FadeInFrom(luca_desc, UP)
+        )
+        self.wait(1.5)
+
+        self.play(
+            FadeIn(suma),
+            FadeInFrom(suma_desc, UP)
+        )
+        self.wait(1.5)
+
+        cardano = create_image("img/cardano.jpg")
+        cardano.to_edge(LEFT, buff=1)
+        cardano_desc = create_label(cardano, "Girolamo Cardano (1501-1576)")
+
+        arsmagna = create_image("img/arsmagna.png")
+        arsmagna.to_edge(RIGHT, buff=1)
+        arsmagna_desc = create_label(arsmagna, "\\textit{Ars Magna} (1545)")
+
+        cardano_cita = TextMobject("``Differentia aequationum verarum et fictarui \\\\ semper est numerus quadrato''")
+        cardano_cita.scale(0.825)
+        cardano_cita.next_to(cardano, RIGHT)
+
+        self.play(
+            FadeOut(suma),
+            FadeOut(suma_desc),
+            FadeOut(luca),
+            FadeIn(cardano),
+            Transform(luca_desc, cardano_desc)
+        )
+        self.remove(luca_desc)
+        self.add(cardano_desc)
+        self.wait(1.5)
+
+        self.play(
+            FadeIn(arsmagna),
+            FadeInFrom(arsmagna_desc, UP)
+        )
+        self.wait(1.5)
+
+        self.play(
+            FadeOut(arsmagna),
+            FadeOut(arsmagna_desc),
+            Write(cardano_cita)
+        )
+        self.wait(1.5)
+
+        viete = create_image("img/viete.jpeg")
+        viete.to_edge(LEFT, buff=1)
+        viete_desc = create_label(viete, "François Viète (1540-1603)")
+
+        self.play(
+            FadeOut(cardano_cita),
+            FadeOut(cardano),
+            FadeIn(viete),
+            Transform(cardano_desc, viete_desc)
+        )
+        self.remove(cardano_desc)
+        self.add(viete_desc)
+        self.wait(1.5)
+
+        girard = create_image("img/girard.jpg")
+        girard.to_edge(LEFT, buff=1)
+        girard_desc = create_label(girard, "Albert Girard (1595-1632)")
+
+        self.play(
+            FadeOut(viete),
+            FadeIn(girard),
+            Transform(viete_desc, girard_desc)
+        )
+        self.remove(viete_desc)
+        self.add(girard_desc)
+        self.wait(1.5)
+
+        primer = TextMobject("Primer teorema de polinomis simètrics, \\\\ sense saber-ho")
+        primer.scale(0.825)
+        primer.next_to(girard, RIGHT)
+        
+        self.play(Write(primer))
+        self.wait(1.5)
+
+        invention = create_image("img/inventionnouvelle.png", 2)
+        invention.to_edge(RIGHT, buff=1)
+        invention_desc = create_label(invention, "\\textit{Invention nouvelle en l'algèbre} (1629)")
+
+        self.play(
+            FadeOut(primer),
+            FadeIn(invention),
+            FadeInFrom(invention_desc, UP)
+        )
+        self.wait(1.5)
+
+        factions = create_image("img/factions.png", 1)
+        factions.to_edge(RIGHT, buff=1)
+
+        self.play(
+            FadeOut(invention),
+            FadeIn(factions),
+            ApplyMethod(invention_desc.next_to, factions, DOWN)
+        )
+        self.wait(1.5)
+
+        sommes = create_image("img/sommepuissances.png")
+        sommes.to_edge(RIGHT, buff=1)
+
+        self.play(
+            FadeOut(factions),
+            FadeIn(sommes),
+            ApplyMethod(invention_desc.next_to, sommes, DOWN)
+        )
+        self.wait(1.5)
+
+        sommes2 = create_image("img/sommepuissances2.png", 1)
+        sommes2.to_edge(RIGHT, buff=1)
+        sommes2_desc = create_label(sommes2, "\\textit{A Short Account of the History of Symmetric} \\\\ \\textit{Functions of Roots of Equations}, \\\\ H. Gray Funkhouser (1930).")
+
+        self.play(
+            FadeOut(sommes),
+            FadeIn(sommes2),
+            Transform(invention_desc, sommes2_desc)
+        )
+        self.remove(invention_desc)
+        self.add(sommes2_desc)
+        self.wait(1.5)
+
+        notthesame = TexMobject("\\sum_{i < j} \\alpha_i \\alpha_j \\neq \\sum_{i} \\alpha_i^2")
+        notthesame.next_to(girard, RIGHT).shift(1*RIGHT)
+
+        self.play(
+            FadeOut(sommes2),
+            FadeOut(sommes2_desc),
+            Write(notthesame)
+        )
+        self.wait(1.5)
+
+        waring = create_image("img/waring.jpg")
+        waring.to_edge(LEFT, buff=1)
+        waring_desc = create_label(waring, "Edward Waring (1736-1798)")
+
+        self.play(
+            FadeOut(notthesame),
+            FadeOut(girard),
+            FadeIn(waring),
+            Transform(girard_desc, waring_desc)
+        )
+        self.remove(girard_desc)
+        self.add(waring_desc)
+        self.wait(1.5)
+
+class EdwardWaring(Scene):
+    def construct(self):
+        title = get_title()
+        self.add(title)
+
+        waring = create_image("img/waring.jpg")
+        waring.to_edge(LEFT, buff=1)
+        waring_desc = create_label(waring, "Edward Waring (1736-1798)")
+
+        self.add(waring)
+        self.add(waring_desc)
+
+        th1 = TextMobject("Teorema 1. ", "???").set_color(GRAY)
+        th2 = TextMobject("Teorema 2. ???").set_color(GRAY)
+        th3 = TextMobject("Teorema 3. ", "???").set_color(GRAY)
+
+        th1.shift(1*UP)
+        th3.shift(1*DOWN)
+
+        teoremes = VGroup(th1, th2, th3)
+        teoremes.next_to(waring, RIGHT).shift(1*RIGHT)
+        
+        self.play(
+            FadeInFrom(th1, UP),
+            FadeIn(th2),
+            FadeInFrom(th3, DOWN)
+        )
+        self.wait(1.5)
+
+        th1_pre, th1_question = th1.split()
+        th1_text = TexMobject("\\sum_{i} \\alpha_i^k = f_k(a_i) \\quad \\forall k \\in \\mathbb{N}")
+        th1_text.scale(0.8)
+        th1_text.next_to(th1_pre)
+
+        self.play(
+            Transform(th1_question, th1_text),
+            ApplyMethod(th1_pre.set_color, WHITE)
+        )
+        self.wait(1.5)
+
+        th3_pre, th3_question = th3.split()
+        th3_text = TextMobject("Precursor al Teo. Fonamental \\\\ dels Polinomis Simètrics")
+        th3_text.scale(0.7)
+        th3_text.next_to(th3_pre)
+
+        self.play(
+            Transform(th3_question, th3_text),
+            ApplyMethod(th3_pre.set_color, WHITE)
+        )
+        self.wait(1.5)
+
+        meditationes = create_image("img/meditationes.png")
+        meditationes.to_edge(RIGHT, buff=2)
+        meditationes_desc = create_label(meditationes, "\\textit{Meditationes Algebraicae} (1770).")
+
+        self.play(
+            FadeOut(th1),
+            FadeOut(th2),
+            FadeOut(th3),
+            FadeIn(meditationes),
+            FadeInFrom(meditationes_desc, UP)
+        )
+        self.wait(1.5)
+
+        conjectura = VGroup(
+            TextMobject("$n$ es pot escriure com a màxim com a suma de:"),
+            TextMobject("$\\cdot$ 4 quadrats"),
+            TextMobject("$\\cdot$ 9 cubs"),
+            TextMobject("$\\cdot$ 19 biquadrats"),
+            TextMobject("$\\cdot$ en general, $m$ potències k-èssimes positives, \\\\ essent $m$ depenent de $k$ ($\\forall k \\in \\mathbb{N}$)"),
+        )
+        conjectura.scale(0.8)
+        conjectura.arrange(DOWN, buff = MED_LARGE_BUFF, aligned_edge = LEFT)
+        conjectura.to_edge(RIGHT, buff=0.75)
+
+        self.play(
+            FadeOut(meditationes),
+            Write(conjectura)
+        )
+        self.wait(1.5)