예제 #1
0
    def setup(self):
        self.shift = 1.1
        shift = self.shift

        self.omega1 = Omega1()
        self.omega1.shift(shift * UP)
        self.omega1_brace = BraceDesc(self.omega1, "\\omega_1", UP)
        self.add(self.omega1, self.omega1_brace)

        # countable subset

        omega = OrdinalOmega(x1=-2)
        omega.stretch(0.5, 1)
        omega.next_to(self.omega1[1])
        self.count_subset = VGroup(
            self.omega1[1][0],
            LimitSubOrdinal([subord[0] for subord in self.omega1[1][1:]]),
        ).copy()
        self.count_subset.add(omega)
        self.al_count_subset = VGroup(self.omega1[1][:3]).copy()
        self.shifted_count_subset = self.count_subset.copy()
        VGroup(self.al_count_subset,
               self.shifted_count_subset).shift(2 * shift * DOWN)
        omega.stretch_in_place(0, 1)

        self.count_brace = BraceText(self.al_count_subset, "spočetná")
예제 #2
0
    def setup(self):
        self.shift = 1.1
        shift = self.shift

        self.omega = OrdinalOmega()
        self.omega_brace = BraceDesc(self.omega, "\\omega", UP)
        self.omega.set_color(BLUE)

        self.add(self.omega, self.omega_brace)

        # finite subset

        self.subset_fin = VGroup(self.omega[2:30:3]).copy()
        self.al_subset_fin = VGroup(self.omega[:len(self.subset_fin)]).copy()
        self.shifted_subset_fin = self.subset_fin.copy()
        VGroup(self.al_subset_fin, self.shifted_subset_fin).shift(shift * DOWN)

        self.brace_fin = BraceText(self.al_subset_fin, "konečná")

        # infinite subset

        self.subset_inf = LimitSubOrdinal(
            [bar for i, bar in enumerate(self.omega) if is_prime(i)]).copy()
        self.al_subset_inf = self.omega.copy()
        self.shifted_subset_inf = self.subset_inf.copy()
        self.subset_inf.shift(shift * UP)
        VGroup(self.al_subset_inf, self.shifted_subset_inf).shift(shift * DOWN)
        self.brace_inf = BraceText(self.al_subset_inf, "stejná")
예제 #3
0
    def construct(self):

        omega = OrdinalOmega()
        omega_brace = BraceDesc(omega, "\\omega", UP)
        self.add(omega_brace)
        omega, _ = self.play_infinite_supremum(waits=(4, 5.1))
        fin_index = 12
        bar = omega[fin_index].copy()
        bar.highlight(YELLOW)
        arrow = Arrow(
            bar.get_edge_center(DOWN) + DOWN,
            bar.get_edge_center(DOWN),
        )
        label = TextMobject("konečný ordinál").next_to(arrow, DOWN)

        self.wait_to(16)
        self.play(
            ShowCreation(bar),
            ShowCreation(arrow),
            FadeIn(label),
        )

        finite_brace = Brace(VGroup(omega[:fin_index]), DOWN)
        brace_label = label.copy()
        finite_brace.put_at_tip(brace_label)

        self.wait_to(20.3)
        self.play(
            GrowFromCenter(finite_brace),
            ReplacementTransform(label, brace_label),
        )

        terminal_segment_brace = BraceText(
            Line(omega[fin_index + 1].get_center() + DOWN,
                 omega.get_edge_center(RIGHT)), "nekonečno")
        self.wait_to(25.5)
        self.play(terminal_segment_brace.creation_anim())

        self.wait_to(41)
        self.play(
            FadeOut(
                VGroup(
                    finite_brace,
                    brace_label,
                    terminal_segment_brace,
                    bar,
                    arrow,
                )))
예제 #4
0
    def construct(self):

        negatives = VGroup(*[self.number_tex(-n) for n in range(9)])
        positives = VGroup(*[self.number_tex(n) for n in range(9)])
        negatives.shift(UP)

        neg_brace = BraceDesc(negatives, "\\aleph_0", UP)
        pos_brace = BraceDesc(positives, "\\aleph_0", DOWN)

        self.play(ShowCreation(negatives))
        self.play(neg_brace.creation_anim())
        self.dither()

        self.play(ShowCreation(positives))
        self.play(pos_brace.creation_anim())
        self.dither()

        self.play(
            positives.shift,
            UP,
            pos_brace.shift,
            UP,
        )
        self.remove(positives[0])
        self.play(
            FadeOut(pos_brace),
            neg_brace.shift_brace,
            VGroup(negatives, negatives[-1].copy().move_to(positives[-1])),
        )
        self.dither()

        return
        conversation = Conversation(self)
        conversation.add_bubble("Hey, what happened to the merged zero?")
        self.dither()
        conversation.add_bubble("The size is still countable infinite.")
        self.dither()
예제 #5
0
    def construct(self):
        #self.force_skipping()

        self.cur_color = WHITE
        self.number_mul = 1
        self.make_numbers(num_num=14)
        self.numbers.to_corner(UP + LEFT)
        self.numbers.shift(1.5 * RIGHT)
        self.add(self.numbers)

        even, _, even_spaced, even_arranged = self.make_subset(
            lambda n: 2 * n, 3)
        odd, _, odd_spaced, odd_arranged = self.make_subset(
            lambda n: 2 * n + 1, 2)

        odd_arranged.highlight(YELLOW)
        even_arranged.highlight(RED)

        self.play(
            Transform(even, even_spaced),
            Transform(odd, odd_spaced),
        )
        self.play(
            Transform(even, even_arranged),
            Transform(odd, odd_arranged),
        )
        self.dither()

        colors = color_gradient([YELLOW, GREEN, BLUE], 6)
        ori_numbers = self.numbers
        self.numbers = even
        self.number_mul = 2
        self.cur_color = RED

        table = [odd]

        for index, color in enumerate(colors[1:]):
            subodd, _, _, subodd_arranged \
                = self.make_subset(lambda n: 2*n+1, 0)
            table += [subodd]
            subeven, _, subeven_spaced, subeven_arranged \
                = self.make_subset(lambda n: 2*n, 1)
            self.remove(self.numbers)
            self.add(subodd, subeven)
            subodd_arranged.highlight(color)

            self.play(Transform(subeven, subeven_spaced))
            if False and index < 2:
                self.play(Transform(subeven, subeven_arranged))
                self.dither()
                self.play(Transform(subodd, subodd_arranged))
                self.dither()
            else:
                self.play(
                    Transform(subeven, subeven_arranged),
                    Transform(subodd, subodd_arranged),
                )

            self.number_mul *= 2
            self.numbers = subeven

        missing_zero = ori_numbers[0].copy().highlight(RED)
        self.play(Write(missing_zero))
        self.remove(ori_numbers[0])
        ori_numbers.save_state()
        ori_numbers.remove(ori_numbers[0])
        self.play(missing_zero.behind_edge, DOWN)
        self.dither()

        h_brace = BraceDesc(odd, "\\aleph_0", UP)
        h_brace.desc.highlight(YELLOW)
        v_brace = BraceDesc(VGroup(odd, subeven), "\\aleph_0", LEFT)
        v_brace.desc.highlight(BLUE)
        v_brace.shift(0.2 * LEFT)
        self.play(
            FadeOut(ori_numbers),
            h_brace.creation_anim(),
        )
        self.dither()
        self.play(v_brace.creation_anim())

        self.dither()

        prod_formula = TexMobject("\\aleph_0", "\\cdot", "\\aleph_0",
                                  " = \\aleph_0")
        prod_formula[0].highlight(BLUE)
        prod_formula[2].highlight(YELLOW)
        prod_formula.to_corner(LEFT + UP)
        self.play(
            ReplacementTransform(v_brace.desc[0].copy(), prod_formula[0]),
            ReplacementTransform(h_brace.desc[0].copy(), prod_formula[2]),
        )
        self.play(Write(VGroup(prod_formula[1], prod_formula[3])))
        self.dither()

        table_but_first_column = VGroup(*[VGroup(*row[1:]) for row in table])
        self.play(
            FadeOut(VGroup(h_brace, v_brace, prod_formula)),
            table_but_first_column.set_fill,
            None,
            0.4,
        )

        formula_r_ori = None
        for i, row in enumerate(table[:4]):
            formula_r = TexMobject("2^{" + str(i) + "}=")
            formula_r.highlight(
                rgb_to_color(row[0].family_members_with_points()[0].fill_rgb))
            formula_r.next_to(row[0], LEFT, buff=0.3, aligned_edge=DOWN)

            if formula_r_ori is None: self.play(Write(formula_r))
            else: self.play(ReplacementTransform(formula_r_ori, formula_r))
            self.dither()

            formula_r_ori = formula_r

        formula_r = TexMobject("2^r=")
        formula_r.shift(formula_r_ori[0].get_center() -
                        formula_r[0].get_center())
        formula_r.highlight(BLUE)
        formula_r[-1].set_fill(opacity=0)
        formula_r.to_edge(DOWN)
        self.play(ReplacementTransform(formula_r_ori, formula_r))
        self.dither()

        self.play(table_but_first_column.set_fill, None, 1)
        table_but_first_row = VGroup(*table[1:])
        self.play(table_but_first_row.set_fill, None, 0.4)
        self.dither()

        formula_c = TexMobject("(2c+1)")
        formula_c.to_edge(UP)
        formula_c.highlight(YELLOW)
        self.play(Write(formula_c))
        self.dither()
        self.play(table_but_first_row.set_fill, None, 1)

        show_r = 3
        show_c = 5

        show_circ = Circle(radius=0.45)
        show_circ.highlight(GREEN)
        show_circ.move_to(table[show_r][show_c])

        show_r_circ = show_circ.copy()
        show_r_circ.move_to(table[show_r][0], coor_mask=X_MASK)
        show_r_circ.highlight(BLUE)

        show_c_circ = show_circ.copy()
        show_c_circ.move_to(table[0][show_c], coor_mask=Y_MASK)
        show_c_circ.highlight(YELLOW)

        self.play(ShowCreation(show_circ))
        self.play(ShowCreation(show_c_circ))
        self.play(ShowCreation(show_r_circ))
        self.dither()

        formula_prod = TexMobject("2^r", '\\cdot', "(2c+1)", "-1")
        formula_prod.to_corner(UP + LEFT)
        formula_prod[0].highlight(BLUE)
        formula_prod[2].highlight(YELLOW)

        self.play(
            FadeIn(formula_prod[1]),
            ReplacementTransform(formula_r.copy(), formula_prod[0]),
            ReplacementTransform(formula_c.copy(), formula_prod[2]),
        )
        self.dither()
        self.play(
            FadeOut(
                VGroup(formula_r, formula_c, show_circ, show_c_circ,
                       show_r_circ)))
        self.dither()

        pairs_table = VGroup(*[
            VGroup(*[self.pair_tex(r, c, mob) for c, mob in enumerate(row)])
            for r, row in enumerate(table)
        ])
        table = VGroup(*table)

        for row in table:
            for num in row:
                num.submobjects = [VGroup(digit) for digit in num.submobjects]

        self.revert_to_original_skipping_status()
        self.dither()
        self.play(ReplacementTransform(table, pairs_table))
        self.dither()

        h_shift = RIGHT * (table[0][1].get_center() - table[0][0].get_center())
        table = pairs_table
        table_dest = table.copy()
        for r, row in enumerate(table_dest):
            for c, num in enumerate(row):
                num.shift(h_shift * ((2**r) * (2 * c + 1) - 1 - c))
        self.play(Transform(table, table_dest))

        table_dest = table.copy()
        for row in table_dest:
            for num in row:
                num.move_to(2 * DOWN, coor_mask=Y_MASK)
        self.play(Transform(table, table_dest))
        self.dither()

        pairs_row = VGroup(*it.chain(*table))
        pairs_row.submobjects.sort(key=lambda mob: mob.get_center()[0])

        ori_numbers.restore()
        ori_numbers.shift(pairs_row[0].get_center() -
                          ori_numbers[1].get_center())
        ori_numbers.shift(2 * UP)
        self.add(ori_numbers)
        matching = VGroup(*[
            Line(num.get_edge_center(DOWN), pair.get_edge_center(UP), buff=0.2)
            for num, pair in zip(ori_numbers[1:], pairs_row)
        ])
        self.play(
            ShowCreation(ori_numbers),
            ShowCreation(matching),
        )
        self.dither()

        matching.add(matching[-1].copy())
        matching[-1].shift(h_shift)

        general_pair = TexMobject("r,c")
        general_pair[0].highlight(BLUE)
        general_pair[2].highlight(YELLOW)
        visible_formula_prod = VGroup(*formula_prod[:3])
        general_pair.move_to(visible_formula_prod)
        general_pair.shift(2 * DOWN)
        general_matching = Line(general_pair.get_edge_center(UP),
                                visible_formula_prod.get_edge_center(DOWN),
                                buff=0.2)
        self.play(FadeIn(general_pair))
        self.play(ShowCreation(general_matching))
        self.dither()

        self.play(Write(formula_prod[-1]))
        self.play(VGroup(matching, pairs_row).shift, -h_shift)
        self.dither()
예제 #6
0
    def construct(self):

        #self.force_skipping()

        self.make_numbers()
        self.numbers.to_corner(UP + LEFT)

        even, even_ori, even_spaced, even_arranged = self.make_subset(
            lambda n: 2 * n, 2)
        odd, odd_ori, odd_spaced, odd_arranged = self.make_subset(
            lambda n: 2 * n + 1, 3)

        self.add(self.numbers)

        self.play(Transform(even, even_spaced))
        VGroup(even_ori, even_spaced, even_arranged).highlight(RED)
        self.play(Transform(even, even_arranged))
        self.dither()

        self.play(Transform(odd, odd_spaced))
        VGroup(odd_ori, odd_spaced, odd_arranged).highlight(YELLOW)
        self.play(Transform(odd, odd_arranged))
        self.dither()

        brace = BraceDesc(odd, "\\aleph_0")
        self.play(brace.creation_anim())
        self.dither()

        self.play(
            Transform(even, even_spaced),
            Transform(odd, odd_spaced),
        )
        self.play(
            Transform(even, even_ori),
            Transform(odd, odd_ori),
        )
        self.remove(self.numbers)

        self.dither()
        self.play(
            Transform(even, even_spaced),
            Transform(odd, odd_spaced),
        )
        self.play(
            Transform(even, even_arranged),
            Transform(odd, odd_arranged),
        )
        self.dither()

        even_abstr = VGroup(
            *[Dot(num.get_center(), color=RED) for num in even])
        odd_abstr = VGroup(
            *[Dot(num.get_center(), color=YELLOW) for num in odd])
        self.play(
            Transform(even, even_abstr),
            Transform(odd, odd_abstr),
        )
        self.dither()

        apples_shrinked, apples, apples_spaced, apples_in_set \
            = self.make_fruit_set(Apple().scale(0.6),
                                  even_arranged, even_spaced, even_ori)
        pears_shrinked, pears, pears_spaced, pears_in_set \
            = self.make_fruit_set(Pear().scale(0.6),
                                  odd_arranged, odd_spaced, odd_ori)
        self.play(
            ReplacementTransform(apples_shrinked, apples),
            ReplacementTransform(pears_shrinked, pears),
        )
        self.remove(even, odd)
        self.dither()

        self.play(
            Transform(apples, apples_spaced),
            Transform(pears, pears_spaced),
        )
        self.play(
            Transform(apples, apples_in_set),
            Transform(pears, pears_in_set),
        )
        self.dither()

        sum_formula = TexMobject('\\aleph_0', '+', '\\aleph_0', "=\\aleph_0")
        sum_formula[0].highlight(RED)
        sum_formula[2].highlight(YELLOW)
        sum_formula.shift(BOTTOM / 2)
        self.play(Write(sum_formula))
        self.dither()
예제 #7
0
    def construct(self):

        self.h_space = 2
        self.colors = color_gradient(
            [YELLOW, GREEN, BLUE, DARK_BLUE, DARK_GRAY], 20)

        numbers = self.make_numbers()
        self.play(
            ShowCreation(numbers[0]),
            ShowCreation(numbers[1]),
        )
        brace = BraceDesc(numbers[0], "\\aleph_0", DOWN)
        brace.next_to(numbers[1], DOWN, coor_mask=Y_MASK, buff=0.3)
        self.play(brace.creation_anim())

        skip = False
        denominator = 2
        parts = []
        while True:
            parts.append(numbers[0].copy())
            self.add(parts[-1])
            self.play(VGroup(numbers, brace).shift, 0.9 * DOWN)
            self.remove(numbers)
            if denominator == 6: break
            numbers = self.make_numbers(denominator, numbers)
            ori_numbers = self.make_numbers(denominator - 1, numbers)
            if skip:
                offset = (len(ori_numbers[1]) // 2 + 1) % 2
                for label in ori_numbers[1][offset::2]:
                    label.set_fill(opacity=0)
            if denominator == 4: skip = True
            if skip:
                offset = (len(numbers[1]) // 2 + 1) % 2
                for label in numbers[1][offset::2]:
                    label.set_fill(opacity=0)

            self.play(ReplacementTransform(ori_numbers, numbers))
            denominator += 1

        self.dither()
        self.remove(brace, numbers)

        while denominator < len(self.colors) + 1:
            part = self.make_dots(denominator)
            part.move_to(parts[-1])
            part.shift(0.5 * DOWN)
            parts.append(part)
            denominator += 1

        parts.reverse()
        parts = VGroup(*parts)
        parts_dest = parts.copy()
        for part in parts_dest:
            part.center()
        self.play(Transform(parts, parts_dest), run_time=2)
        self.dither()

        rationals = TexMobject('|', "\\text{Rational Numbers}",
                               "| = \\aleph_0")
        rationals.shift(0.5 * DOWN - rationals[1].get_edge_center(UP))
        self.play(Write(rationals[1]))
        self.dither()

        dots7 = self.make_dots(7)
        dots7.shift(2 * DOWN)
        center = len(dots7) // 2
        pi_dot = dots7[center + 22]
        pi_label = TexMobject("\\frac{22}{7}")
        pi_label.next_to(pi_dot, DOWN)
        self.play(Write(pi_label))
        self.dither()
        self.play(ShowCreation(dots7))
        self.play(FocusOn2(pi_dot, scale=3))
        dots7.remove(pi_dot)
        self.play(FadeOut(dots7))
        self.play(VGroup(pi_dot, pi_label).shift, 2 * UP)
        self.dither()

        self.play(FadeOut(VGroup(pi_dot, pi_label)))
        self.play(Write(VGroup(rationals[0], rationals[2])))

        conversation1 = Conversation(self)
        conversation1.add_bubble("Are all sets countable?")
        self.dither()
        conversation2 = Conversation(self, start_answer=True)
        conversation2.add_bubble("Of course not.")
        self.dither()

        self.prepare_overall_picture()
        self.overall_picture.to_edge(UP, buff=0.4)
        self.overall_picture.remove(self.uncountable_brace)
        self.play(FadeIn(self.overall_picture))
        self.dither()
        self.play(self.uncountable_brace.creation_anim())
        self.dither()
        real_size = TexMobject("|\\mathbb R|")
        real_size.set_color(GREEN)
        real_size.next_to(self.sizes, buff=1)
        self.play(Write(real_size))
        self.dither()
예제 #8
0
    def construct(self):
        self.prepare_overall_picture()
        self.subtitle.to_edge(UP)
        self.add(self.subtitle)
        self.overall_picture.remove(self.finite_brace, self.infinite_brace)
        self.overall_picture.next_to(self.subtitle,
                                     DOWN,
                                     buff=0.5,
                                     coor_mask=Y_MASK)
        real_size = TexMobject("|\\mathbb R|")
        real_size.set_color(GREEN)
        real_size.next_to(self.sizes, buff=1)
        self.sizes.add(real_size)
        self.play(FadeIn(self.sizes))
        self.play(self.countable_brace.creation_anim())
        self.play(self.uncountable_brace.creation_anim())

        ordinal_bg = OrdinalFiniteProd(OrdinalOmega, 3, x1=8)
        ordinal_bg.shift(2 * DOWN)
        ordinals_title = TextMobject("Ordinály")
        ordinals_title.next_to(ordinal_bg, UP, aligned_edge=LEFT, buff=0.3)
        ordinal = VGroup(ordinal_bg[0], VGroup(*ordinal_bg[1][:3])).copy()
        ordinal_bg.set_color(DARK_GREY)
        self.wait_to(3.7)
        self.play(FadeIn(ordinal_bg), FadeIn(ordinals_title))
        self.play(ShowCreation(ordinal[0]))
        self.play(ShowCreation(ordinal[1]))
        self.dither()
        self.wait_to(11.5)
        self.play(FadeOut(self.overall_picture))

        card_sum = TexMobject("\\aleph_0 + \\aleph_0 = \\aleph_0")
        card_prod = TexMobject("\\aleph_0\\cdot\\aleph_0 = \\aleph_0")
        card_sum.next_to(self.subtitle, DOWN)
        card_prod.next_to(card_sum, DOWN)
        card_prod.shift(
            (card_sum[-1].get_center() - card_prod[-1].get_center()) * X_MASK)
        self.play(Write(card_sum))
        self.wait_to(17.7)
        self.play(Write(card_prod))

        ordinal_dest = ordinal.copy()
        ordinal_bg_dest = ordinal_bg.copy()
        ordinals_title_dest = ordinals_title.copy()
        VGroup(ordinal_bg_dest, ordinal_dest,
               ordinals_title_dest).shift(0.7 * UP)
        ord_type_brace = BraceDesc(ordinal_dest, "\\omega+3")
        self.wait_to(22)
        self.play(
            Transform(ordinal_bg, ordinal_bg_dest),
            Transform(ordinal, ordinal_dest),
            Transform(ordinals_title, ordinals_title_dest),
            ord_type_brace.creation_anim(),
        )
        bar = ordinal_bg[1][3].copy()
        bar.set_color(BLUE)
        pointer = TrianglePointer(color=BLUE).next_to(bar, UP)
        index_label = ord_type_brace.desc.copy()
        index_label.set_color(BLUE)
        index_label.next_to(pointer, UP)
        self.wait_to(29.5)
        self.play(
            ShowCreation(bar),
            FadeIn(pointer),
            FadeIn(index_label),
        )
        self.wait_to(36.5)
예제 #9
0
    def construct(self):

        #self.force_skipping()
        supremum = Supremum.construct(self, fast_play=True)  # 2

        self.wait_to(3)
        omega1_brace = BraceDesc(supremum, "\\omega_1", UP)
        self.play(omega1_brace.creation_anim())

        omega1 = Omega1()
        omega1_src = omega1.copy()
        omega1_src[0].highlight(BLACK)
        omega1_src[1].next_to(supremum, buff=0)
        omega1_src[1].add_to_back(*supremum.submobjects)

        self.wait_to(6.5)
        self.play(
            ReplacementTransform(omega1_src, omega1),
            omega1_brace.shift_brace,
            omega1,
        )
        self.revert_to_original_skipping_status()

        countable_point = Dot(2 * RIGHT)
        countable_point.set_color(YELLOW)
        countable_arrow = Arrow(
            countable_point.get_center() + DOWN,
            countable_point.get_center(),
        )
        countable_label = TextMobject("spočetný ordinál")
        countable_label.next_to(countable_arrow, DOWN)

        brace = Brace(
            Line(omega1.get_corner(LEFT + DOWN), countable_point.get_center()),
            DOWN)
        brace_label = countable_label.copy()
        brace.put_at_tip(brace_label)

        self.wait_to(9)
        self.play(
            FadeIn(countable_label),
            FadeIn(countable_point),
            ShowCreation(countable_arrow),
        )
        self.wait_to(11.5)
        self.play(
            GrowFromCenter(brace),
            ReplacementTransform(countable_label, brace_label),
        )
        self.wait_to(24.5)

        uncountable_brace = Brace(omega1, DOWN)
        uncountable_label = TextMobject("nespočetný ordinál")
        uncountable_brace.put_at_tip(uncountable_label)
        brace_label.add_to_back(brace_label[0].copy(), brace_label[0].copy())

        self.play(
            Transform(brace, uncountable_brace),
            Transform(brace_label, uncountable_label),
        )
        self.remove(brace_label)
        brace_label = TextMobject("nespočetný", "ordinál")
        brace.put_at_tip(brace_label)
        self.add(brace_label)

        uncountable_brace = Brace(
            Line(countable_point.get_center() + DOWN,
                 omega1[0].get_edge_center(RIGHT)), DOWN)
        uncountable_label = TextMobject("nespočetno", "ordinál")
        uncountable_brace.put_at_tip(uncountable_label)
        uncountable_label[1].highlight(BLACK)
        uncountable_label.shift(uncountable_label.get_center() -
                                uncountable_label[0].get_center())

        self.wait_to(46)
        self.play(
            Transform(brace, uncountable_brace),
            Transform(brace_label, uncountable_label),
        )
        self.wait_to(56)

        omega = OrdinalOmega()
        self.play(
            FadeOut(
                VGroup(
                    omega1,
                    brace,
                    brace_label,
                    countable_point,
                    countable_arrow,
                )),
            omega1_brace.change_brace_desc,
            omega,
            "\\omega",
        )
예제 #10
0
    def construct(self, fast_play=False):
        #self.force_skipping()
        omega = OrdinalOmega()
        omega_plus_5 = OrdinalSum(OrdinalOmega, 0.75,
                                  lambda **kwargs: OrdinalFinite(5, **kwargs))
        omega_times_3 = OrdinalFiniteProd(OrdinalOmega, 3)
        omega_pow_3 = make_ordinal_power(3, q=(0.7, 0.84, 0.84))
        ordinals = VGroup(omega, omega_plus_5, omega_times_3, omega_pow_3)
        ordinals.stretch(0.4, 1)
        ordinals.arrange_submobjects(DOWN, aligned_edge=LEFT, center=False)
        ordinals.shift(-Y_MASK * ordinals.get_center())
        dots = TexMobject("\\vdots")
        dots.next_to(ordinals, DOWN)

        if fast_play:
            self.add(ordinals, dots)
        else:
            self.play(ShowCreation(omega))
            self.wait_to(6)
            self.play(ShowCreation(omega_plus_5))
            self.wait_to(7.3)
            self.play(ShowCreation(omega_times_3))
            self.wait_to(8.7)
            self.play(ShowCreation(omega_pow_3))
            self.play(FadeIn(dots))

        result = OrdinalFiniteProd(OrdinalOmega, 5, x1=8)
        result_stretched = result.copy()
        result_stretched.stretch(
            omega[0].get_height() / result_stretched[0][0].get_height(), 1)

        al_omega = result_stretched[0].copy()
        al_omega.shift(omega[0].get_center() - al_omega[0].get_center())

        al_omega_plus_5 = VGroup(result_stretched[0].copy())
        al_omega_plus_5.shift(omega_plus_5[0][0].get_center() -
                              al_omega_plus_5[0][0].get_center())
        al_five = omega_plus_5[1].copy()
        for bar, dest in zip(al_five, result[1]):
            bar.move_to(dest, coor_mask=X_MASK)
        al_omega_plus_5.add(al_five)

        al_omega_times_3 = VGroup(*result_stretched[:3]).copy()
        al_omega_times_3.shift(omega_times_3[0][0].get_center() -
                               al_omega_times_3[0][0].get_center())

        result_in_pow_3 = result_stretched.copy()
        result_in_pow_3.shift(omega_pow_3[0][0][0].get_center() -
                              result_in_pow_3[0][0].get_center())
        al_omega_pow_3 = omega_pow_3.copy()
        al_omega_pow_3.next_to(result_in_pow_3, buff=0)
        al_omega_pow_3[0].add_to_back(*result_in_pow_3.submobjects)

        al_ordinals = VGroup(al_omega, al_omega_plus_5, al_omega_times_3,
                             al_omega_pow_3)
        if not fast_play: self.wait_to(17.5)
        self.play(ReplacementTransform(ordinals, al_ordinals))

        al_ordinals.remove(al_omega_pow_3)
        al_ordinals.add(result_in_pow_3)
        result_bottom = result.copy()
        result_bottom.stretch(0, 1)
        result_bottom = VGroup(*[result_bottom.copy() for _ in range(5)])
        result_bottom.arrange_submobjects(DOWN, buff=0.3, center=False)
        result_bottom.to_edge(DOWN, buff=0)
        al_ordinals.add(result_bottom)

        mrg_omega = result[0].copy()
        mrg_omega_plus_5 = VGroup(result[0], VGroup(*result[1][:5])).copy()
        mrg_omega_times_3 = VGroup(*result[:3]).copy()
        mrg_ordinals = VGroup(
            mrg_omega,
            mrg_omega_plus_5,
            mrg_omega_times_3,
            result.copy(),
            VGroup(result.copy()),
        )
        if not fast_play: self.wait_to(19)
        self.play(
            FadeOut(dots),
            ReplacementTransform(al_ordinals, mrg_ordinals),
        )

        self.remove(mrg_ordinals)
        self.add(result)
        if fast_play: return result
        brace = BraceDesc(result, "\\omega_1", UP)
        self.wait_to(20.2)
        self.play(brace.creation_anim())
        self.wait_to(22)

        conversation = Conversation(self)
        conversation.add_bubble(
            "Ale podle kapitoly 5 si nemůžeme vzít všechny ordinály.")
        self.wait_to(29.5)
        conversation.add_bubble("To ne, ale všechny spočetné můžeme.")
        self.wait_to(39)

        self.add_foreground_mobjects(conversation.dialog)
        self.play(FadeOut(VGroup(brace, result)))

        omega = OrdinalOmega()
        omega.shift(2 * UP)
        self.play(ShowCreation(omega))
        self.wait_to(48.5)
        self.play(FadeOut(conversation.dialog))
예제 #11
0
    def construct(self):

        num = 5
        ordinals_cnt_base = OrdinalFiniteProd(OrdinalOmega,
                                              num,
                                              x1=-4 + num * 2.5)

        ordinals_cnt = VGroup(
            [VGroup(ordinals_cnt_base[:i]).copy() for i in range(1, num + 1)])
        ordinals_cnt.save_state()
        ordinals_cnt.arrange_submobjects(DOWN, center=False, coor_mask=Y_MASK)
        ordinals_cnt.to_edge(UP)

        self.play(ShowCreation(ordinals_cnt))

        #self.wait_to(7)
        self.dither()
        self.play(ordinals_cnt.restore)

        self.remove(ordinals_cnt)
        self.add(ordinals_cnt_base)

        omega1 = Omega1()
        brace = BraceDesc(omega1, "\\omega_1", DOWN)

        omega1.line.save_state()
        omega1.line.behind_edge(RIGHT)

        omega1_bars_src = make_ordinal_power(2)
        omega1_bars_src.next_to(ordinals_cnt_base)
        omega1_bars_src.add_to_back(*ordinals_cnt_base)

        brace.desc.highlight(BLUE)
        brace.save_state()
        brace.shift_brace(omega1_bars_src)
        brace.highlight(BLACK)

        self.play(
            brace.restore,
            omega1.line.restore,
            ReplacementTransform(omega1_bars_src, omega1.bars),
        )

        #self.wait_to(11)
        self.dither()

        aleph1 = TexMobject("\\aleph_1", "=|", "\omega_1", "|")
        aleph1[2].highlight(BLUE)
        aleph1[0].highlight(RED)
        aleph1.shift(brace.desc.get_center() - aleph1[2].get_center())
        aleph1.remove(aleph1[2])

        self.play(Write(aleph1))
        #self.wait_to(15)
        self.dither()

        ordinals_a1 = VGroup([omega1.copy() for _ in range(num)])

        aleph1[0].save_state()
        aleph1[0].next_to(omega1, LEFT, coor_mask=X_MASK)
        self.play(
            omega1.to_edge,
            UP,
            FadeOut(VGroup(brace, aleph1[1:])),
            MoveFromSaved(aleph1[0]),
        )
        #self.wait_to(18.5)
        self.dither()
        aleph1 = aleph1[0]

        scale_center = np.array(ordinals_a1[0].line.get_start())
        for i, o in enumerate(ordinals_a1):
            o.line.scale(1 + i * 0.2, about_point=scale_center)

        ordinals_a1_lines_dest = VGroup([o.line for o in ordinals_a1]).copy()
        ordinals_a1_bars_dest = VGroup([o.bars for o in ordinals_a1]).copy()
        ordinals_a1.arrange_submobjects(DOWN, False, coor_mask=Y_MASK)
        ordinals_a1.to_edge(UP)
        ordinals_a1_lines = VGroup([o.line for o in ordinals_a1])
        ordinals_a1_bars = VGroup([o.bars for o in ordinals_a1])

        self.remove(omega1)
        self.add(ordinals_a1[0])
        self.play(FadeIn(VGroup(ordinals_a1[1:])))
        self.play(
            Transform(ordinals_a1_lines, ordinals_a1_lines_dest),
            Transform(ordinals_a1_bars, ordinals_a1_bars_dest),
        )
        self.remove(*ordinals_a1[:-1])
        omega2_src = ordinals_a1[-1]
        omega2 = LongOrdinal(ordinal_end=0.3, line_start=0.2)

        brace = BraceDesc(omega2, "\\omega_2", DOWN)
        brace.desc.highlight(BLUE)
        brace.save_state()
        brace.shift_brace(omega2_src)
        brace.highlight(BLACK)

        self.play(
            brace.restore,
            ReplacementTransform(omega2_src, omega2),
        )

        #self.wait_to(24.5)
        self.dither()

        aleph2 = TexMobject("\\aleph_2", "=|", "\omega_2", "|")
        aleph2[2].highlight(BLUE)
        aleph2[0].highlight(RED)
        aleph2.shift(brace.desc.get_center() - aleph2[2].get_center())
        aleph2.remove(aleph2[2])

        self.play(Write(aleph2))
        #self.wait_to(28)
        self.dither()

        ordinal_fin = OrdinalFinite(7, x1=SPACE_WIDTH + 1).highlight(BLUE)
        ord_labels = VGroup([
            TexMobject("\\omega_{}".format(i + 1)).highlight(BLUE).next_to(
                bar, UP) for i, bar in enumerate(ordinal_fin[:4])
        ])
        card_labels = VGroup([
            TexMobject("\\aleph_{}".format(i + 1)).highlight(RED).next_to(
                bar, DOWN) for i, bar in enumerate(ordinal_fin[:4])
        ])

        self.play(
            FadeOut(VGroup(aleph2[1:], brace, omega2)),
            ReplacementTransform(aleph1, card_labels[0]),
            ReplacementTransform(aleph2[0], card_labels[1]),
        )

        for i, t in enumerate((29, 31, 35.5, 38)):
            #self.wait_to(t)
            self.play(FadeIn(ord_labels[i]), ShowCreation(ordinal_fin[i]))
            if i >= 2: self.play(FadeIn(card_labels[i]))

        #self.wait_to(41)
        self.play(ShowCreation(VGroup(ordinal_fin[4:], rate_func=rush_into)))

        omega = OrdinalOmega().highlight(BLUE)
        omega_src = omega.copy()
        omega_src.next_to(ordinal_fin, buff=1)
        omega_src.add_to_back(*ordinal_fin)

        label1 = VGroup(ord_labels[0], card_labels[0])
        labels_to_fade = VGroup(list(zip(ord_labels[1:], card_labels[1:])))
        labels_to_fade.save_state()
        for l, bar in zip(labels_to_fade, omega[1:4]):
            l.move_to(bar, coor_mask=X_MASK)
            l.highlight(BLACK)

        limit_bar = omega[0].copy().next_to(omega)
        limit_lord = TexMobject("\\omega_\\omega").highlight(BLUE).next_to(
            limit_bar, UP)
        limit_lcard = TexMobject("\\aleph_\\omega").highlight(RED).next_to(
            limit_bar, DOWN)
        limit_g = VGroup(limit_bar, limit_lord, limit_lcard)

        limit_g.next_to(omega, coor_mask=X_MASK)
        limit_g.save_state()
        limit_g.next_to(omega_src, coor_mask=X_MASK)

        self.play(
            MoveFromSaved(labels_to_fade),
            ReplacementTransform(omega_src, omega),
            Animation(label1),
            limit_g.restore,
        )
        self.remove(labels_to_fade)
        #self.wait_to(52)

        plus1_bar = limit_bar.copy()
        plus1_label = TexMobject("\\omega_{\\omega+1}").highlight(
            BLUE).next_to(plus1_bar, UP)
        plus1_g = VGroup(plus1_bar, plus1_label)
        plus1_g.next_to(limit_g, coor_mask=X_MASK, buff=0.5)

        self.play(FadeIn(plus1_label), ShowCreation(plus1_bar))
        #self.wait_to(55)

        omega_pow = make_ordinal_power(2, q=(0.8, 0.9, 0.9)).highlight(BLUE)
        omega_pow_src = omega_pow.copy()
        omega_pow_src.behind_edge(RIGHT)
        omega_pow_src[0].add_to_back(limit_bar, plus1_bar)
        omega_pow_src.add_to_back(omega)

        limit_g.remove(limit_bar)
        limit_g.save_state()
        plus1_label.save_state()

        limit_g.move_to(omega_pow[1][0], coor_mask=X_MASK)
        plus1_label.move_to(omega_pow[1][1], coor_mask=X_MASK).highlight(BLACK)

        pow_bar = limit_bar.copy()
        pow_label = TexMobject("\\omega_{\\omega\\cdot\\omega}").highlight(
            BLUE).next_to(pow_bar, UP)
        pow_g = VGroup(pow_bar, pow_label)
        pow_g.next_to(omega_pow, coor_mask=X_MASK, buff=-.2)
        pow_g.save_state()
        pow_g.next_to(omega_pow_src, coor_mask=X_MASK)

        self.play(
            MoveFromSaved(plus1_label),
            ReplacementTransform(omega_pow_src, omega_pow),
            MoveFromSaved(limit_g),
            pow_g.restore,
        )
        self.remove(plus1_label)

        #self.wait_to(59)
        self.dither()

        labels_to_fade = VGroup(label1, limit_g, pow_label)
        labels_to_fade.save_state()
        labels_to_fade.highlight(BLACK)

        omega1 = Omega1(color=BLUE)
        omega1_bar = pow_bar.copy()
        omega1_label = TexMobject("\\omega_{\\omega_1}").highlight(
            BLUE).next_to(omega1_bar, UP)
        omega1_g = VGroup(omega1_bar, omega1_label)
        omega1_g.shift(omega1.line.get_end() - omega1_bar.get_center())
        omega1_g.add(omega1.line)
        omega1_g.save_state()
        omega1_g.behind_edge(RIGHT)

        limit_g.move_to(omega1.bars[1][0], coor_mask=X_MASK)
        pow_label.move_to(omega1.bars[-1], coor_mask=X_MASK)
        pow_bar.save_state()
        pow_bar.scale(0)
        pow_bar.set_stroke(width=0)
        pow_bar.move_to(omega1.bars[-1])

        self.play(
            MoveFromSaved(labels_to_fade, remover=True),
            omega1_g.restore,
            MoveFromSaved(pow_bar, remover=True),
            ReplacementTransform(omega_pow, omega1.bars),
        )
        #self.wait_to(60+7.5)
        self.dither()

        ordinal_fin = OrdinalFinite(6, x1=SPACE_WIDTH + 1).highlight(BLUE)
        omega1.save_state()
        omega1.stretch_about_point(0, 0, ordinal_fin[0].get_center())

        labels = VGroup([
            TexMobject((i + 1) * "\\omega_{" + "\\omega_1" +
                       (i + 1) * "}").next_to(bar, UP)
            for i, bar in enumerate(ordinal_fin[:3])
        ])
        labels.highlight(BLUE)

        next_bar = VGroup(labels[1], ordinal_fin[1])
        next_bar.save_state()
        next_bar.shift(8 * RIGHT)

        self.play(
            MoveFromSaved(omega1, remover=True),
            next_bar.restore,
            ReplacementTransform(omega1_label, labels[0]),
            ReplacementTransform(omega1_bar, ordinal_fin[0]),
        )
        #self.wait_to(60+11)
        self.play(FadeIn(labels[2]), ShowCreation(ordinal_fin[2]))
        #self.wait_to(60+13)
        self.play(ShowCreation(VGroup(ordinal_fin[3:]), rate_func=rush_into))
        #self.wait_to(60+21.5)
        self.dither(2)

        conversation = Conversation(self)
        conversation.add_bubble("What about the union of all the ordinals?")

        self.play(FadeOut(VGroup(labels, ordinal_fin)),
                  Animation(conversation.dialog))