Fractals in Seeded Tile Automata
Abstract
This work fully characterizes fractal generation in the seeded Tile Automata model (seeded TA), a model similar to the abstract Tile Assembly model (aTAM) with the added ability for adjacent tiles to change states. Under these assumptions, we first show that all discrete self-similar fractals (DSSFs) with feasible generators are strictly buildable at scale 1 and temperature 1 in seeded TA. We then show that these results imply the existence of a single seeded TA system that can strictly build any DSSF infinitely at scale 1 and temperature 1.
Keywords and phrases:
self-assembly, tile automata, fractalsCopyright and License:
2012 ACM Subject Classification:
Theory of computationFunding:
This research was supported in part by National Science Foundation Grant CCF-2329918.Editors:
Kitty Meeks and Christian ScheidelerSeries and Publisher:
Leibniz International Proceedings in Informatics, Schloss Dagstuhl – Leibniz-Zentrum für Informatik
1 Introduction
The past 20 years within the field of algorithmic self-assembly has led to an extensive analysis among numerous models that reflect the behavior of microscopic organisms and processes in nature. Some of these models include the abstract Tile Assembly Model (aTAM) [19] in which non-rotatable tiles attach to existing structures, the 2-Handed Assembly Model (2HAM) [13], where 2 existing structures can attach at a time, and the Signal-passing Tile Assembly model (STAM) [12] that allows for both tile detachment and dynamic behavior between tiles as the system grows. Although these models are theoretical, they are motivated by natural mechanisms. Approaching solutions from the implementation side, a lot of work has been done experimentally in not only building complex structures [16, 17, 19], but also performing non-trivial computation [7, 20]. However, from both a theoretical and experimental viewpoint, some of the most intriguing questions are those that study the geometric limitations of each model such as whether it is possible to build some specific shape in a given model.
For many of these models, general shape building has been resolved. For instance, in the aTAM, any finite shape may be constructed if finite scaling is allowed [18]. For specific types of shapes though, such as different classes of fractals, most models still have open questions. For infinite discrete self-similar fractals (DSSFs), some shapes are strictly buildable (without error) [3], while others exhibiting specific properties such as “pinch point” fractals are not [2, 8]. Recent work in SODA 2025 [4] has provided a complete, polynomial-time decidable categorization of which DSSFs are buildable within the aTAM.
While many DSSFs can be weakly assembled (with error) at temperature 1 in the aTAM, there does not exist a DSSF that can be strictly assembled at temperature 1 [14]. In contrast, the 2HAM and STAM models yield more positive results. The work of [6, 10] shows that in comparison to the aTAM, the 2HAM (and -HAM) can build a larger class of discrete self-similar fractals. In [9], they show that any arbitrary DSSF can be strictly assembled in the STAM with detachments. Even without detachments, the limited number of times a STAM tile can change states makes some fractals impossible to build at any temperature.
Thus, there exists a middle ground between the growth only, no detachment aTAM, where a limited number of fractals are strictly buildable, in comparison to the state-changing STAM with detachment, where every arbitrary DSSF is strictly buildable. Our work focuses on bridging this gap through a study of building DSSFs in the seeded Tile Automata Model (seeded TA), a model that differs from the passive assembly aTAM by the ability for adjacent tiles to actively change states similar to cellular automata, but does not allow the powerful operation of the detachment of placed tiles. TA can also be simulated by the STAM [5].
Most related to our work is that of [11], in which it was shown that for a special class of DSSFs with “ham-path generators”, there exists a seeded TA system that can strictly build the DSSF. Our work focuses on extending these results to any general DSSF in two ways. We first show that for every arbitrary fractal , there exists a seeded TA system that strictly builds infinitely with a finite number of states, transitions, and affinities. We then show that under these constructions, there exists a single seeded TA system that can strictly build any DSSF infinitely at temperature 1, thus providing a full characterization for fractal generation in seeded TA. An emulator of this seeded TA system can be found at https://github.com/rknobel1/fractals.
2 Preliminaries
This section defines the model, discrete self-similar fractals, and strictly building shapes similar to the previous definitions in [1, 15].
Seeded Tile Automata
Let denote a set of states or symbols. A tile is a non-rotatable unit square placed at point and has a state of . An affinity function over a set of states takes an ordered pair of states and an orientation , where , and outputs an element of . The orientation is the relative position to each other with meaning vertical and meaning horizontal, with the being the west or north state respectively. A transition rule consists of two ordered pairs of states and an orientation , where . This denotes that if the states are next to each other in orientation as the west/north state) they may be replaced by the states . An assembly is a set of tiles with states in such that for every pair of tiles . Informally, each position contains at most one tile.
Let be the bond graph formed by taking a node for each tile in and adding an edge between neighboring tiles and with a weight equal to . We say an assembly is stable for some if the minimum cut through is greater than or equal to .
A Seeded Tile Automata system is a tuple where is a set of states, a set of initial states, is an affinity function, is a set of transition rules, is a stable assembly called the seed assembly, and is the temperature (or threshold). A tile may attach to an assembly at temperature to build an assembly if is stable and . We denote this as . An assembly can transition to an assembly if there exist two neighboring tiles (where is the west or north tile) such that there exists a transition rule in with the first pair being , the second pair being some pair of states such that . We denote this as . For this paper, we focus on systems of temperature , and all bond strengths are equal to 0 or 1.
An assembly sequence in is a (finite or infinite) sequence of assemblies such that each or . An assembly sub-sequence in is a (finite or infinite) sequence of assemblies such that for each there exists an assembly sequence . We define the shape of an assembly , denoted , as the set of points .
Discrete Self-Similar Fractals
Let and . We say that is a -discrete self-similar fractal if there is a set with , such that , where is the stage of satisfying = , , and . In this case, we say that generates (see Figure 1 for an example). We say that is a discrete self-similar fractal if it is a -discrete self-similar fractal for some . A generator is termed feasible if it is a connected set, and there exist (not necessarily distinct) points , i.e., a pair of points on each opposing edge of the generator bounding box that share the same row or column. Note that the fractal generated by a generator is connected if and only if the generator is feasible. For the remainder of this paper we only consider feasible generators. An example of a non-feasible generator is shown in Figure 2.
Strict Self-Assembly.
Let be a discrete self-similar fractal with a feasible generator . Consider a seeded TA system with , and let denote the set of all valid assembly sequences for . strictly builds if , is infinite and .
Other Notation.
Let be an assembly. We denote as if . We refer to a particular sub-assembly of as , where , if for and . For convenience, we also refer to a sub-assembly with shape as for and , or in other words, a translation of units horizontally and units vertically.
Let be a feasible generator with points and be the discrete self-similar fractal corresponding to . We denote key positions for some as four points satisfying , , and . The four tiles with positions , respectively, are called key tiles. We denote as the origin tile if has position .111While not all generators contain the origin (e.g., the 5-point cross), we consider generators that do have it for simplicity and note that our constructions work for any arbitrarily chosen tile as the origin tile.
3 The Complete Algorithm
A formal description of the complete algorithm is shown in Algorithm 1 and is based on the sub procedures detailed throughout Sections 5, 6, and 7, which include Algorithms 5 through 14. Let be a generator for DSSF , with denoting the seed assembly generated from Section 5. The basic idea behind this algorithm is shown in Figure 3.
4 Construction Preliminaries
We start by detailing the notation used in Sections 6 and 7. With the ability for tiles to transition between multiple states, it is possible to encode information as the state of the tile and update this state as the assembly grows. Thus, for ease of understanding, we consider tiles as a class, with each tile an object of this class with accessible fields. We denote accessing a specific field as t.field_name. We also make use of functions in standard form function_name(parameters).
4.1 Stored Tile Information
The following are accessible fields for a given tile , i.e., these are the attributes of the object. Let .
-
state. Takes a value of None, P, W, F with a default of None. These values denote whether a tile is not ready to produce (None), has not placed itself yet (Producing), is currently placing itself (Waiting), or has placed itself (Finished).
-
copy_direction. Takes a value of N, E, W, S, None or r with a default of None. These values denote if should be copied in the sub-assembly to the north (N), east (E), west (W), south (S), or not (None), or if the sub-assembly is being reset (r).
-
origin_direction. Takes a value of N, E, W, S, *. These values denote the direction to the original seed. A value of * denotes that is the original seed.
-
key_d. Takes a value of N, E, W, S, *. These values denote the direction to key tile . A value of * denotes that is the key tile for direction .
-
new_key_tile. Takes a value of True or False with a default of False. These values denote if will become a key tile for the growing assembly (True) or not (False).
-
neighbors. Takes a value of the power-set . These values denote the direction to some (but not always all) adjacent tiles to . Informally, we say if is in direction from , where .
-
new_neighbors. Takes a value of the power-set with a default of None. These values denote the direction to any new neighbors of as the assembly grows.
-
state_d. Takes a value of N, W, M, Y, None. These values denote whether the sub-assembly stemming from direction is not complete (N), placing a tile (W), placed a tile and might now be complete (M), complete (Y), or does not exist (None).
-
transfer. Points to a created tile or takes a value of , , or None with a default of None. These values denote whether the tile is passing a signal or not, or if the sub-assembly is ready to globally reset (r).
-
terminal. Takes a value of True or False. These values denote if a tile is terminal (True) or not (False).
-
caps. Takes a value of the power-set with a default of None. These values denote that the sub-assembly stemming from each direction in is complete.
-
pseudo_seed. Takes a value of True or False with a default of False. These values denote if the current tile is a pseudo-seed (True) or not (False).
-
will_be_pseudo_seed. Takes a value of True or False with a default of False. These values denote if the current tile will be a pseudo-seed (True) or not (False) for the created assembly.
-
original_seed. Takes a value of True or False with a default of False. These values denote if the current tile is the origin tile (True) or not (False).
-
copied. Takes a value of True or False with a default of False. These values denote if is a copied tile (True) or not (False).
-
sub_assembly_copied. Takes a value of True or False with a default of False. These values denote if the sub-assembly corresponding to is complete (True) or not (False).
-
first_tile. Takes a value of True or False with a default of False. These values denote if is the first tile copied for a sub-assembly (True) or not (False).
-
can_place. Takes a value of True or False with a default of False. These values denote if can copy itself (True) or not (False).
-
num_times_copied. Takes a value with a default of 0. These values denote the number of times the sub-assembly corresponding to has been copied.
-
counter. Takes a value or None with a default of None. This counter field is used primarily for synchronization.
-
temp. Default of None. Used to store temporary information.
4.2 Functions
The following details certain functions that will be used.
-
opp(d). Takes a direction and outputs the “opposite” direction , , , .
-
retrieve_tile(t, d). Takes a tile and direction and outputs the neighboring tile in direction .
-
num_comp_sub-assemblies(t). Takes a tile and outputs the number of , or in other words, the number of completed sub-assemblies stemming from .
-
next(t). Takes a tile and outputs the “next” direction for a signal from tile as shown in Algorithm 2.
Algorithm 2 The “next” direction at a given tile . , , , represent the 4 cardinal directions. -
next_tile_placed(t). Takes a tile with and outputs the next tile to get placed as shown in Algorithm 3.
Algorithm 3 The “next” tile to be placed from tile . denotes a “producing” state. , , , represent the 4 cardinal directions. -
breadcrumb(t). Takes a tile and outputs the direction of the “breadcrumb” left by a signal as shown in Algorithm 4.
Algorithm 4 The direction of the “breadcrumb” trail at a tile . “” and “” denote “waiting” and “maybe” states, respectively. , , , represent the 4 cardinal directions.
5 Seed Initialization
This section details how the initial seed for the seeded TA system is constructed given a feasible generator with key positions . The seed is a blank assembly in which each point contains a tile. Each tile begins with default values, and with the tile located at the origin having . An example of an initial seed assembly is shown in Figure 4(a).
Neighbor Initialization.
The first step is to initialize the origin_direction, neighbors, terminal, and state_d fields of each tile, which is achieved by deriving a spanning tree (ST) for the seed assembly from the generator. Start by running a breadth-first search (BFS) from the original seed in which each tile is a vertex and edges exist between cardinally adjacent vertices, leaving a breadcrumb at each tile to denote the previous tile. With this information, we can now initialize the neighbors field for each tile . First, for each adjacent tile in direction , if is marked by , append to . Then, for the tile that marked in direction , append to and . The completion of these steps initialize the origin_direction and neighbors fields for each tile. It is then left to update the terminal and fields. For each tile and for each , set . Furthermore, if , set . An example of the result of this neighbor initialization is shown in Figure 4(b).
Key Tile Initialization.
The next step is to initialize each key_d field. This is achieved by running a BFS from the tile located at the key position for direction on the ST derived from earlier. More formally, for each key tile , start by running a BFS from with a breadcrumb left at each tile denoting the direction to the previous tile. Once all tiles have been marked, set each to denote that is the key tile for direction . Then, for every other tile, set . An example of the result of the key tile initialization is shown in Figure 4(c) for the north direction.
6 Copying Procedure
This section focuses on how an assembly is taken to assembly . Specifically, we consider the copying procedure for a sub-assembly that creates a new sub-assembly . This procedure can be broken down into 4 steps: choosing a copying direction for , copying each tile in to create , readying the newly created , and lastly resetting . Each step heavily relies on synchronicity to ensure each step does not interfere with the others, which will be discussed within each sub-section.
6.1 Choosing a Copying Direction
Choosing a copying direction starts from the origin seed or the pseudo-seed. Let denote this tile. The idea is that looks at adjacent neighbors in each direction . Let be an adjacent tile to in direction . If , then becomes the chosen copying direction, as still needs to be copied in direction . This choice is propagated to all tiles in , using the counter field of each tile to ensure that all tiles receive this signal. Once this is done, then the next step begins. Algorithm 5 explicitly details how this process is undertaken.
6.2 Copying Tiles
With having chosen a direction to copy, the next step is to copy each of the tiles in to create . Let denote the key tile for in direction . Note that all signals between and pass through . Thus, the first tile that must be placed is the key tile for direction , which we denote as . We start by describing how this tile is located, then detail how and in what order each tile is copied.
6.2.1 Locating the First Tile to Place
From Section 6.1, the last tile to get updated is . Thus, locating is a matter of following the direction from each until is reached. Algorithm 6 explicitly details how this process is undertaken.
Once is found, and are set to true. This distinction from other tiles is important for determining when has been completely copied and to start the sub-assembly copying procedure.
6.2.2 Copying a Tile
Copying a given tile happens in two steps. In the first step, a copy of is created. This copy is transferred to , where it can then be transferred to . Once the signal has reached , the copy is transferred using the “next” direction at each tile until a tile no longer exists where the signal needs to go. The copy is then placed as a physical tile in this location using an affinity rule. Algorithm 7 details what information is copied and stored in . Algorithm 8 details how a signal is passed starting from and ending in . A crucial part of this signal passing is the use of “caps” to act as funnels in . As parts of are finished, these caps can continue to be shifted until the entire sub-assembly is completely built.
In the second step, a signal is sent back to mark the tile being copied as complete, following the breadcrumb trail that is left behind. As stated, caps are created once terminal tiles get placed to prevent signals from entering already completed parts of the sub-assembly. Algorithm 9 explicitly details how the breadcrumb trail is retraced, as well as how caps are used and shifted.
6.2.3 Choosing the Next Tile to Place
Once the recently copied tile has , the following step is to select the next tile to get placed. The logic behind choosing the next tile varies depending on if is a terminal tile or not. If , then the tile selection is a matter of picking the adjacent tile in direction . However, if , then it is a matter of retracing steps until a tile is reached where some adjacent tiles have yet to be placed and selecting from these tiles. Algorithm 10 explicitly details how this process is undertaken.
6.3 Readying the Created Sub-assembly
As the last tile in is placed and the breadcrumb trail is retraced, from will contain caps, signifying has been fully copied into . It is then left to update the state of the pseudo-seed in so that this sub-assembly can repeat the process. Algorithm 11 explicitly details how this process is undertaken.
6.4 Resetting the Copied Sub-assembly
The final step is to reset the copied sub-assembly. As the last tile is marked as complete and each from has a value of Y or *, this signifies the completion of the copying process. It is then left to first reset all tiles in , then choose a new copying direction. Algorithm 12 explicitly details how this process is undertaken.
7 Resetting Procedure
This section details the resetting procedure once an assembly has become . We first discuss local resetting that occurs within each sub-assembly, followed by the global reset that unifies the resulting assembly to restart the process.
Local Resetting
From Algorithm 12, each time a sub-assembly is copied, the num_times_copied field of the pseudo-seed/original seed is increased by one. Once this field is equal to the length of its neighbors field, or if the pseudo-seed/origin seed is terminal, then this sub-assembly is no longer needed to create other sub-assemblies. Thus, starting from the pseudo-seed/original seed, a signal is sent to label each tile with a “ready to reset” state. This state is accompanied by the counter field of each tile being set to the length of the neighbors field to ensure that all tiles within each sub-assembly are marked with the resetting state. Let denote the pseudo-seed seed/original seed for some sub-assembly. Algorithm 13 explicitly details how this procedure is undertaken.
Global Resetting
From the local resetting that occurs within each sub-assembly, tiles are marked terminal or not depending on the number of new neighbors each tile will have. As each tile is updated, global resetting occurs from the new terminal tiles. This resetting includes setting each tiles neighbors field to the new_neighbors field, as well as updating the following fields to their default values: state, copy_direction, pseudo_seed, will_be_pseudo_seed, sub_assembly_copied, caps, copied, num_times_copied, temp, transfer, new_neighbors, first_tile, can_place and counter.
Additionally, the directions to the new key tiles are updated, as well as the location of these key tiles as well, which turns into the new generator. These directions are updated starting from the terminal tiles for each tile based on the following logic:
-
1.
If t.new_key_tile = True, set t.key_d = * for each direction which is a key tile.
-
2.
If t.terminal and t.new_key_tile = False, then each t.key_d field is set to t.origin_direction.
-
3.
For each adjacent tile not in the direction of the original seed, if is not in the direction of , set to the direction of .
-
4.
Otherwise, must be in the direction of the original seed.
Algorithm 14 explicitly details how this procedure is undertaken. Once the original seed is reset, then the newly created assembly becomes the new generator for the next step, and the entire procedure restarts. An important thing to note is each tile is only reset if and if , which ensures all tiles in the respective sub-assembly have been given this reset signal.
8 Correctness
The following theorems are used to prove the main results of this paper. Intuitively, a base-assembly is an assembly which represents a valid output from the seed initialization as described in Section 5. These assemblies have 4 key tiles with exactly 1 path between any 2 tiles in the assembly. Thus, by taking a base-assembly to base-assembly , this ensures that can become the new “seed” assembly for the system. A base-sub-assembly is essentially the same, except field values for tiles are not required to be defaulted. Examples of base-assemblies and base-sub-assemblies are shown in Figure 5. ’
Theorem 1.
Theorem 2.
Theorem 3.
8.1 Main Results
We now state the main results of this paper.
Theorem 4.
For every feasible generator , there exists a seeded TA system which strictly builds the corresponding fractal with states, transitions, and affinities.
Proof.
By construction. Given a generator , initialize an assembly as described in Section 5. Then, following Sections 6 and 7 (using Algorithms 5, 6, 7, 8, 9, 10, 11, 12, 13, and 14), create system which, by Theorem 3, creates a new assembly with . Since is a base-assembly, repeat with as the new generator for . Doing so infinitely then strictly builds the corresponding fractal.
Since each tile can have at most neighbors, the information stored within each tile (as described in Section 4.1) must be constant. Thus, the number of transition and affinity rules must also be constant.
Theorem 5.
There exists a single seeded TA system that, given as input any feasible generator as a seed, will strictly build the corresponding fractal for .
Proof.
An important detail about the constructions from Sections 5, 6, and 7 is that tile placement and signal propagation are not hard-coded to the shape of the given generator. Following from Theorem 4, by considering all possible valid states, transitions, and affinity rules, there must then exist a single seeded TA system which can strictly build any feasible generator at temperature 1.
9 Conclusion
This paper extends the work of [11], showing that there not only exists a seeded TA system that can strictly build any fractal with a feasible generator, but also that there exists a single system that can do so at temperature 1. This approach takes advantage of the ability to encode information in the state of each tile, allowing for signal transmission and synchronization despite the non-deterministic nature of the model at hand and the geometric bottlenecks of many fractals. While this paper fully characterizes fractal generation in seeded TA, there are still some interesting open questions at hand:
-
Are there more efficient ways to build such fractals at higher temperatures? In other words, is it possible to reduce the number of states, transitions, and affinities by encoding some information in the strength of each bond?
-
Does there exist a natural extension to the model that can handle non-feasible generators?
References
- [1] Robert M. Alaniz, David Caballero, Sonya C. Cirlos, Timothy Gomez, Elise Grizzell, Andrew Rodriguez, Robert Schweller, Armando Tenorio, and Tim Wylie. Building squares with optimal state complexity in restricted active self-assembly. Journal of Computer and System Sciences, 138:103462, 2023. doi:10.1016/j.jcss.2023.103462.
- [2] Kimberly Barth, David Furcy, Scott M Summers, and Paul Totzke. Scaled tree fractals do not strictly self-assemble. In Unconventional Computation and Natural Computation: 13th International Conference, UCNC 2014, London, ON, Canada, July 14-18, 2014, Proceedings 13, pages 27–39. Springer, 2014. doi:10.1007/978-3-319-08123-6_3.
- [3] Florent Becker, Daniel Hader, and Matthew J. Patitz. Strict self-assembly of discrete self-similar fractals in the abstract tile-assembly model, 2024. arXiv:2406.19595.
- [4] Florent Becker, Daniel Hader, and Matthew J. Patitz. Strict self-assembly of discrete self-similar fractals in the abstract tile-assembly model. In Proceedings of the ACM-SIAM Symposium on Discrete Algorithms, 2025.
- [5] Angel A. Cantu, Austin Luchsinger, Robert Schweller, and Tim Wylie. Signal Passing Self-Assembly Simulates Tile Automata. In 31st International Symposium on Algorithms and Computation, volume 181 of ISAAC’20, pages 53:1–53:17, 2020. doi:10.4230/LIPIcs.ISAAC.2020.53.
- [6] Cameron T. Chalk, Dominic A. Fernandez, Alejandro Huerta, Mario A. Maldonado, Robert T. Schweller, and Leslie Sweet. Strict self-assembly of fractals using multiple hands. Algorithmica, 76(1):195–224, September 2016. doi:10.1007/s00453-015-0022-x.
- [7] Constantine Glen Evans. Crystals that count! Physical principles and experimental investigations of DNA tile self-assembly. PhD thesis, California Institute of Technology, 2014.
- [8] David Furcy and Scott M Summers. Scaled pier fractals do not strictly self-assemble. Natural Computing, 16:317–338, 2017. doi:10.1007/S11047-015-9528-Z.
- [9] Jacob Hendricks, Meagan Olsen, Matthew J. Patitz, Trent A. Rogers, and Hadley Thomas. Hierarchical self-assembly of fractals with signal-passing tiles. Natural computing, 17:47–65, November 2018. doi:10.1007/s11047-017-9663-9.
- [10] Jacob Hendricks and Joseph Opseth. Self-assembly of 4-sided fractals in the two-handed tile assembly model. In Matthew J. Patitz and Mike Stannett, editors, Unconventional Computation and Natural Computation, pages 113–128, Cham, 2017. Springer International Publishing. doi:10.1007/978-3-319-58187-3_9.
- [11] Ryan Knobel, Adrian Salinas, Robert Schweller, and Tim Wylie. Building discrete self-similar fractals in seeded tile automata. URL: https://par.nsf.gov/biblio/10562746.
- [12] Jennifer E. Padilla, Matthew J. Patitz, Robert T. Schweller, Nadrian C. Seeman, Scott M. Summers, and Xingsi Zhong. Asynchronous signal passing for tile self-assembly: Fuel efficient computation and efficient assembly of shapes. International Journal of Foundations of Computer Science, 25:459–488, 2014. doi:10.1142/S0129054114400061.
- [13] Matthew J. Patitz. An introduction to tile-based self-assembly. In Jérôme Durand-Lose and Nataša Jonoska, editors, Unconventional Computation and Natural Computation, pages 34–62, Berlin, Heidelberg, 2012. Springer Berlin Heidelberg. doi:10.1007/978-3-642-32894-7_6.
- [14] Matthew J Patitz and Scott M Summers. Self-assembly of discrete self-similar fractals. Natural Computing, 9:135–172, 2010. doi:10.1007/S11047-009-9147-7.
- [15] Matthew J. Patitz and Scott M. Summers. Self-assembly of discrete self-similar fractals. Natural computing, 9:135–172, August 2010. doi:10.1007/s11047-009-9147-7.
- [16] Paul W. K. Rothemund. Theory and experiments in algorithmic self-assembly. PhD thesis, University of Southern California, 2001. URL: https://go.openathens.net/redirector/utrgv.edu?url=https://www.proquest.com/dissertations-theses/theory-experiments-algorithmic-self-assembly/docview/276028769/se-2.
- [17] Paul W. K Rothemund, Nick Papadakis, and Erik Winfree. Algorithmic self-assembly of dna sierpinski triangles. PLOS Biology, 2(12):null, December 2004. doi:10.1371/journal.pbio.0020424.
- [18] David Soloveichik and Erik Winfree. Complexity of self-assembled shapes. SIAM Journal on Computing, 36(6):1544–1569, 2007. doi:10.1137/S0097539704446712.
- [19] Erik Winfree. Algorithmic self-assembly of DNA. PhD thesis, California Institute of Technology, 1998. URL: https://go.openathens.net/redirector/utrgv.edu?url=https://www.proquest.com/dissertations-theses/algorithmic-self-assembly-dna/docview/304420561/se-2.
- [20] Damien Woods, David Doty, Cameron Myhrvold, Joy Hui, Felix Zhou, Peng Yin, and Erik Winfree. Diverse and robust molecular algorithms using reprogrammable dna self-assembly. Nature, 567(7748):366–372, 2019. doi:10.1038/S41586-019-1014-9.
