diff --git a/.gitignore b/.gitignore index 2a491e1..4f4bda2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /target -/src/attempts/ +/src/ignoreme/ /src/aplay/ /.vscode /.idea/ @@ -7,4 +7,4 @@ /src/erroring.rs /src/versions.rs /timing_order.txt -/oprofile_data \ No newline at end of file +/oprofile_data diff --git a/Cargo.lock b/Cargo.lock index 18ff561..fe13c28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -63,6 +63,27 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "csv" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b015497079b9a9d69c02ad25de6c0a6edef051ea6360a327d0bd05802ef64ad" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "either" version = "1.8.1" @@ -74,9 +95,11 @@ name = "hamcycle" version = "0.1.0" dependencies = [ "common_macros", + "csv", "itertools", "ndarray", "rayon", + "serde", ] [[package]] @@ -97,6 +120,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + [[package]] name = "libc" version = "0.2.140" @@ -112,6 +141,12 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + [[package]] name = "memoffset" version = "0.8.0" @@ -172,6 +207,24 @@ dependencies = [ "libc", ] +[[package]] +name = "proc-macro2" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + [[package]] name = "rawpointer" version = "0.2.1" @@ -200,8 +253,51 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.158" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.158" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aad1363ed6d37b84299588d62d3a7d95b5a5c2d9aad5c85609fda12afaa1f40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" diff --git a/Cargo.toml b/Cargo.toml index d1f11ea..c94ae4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,10 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] +chrono = "0.4.24" common_macros = "0.1.1" +csv = "1.2.1" itertools = "0.10.5" -ndarray = "0.15.6" +ndarray = { version = "0.15.6", features = ["blas", "rayon", "matrixmultiply-threading"] } rayon = "1.7.0" +serde = { version = "1", features = ["derive"] } [profile.release] debug = true diff --git a/README.md b/README.md index 563886a..59d8398 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,53 @@ -# easy dc solver -*”It would be a mistake to think that solving problems is a purely intellectual affair; determination and emotions play an important role.”* - -*“The worst may happen if the student embarks upon computations or constructions without having understood the problem.”* +*“A great discovery solves a great problem, but there is a grain of discovery in the solution of any problem. Your problem may be modest, but if it challenges your curiosity and brings into play your inventive faculties, and if you solve it by your own means, you may experience the tension and enjoy the triumph of discovery.”* ― George Pólya, How to Solve It: A New Aspect of Mathematical Method -An algorithm for solving the Hamiltonian cycle problem deterministically and in linear time on all instances of discocube graphs (tested for up to 350 million vertices). Discocube graphs are -3-dimensional grid graphs derived from: a polycube of an octahedron | a Hauy construction of an octahedron using cubes as identical building blocks | the accretion of cubes around a central cube forming an octahedron at the limit | -the set of points in a 3-dimensional square grid graph contained within an octahedron... - ![Planar embedding of Cube and Discocubes](imgs/planar_emb.png?raw=true "Planar embedding of Cube and Discocubes") -*Planar embedding of a cube and a discocube. from the set of all graphs G, where the order of G is of the ***Uncentered octahedral numbers*** [A130809](https://oeis.org/A130809), only the first two instances shown above; n[0] and n[1] are planarly embeddable i.e., it can be represented on a two-dimensional surface without any of its edges crossing.* +Planar embedding of a cube and a discocube. From the set of all graphs G, where the order of G is of the ***Uncentered octahedral numbers*** [A130809](https://oeis.org/A130809), only the first two instances shown above; n[0] and n[1] are planarly embeddable i.e., it can be represented on a two-dimensional surface without any of its edges crossing. -This algorithm is an artist's rendering of a graph object using programming as a language (versus painting or singing about a mountain) and means by which to describe the body of his muse (a graph object) as an endless contour drawing (Hamiltonian cycle). -After thousands of studies, drawings, and a little math: this is a story of how solving specific aethetic goals can yield results. When a graph becomes an artist's muse, how does the artist go about rendering their vision as a painter paints a portrait and makes it their own? Do I draw functions with my mind's eye as I would imagine a sculpture? - Art studies forms, the curvature of the neck as it disappears behind the back, the color of skin in the foreground, the play of colors and contrasts... So in this project, I studied the discocube as a body, where each turn was conceptualized not as a discrete math object but as movement of the body, resulting in more doodles and sketches than pages of equations. The result is a family of algorithms for solving various types of hamiltonian cycles (always turning, etc...), of which this repo is the simplest and most descriptive. +An algorithm for solving the Hamiltonian cycle problem deterministically and in linear time on all instances of discocube graphs (tested for graphs with over 1 billion vertices). Discocube graphs are +3-dimensional grid graphs derived from: a polycube of an octahedron | a Hauy construction of an octahedron with cubes as identical building blocks | the accretion of cubes around a central cube forming an octahedron at the limit | +the set of points in a 3-dimensional square grid graph contained within an octahedron... -![Hauy's wooden crystal models](imgs/hauyCabinett.png?raw=true "Hauy's wooden crystal models") +This algorithm is an artist's rendering of a graph object using programming as a language (instead of painting flowers and apples or singing hymns about angels) and means by which to describe his muse's body as an endless contour drawing or a Hamiltonian cycle in graph theory terms. -![First 11 discocubes and their order (number of nodes)](imgs/rect5857.png?raw=true "Discocubes orders") -*The first eleven discocubes and their respective orders (number of nodes)* -Why weave()? Finding the solution to the problem reminded me of macramé, of tying knots, weaving and how repeating certain movements resulted in certain patterns. I followed the thought further and asked myself if there was a 'weave' I could use to expose underlying unit structure and repeat this throughout to get an initial solution which could later be mutated to produce a more polished solution. The code is structured around the process of weaving a piece of tapestry, from spinning the yarn to incorporating the weft into the warps. +
+
+ Hauy's wooden crystal models +
+
+

+ Named after Sir William Rowan Hamilton, the Hamiltonian cycle problem is a classic problem in graph theory. It requires finding a closed loop in a graph that visits every node exactly once, ending at the starting point. The problem was first formulated in the rules of his Icosian game, where players insert numbered pegs into holes on a wooden board to represent steps in a path. The objective is to insert the pegs in order along a path to form a closed loop, much like the Hamiltonian cycle problem where the pegs represent nodes in a graph and the path of inserted pegs represents the cycle. +

+
+
-This algorithm has no while loops, and will terminate after a series of steps have been performed. The strength of this algorithm is knowing exactly when and where and what is to happen, thereby reducing the amount of calculations needed, which is surprising as the creative process in creating this was anything but deterministic. -This algorithm aims, with enough optimizations, to be able to find the hamiltonian cycle for graphs up to a billion vertices. It takes only a little bit less time to certify a solution as it does to find it. -I'll close with this: +After pages of studies, drawings, and a little math: this is the result of my using the artistic process to solve a mathematical problem without the means to solve it mathematically. When a graph becomes an artist's muse, how does the artist go about rendering their vision as a painter would paint a portrait, making it their own? Will I eventually draw functions with my mind where I otherwise would have imagined a sculpture? Or will I find patterns in the [music I make from the solutions?](https://soundcloud.com/ro-yu-489928073/tracks) -*“A great discovery solves a great problem, but there is a grain of discovery in the solution of any problem. Your problem may be modest, but if it challenges your curiosity and brings into play your inventive faculties, and if you solve it by your own means, you may experience the tension and enjoy the triumph of discovery.”* -― George Pólya, How to Solve It: A New Aspect of Mathematical Method +Art manipulates language to create forms, showing us how a brush strokes the curve of the neck to disappear behind the back, or to with play colors and contrasts to bring the skin, of a subject living 500 years ago, back to life. In this project, I studied the discocube visually as a body, imagining each turn not as a discrete mathematical object, but as the totality of possible movements, as an endlessly iterated dance captured in an infinitely open camera shutter, resulting in more doodles and sketches rather than pages of numbers and equations (I wish I learned more math!). The result is a family of algorithms for solving various types of Hamiltonian cycles, of which this repository provides the simplest and most descriptive: the weave algorithm. The other algorithms, housed in another private repository called "polish" center around the concept of polishing a diamond, i.e., improving upon the initial tour created by the weave algorithm so that the number of edges is evenly distributed across the x, y, and z axes, resulting in an always-turning Hamiltonian cycle. +Art manipulates language to create forms, showing us how a brush strokes the curve of the neck to disappear behind the back, or to with play colors and contrasts to bring the skin, of a subject living 500 years ago, back to life. In this project, I studied the discocube visually as a body, imagining each turn not as a discrete mathematical object, but as the totality of possible movements, as an endlessly iterated dance captured in an infinitely open camera shutter, resulting in more doodles and sketches rather than pages of numbers and equations (I wish I learned more math!). The result is a family of algorithms for solving various types of Hamiltonian cycles, of which this repository provides the simplest and most descriptive: the weave algorithm. The other algorithms, housed in another private repository called "polish" center around the concept of polishing a diamond, i.e., improving upon the initial tour created by the weave algorithm so that the number of edges is evenly distributed across the x, y, and z axes, resulting in an always-turning Hamiltonian cycle. +Why weave? Finding the solution to the problem reminded me of macramé, of tying knots, weaving and spinning yarn. I thought of how patterns in hand-woven fabric are actually unwitting recordings of a knitter's hand-movements, like how a piano roll is a recording of the pianist's finger hitting ebony, or how a seismograph records the motion of the earth, or how our skin is type of recording of our life... I followed the thought further and asked myself: was there was a pattern to expose and use to construct the discocube, level by level, similar to how one would knit a scarf, row by row until the desired result is reached? To illustrate the intention of the code succinctly, I've structured the code to mimic the process of weaving a piece of tapestry, from spinning the yarn to incorporating the weft into the warps. -Goal: -Optimize the algorithm so that it is able to solve instances of over a billion vertices: -``` -TO BE CONTINUED TO: | 🇳 1000 | ⭕️ 1_337_336_000 | -``` - -![Discocubes](imgs/dcviews.png?raw=true "Discocubes") -*Discocubes 8 - 1760* - -What started as a hack-your-own version of a depth-first-search-with-shortcuts for the discocube graph (solving up to 960 vertices), metastasized into pages of overgrown mixin classes mysteriously coupled to each another like overgrown vines pushing me deeper and deeper into the underbelly of its mutant tentacles. Although it was able to solve instances of over a million vertices, it had the clarity of primordial soup. So, as a sadistic gardener I painstakingly pruned my own unescapable web (all those letters you haven't opened yet?) of thorny vines into presentable tiny bonsai trees. So what is a bonsai if not a tree in intimate scope? +![First 11 discocubes and their order (number of nodes)](imgs/rect5857.png?raw=true "Discocubes orders") +*The first eleven discocubes and their respective orders (number of nodes)* To paraphrase Hauy: *When solving problems that involve analyzing how nature progresses, we are led by very rapid methods to results that are not immediately obvious. These results may appear paradoxical and surprising. However, if we take the time to carefully examine the steps we took to reach these results, we will begin to understand the underlying principles that led to these outcomes. By going back over the process step by step, we can better understand the logic behind the final results.* +What started as a hack-your-own version of a depth-first-search-with-shortcuts for the discocube graph (solving up to 960 vertices), metastasized into pages of overgrown mixin classes mysteriously coupled to each another like overgrown vines pushing me deeper and deeper into the underbelly of its mutant tentacles. Although able to solve instances with over a million vertices, the algorithm had the clarity of primordial soup. So, as a sadistic gardener I painstakingly pruned my own pubicity (my unescapable web of thorny vines) into presentable tiny bonsai trees. So what is a bonsai if not a tree in intimate scope? + The result of this creative process is a family of algorithms developed specifically to solve various graph problems on the disoocube graph, 3d grid graph and hexprism honeycomb diamond graphs. -The algorithm presented in this repository is the least complex, also making it the fastest. It does the job, solving the hamiltonian cycle problem for over millions of vertices in reasonable time (milliseconds vs. years), while other algorithms in the family take longer but they also have other objectives; like forming an always turning cycle with even edge distribution across all axes. But that's beyond the scope of this repo. +The algorithm presented in this repository is the least complex, making it the fastest. It does the job, solving the hamiltonian cycle problem for over millions of vertices in seconds and graph with over a billion vertices in minutes -while other algorithms in the family take longer but they also have other objectives; like forming an always turning cycle with even edge distribution across all axes. But that's beyond the scope of this repository. + +Eventually this repository will include other linear time algorithms for solving the hamiltonian cycle problem in 3d grid graphs and also in solid grid graphs (a side-effect of the research) and regular grid graphs. -Eventually this repository will include other linear time algorithms for solving the hamiltonian cycle problem in 3d grid graphs and also in solid grid graphs (a side-effect of the research), addressing some open issues raised in the graph theory research literature. +This algorithm has no while loops, and will terminate after a definitive set of steps. The strength of this algorithm is knowing exactly when and where and what is to happen, thereby reducing the amount of calculations needed (which is surprising as the creative process in creating this was anything but deterministic). It is a construction algorithm, constructing the path, layer by layer until a series of loops are produced with are then joined using cycle merging. The algorithm has also discarded the memory-heavy adjacency list, choosing instead to perform individual calculations where needed. Making and solving a graph with over a billion vertices, where n=1000 won't require a distributed graph engine on the cloud anymore. Just a little over ten minutes. + +![Discocubes](imgs/dcviews.png?raw=true "Discocubes") +*Discocubes 8 - 1760* ![Hexprism Honeycomb Diamond](imgs/hexhoneydiamond.png?raw=true "Hexprism Honeycomb Diamond") *Hexprism Honeycomb Diamond* @@ -61,7 +59,10 @@ As each solution is as unique as a fingerprint, or a diamond it allows one to ha ![Discocube 3640 view](imgs/icy_cube3.png?raw=true "confetti cube") *Discocubes as glb, using different mirrored texture yields personalized results and unique reflections meaning each discocube has its own reflection/shadow fingerprint! With millions of combinations available (glass texture/image/color, mirror texture/image/color, edge texture/image/color), the possibilities are endless!* -The always turning hamiltonian cycle digital discocubes are not produced by the algorithm in this repo, but by another polynomial-time algorithm. +The always turning hamiltonian cycle digital discocubes are not produced by the algorithm in this repository, but by another polynomial-time algorithm. + +![Solution to a 79040 node graph](imgs/solution.png) +*Detail for a Hamiltonian cycle for a graph with 79,040 nodes.* ## Command line usage To use the package via the command line, navigate to the root directory of the project in your terminal and run the following command: @@ -73,734 +74,907 @@ cargo run --release 1 100 ``` build > run > make > solve > certify > for each graph starting from 32 to 1.373 million vertices. -## Running times -![Running times from 8 to 68,085,920 vertices](imgs/8_to_68085920.png?raw=true "Runtimes up to 68 million") -8_to_68085920.png - -### Solving the graph takes only a little longer than certifying the solution. - I wonder if this could be a goal. Reduce the algorithm until it is as fast as the algorithm that certifies the graph. -``` -| 🇳 100 | ⭕️ 1373600 | 🕗 TO SOLVE: 0.53748536 | 📌 HamCycle | 🕗 TO CERTIFY: 0.33031258 -``` -``` -// Used to certify if the sequence is a Hamiltonian cycle, chain or broken. +## Plotting the solution +The solution can be plotted using pandas, numpy and plotly. I've put together an easy to use python module: https://github.com/discocube/plot_solution to plot and very the solution visually instead of only programmatically. -pub mod certify { - use super::{ - fmt, - Itertools, - Adjacency, Solution - }; - #[derive(PartialEq)] - pub enum SequenceID { - Broken, - HamChain, - HamCycle, - } +## Plotting the solution +The solution can be plotted using pandas, numpy and plotly. I've put together an easy to use python module: https://github.com/discocube/plot_solution to plot and very the solution visually instead of only programmatically. - impl fmt::Display for SequenceID { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - SequenceID::Broken => write!(f, "Broken"), - SequenceID::HamChain => write!(f, "HamChain"), - SequenceID::HamCycle => write!(f, "HamCycle"), - } - } - } - - pub fn id_seq(seq: &Solution, adj: &Adjacency) -> SequenceID { - if seq.iter().duplicates().count() > 0 || seq.len() != adj.len() { - return SequenceID::Broken; - } - match seq - .windows(2) - .all(|window| adj[&window[0]].contains(&window[1])) - { - true if adj[&seq[seq.len() - 1]].contains(&seq[0]) => SequenceID::HamCycle, - true => SequenceID::HamChain, - false => SequenceID::Broken, - } - } -} +## Running times +![Running times from 8 to 68,085,920 vertices](imgs/8_to_212million.png?raw=true "Runtimes up to 212 million") +8_to_68085920.png +#### Running times for the first 600 instances: graphs with 8 to 289_441_600 vertices (to be continued until 1000th order (over 1 billion)): ``` -#### Running times for the first 500 instances: graphs with 8 to 167_668_000 vertices (to be continued until 1000th order (over 1 billion)): -``` -| 🇳 1 | ⭕️ 8 | 🕗 0.0000010 | 📌 HamCycle | -| 🇳 2 | ⭕️ 32 | 🕗 0.0000021 | 📌 HamCycle | -| 🇳 3 | ⭕️ 80 | 🕗 0.0000207 | 📌 HamCycle | -| 🇳 4 | ⭕️ 160 | 🕗 0.0000376 | 📌 HamCycle | -| 🇳 5 | ⭕️ 280 | 🕗 0.0000457 | 📌 HamCycle | -| 🇳 6 | ⭕️ 448 | 🕗 0.0000612 | 📌 HamCycle | -| 🇳 7 | ⭕️ 672 | 🕗 0.0000849 | 📌 HamCycle | -| 🇳 8 | ⭕️ 960 | 🕗 0.0001190 | 📌 HamCycle | -| 🇳 9 | ⭕️ 1_320 | 🕗 0.0001546 | 📌 HamCycle | -| 🇳 10 | ⭕️ 1_760 | 🕗 0.0001940 | 📌 HamCycle | -| 🇳 11 | ⭕️ 2_288 | 🕗 0.0002370 | 📌 HamCycle | -| 🇳 12 | ⭕️ 2_912 | 🕗 0.0003046 | 📌 HamCycle | -| 🇳 13 | ⭕️ 3_640 | 🕗 0.0003566 | 📌 HamCycle | -| 🇳 14 | ⭕️ 4_480 | 🕗 0.0004434 | 📌 HamCycle | -| 🇳 15 | ⭕️ 5_440 | 🕗 0.0005282 | 📌 HamCycle | -| 🇳 16 | ⭕️ 6_528 | 🕗 0.0006934 | 📌 HamCycle | -| 🇳 17 | ⭕️ 7_752 | 🕗 0.0008181 | 📌 HamCycle | -| 🇳 18 | ⭕️ 9_120 | 🕗 0.0009507 | 📌 HamCycle | -| 🇳 19 | ⭕️ 10_640 | 🕗 0.0010603 | 📌 HamCycle | -| 🇳 20 | ⭕️ 12_320 | 🕗 0.0013304 | 📌 HamCycle | -| 🇳 21 | ⭕️ 14_168 | 🕗 0.0015334 | 📌 HamCycle | -| 🇳 22 | ⭕️ 16_192 | 🕗 0.0018256 | 📌 HamCycle | -| 🇳 23 | ⭕️ 18_400 | 🕗 0.0020479 | 📌 HamCycle | -| 🇳 24 | ⭕️ 20_800 | 🕗 0.0023825 | 📌 HamCycle | -| 🇳 25 | ⭕️ 23_400 | 🕗 0.0027736 | 📌 HamCycle | -| 🇳 26 | ⭕️ 26_208 | 🕗 0.0029853 | 📌 HamCycle | -| 🇳 27 | ⭕️ 29_232 | 🕗 0.0033606 | 📌 HamCycle | -| 🇳 28 | ⭕️ 32_480 | 🕗 0.0038334 | 📌 HamCycle | -| 🇳 29 | ⭕️ 35_960 | 🕗 0.0043816 | 📌 HamCycle | -| 🇳 30 | ⭕️ 39_680 | 🕗 0.0050111 | 📌 HamCycle | -| 🇳 31 | ⭕️ 43_648 | 🕗 0.0057679 | 📌 HamCycle | -| 🇳 32 | ⭕️ 47_872 | 🕗 0.0060557 | 📌 HamCycle | -| 🇳 33 | ⭕️ 52_360 | 🕗 0.0068013 | 📌 HamCycle | -| 🇳 34 | ⭕️ 57_120 | 🕗 0.0077425 | 📌 HamCycle | -| 🇳 35 | ⭕️ 62_160 | 🕗 0.0087764 | 📌 HamCycle | -| 🇳 36 | ⭕️ 67_488 | 🕗 0.0093920 | 📌 HamCycle | -| 🇳 37 | ⭕️ 73_112 | 🕗 0.0101394 | 📌 HamCycle | -| 🇳 38 | ⭕️ 79_040 | 🕗 0.0122911 | 📌 HamCycle | -| 🇳 39 | ⭕️ 85_280 | 🕗 0.0123574 | 📌 HamCycle | -| 🇳 40 | ⭕️ 91_840 | 🕗 0.0136622 | 📌 HamCycle | -| 🇳 41 | ⭕️ 98_728 | 🕗 0.0148989 | 📌 HamCycle | -| 🇳 42 | ⭕️ 105_952 | 🕗 0.0162773 | 📌 HamCycle | -| 🇳 43 | ⭕️ 113_520 | 🕗 0.0180751 | 📌 HamCycle | -| 🇳 44 | ⭕️ 121_440 | 🕗 0.0194382 | 📌 HamCycle | -| 🇳 45 | ⭕️ 129_720 | 🕗 0.0214285 | 📌 HamCycle | -| 🇳 46 | ⭕️ 138_368 | 🕗 0.0229243 | 📌 HamCycle | -| 🇳 47 | ⭕️ 147_392 | 🕗 0.0254875 | 📌 HamCycle | -| 🇳 48 | ⭕️ 156_800 | 🕗 0.0280501 | 📌 HamCycle | -| 🇳 49 | ⭕️ 166_600 | 🕗 0.0298669 | 📌 HamCycle | -| 🇳 50 | ⭕️ 176_800 | 🕗 0.0325643 | 📌 HamCycle | -| 🇳 51 | ⭕️ 187_408 | 🕗 0.0355896 | 📌 HamCycle | -| 🇳 52 | ⭕️ 198_432 | 🕗 0.0389029 | 📌 HamCycle | -| 🇳 53 | ⭕️ 209_880 | 🕗 0.0408493 | 📌 HamCycle | -| 🇳 54 | ⭕️ 221_760 | 🕗 0.0440270 | 📌 HamCycle | -| 🇳 55 | ⭕️ 234_080 | 🕗 0.0482504 | 📌 HamCycle | -| 🇳 56 | ⭕️ 246_848 | 🕗 0.0510917 | 📌 HamCycle | -| 🇳 57 | ⭕️ 260_072 | 🕗 0.0539111 | 📌 HamCycle | -| 🇳 58 | ⭕️ 273_760 | 🕗 0.0570619 | 📌 HamCycle | -| 🇳 59 | ⭕️ 287_920 | 🕗 0.0626398 | 📌 HamCycle | -| 🇳 60 | ⭕️ 302_560 | 🕗 0.0665345 | 📌 HamCycle | -| 🇳 61 | ⭕️ 317_688 | 🕗 0.0696655 | 📌 HamCycle | -| 🇳 62 | ⭕️ 333_312 | 🕗 0.0756095 | 📌 HamCycle | -| 🇳 63 | ⭕️ 349_440 | 🕗 0.0812501 | 📌 HamCycle | -| 🇳 64 | ⭕️ 366_080 | 🕗 0.0855361 | 📌 HamCycle | -| 🇳 65 | ⭕️ 383_240 | 🕗 0.0897376 | 📌 HamCycle | -| 🇳 66 | ⭕️ 400_928 | 🕗 0.0939994 | 📌 HamCycle | -| 🇳 67 | ⭕️ 419_152 | 🕗 0.0992696 | 📌 HamCycle | -| 🇳 68 | ⭕️ 437_920 | 🕗 0.1073214 | 📌 HamCycle | -| 🇳 69 | ⭕️ 457_240 | 🕗 0.1160096 | 📌 HamCycle | -| 🇳 70 | ⭕️ 477_120 | 🕗 0.1238002 | 📌 HamCycle | -| 🇳 71 | ⭕️ 497_568 | 🕗 0.1302345 | 📌 HamCycle | -| 🇳 72 | ⭕️ 518_592 | 🕗 0.1427145 | 📌 HamCycle | -| 🇳 73 | ⭕️ 540_200 | 🕗 0.1481154 | 📌 HamCycle | -| 🇳 74 | ⭕️ 562_400 | 🕗 0.1528944 | 📌 HamCycle | -| 🇳 75 | ⭕️ 585_200 | 🕗 0.1619013 | 📌 HamCycle | -| 🇳 76 | ⭕️ 608_608 | 🕗 0.1697858 | 📌 HamCycle | -| 🇳 77 | ⭕️ 632_632 | 🕗 0.1802106 | 📌 HamCycle | -| 🇳 78 | ⭕️ 657_280 | 🕗 0.1929411 | 📌 HamCycle | -| 🇳 79 | ⭕️ 682_560 | 🕗 0.1991495 | 📌 HamCycle | -| 🇳 80 | ⭕️ 708_480 | 🕗 0.2135235 | 📌 HamCycle | -| 🇳 81 | ⭕️ 735_048 | 🕗 0.2184628 | 📌 HamCycle | -| 🇳 82 | ⭕️ 762_272 | 🕗 0.2459208 | 📌 HamCycle | -| 🇳 83 | ⭕️ 790_160 | 🕗 0.2592264 | 📌 HamCycle | -| 🇳 84 | ⭕️ 818_720 | 🕗 0.2696866 | 📌 HamCycle | -| 🇳 85 | ⭕️ 847_960 | 🕗 0.2710578 | 📌 HamCycle | -| 🇳 86 | ⭕️ 877_888 | 🕗 0.2800946 | 📌 HamCycle | -| 🇳 87 | ⭕️ 908_512 | 🕗 0.2869450 | 📌 HamCycle | -| 🇳 88 | ⭕️ 939_840 | 🕗 0.3290268 | 📌 HamCycle | -| 🇳 89 | ⭕️ 971_880 | 🕗 0.3456512 | 📌 HamCycle | -| 🇳 90 | ⭕️ 1_004_640 | 🕗 0.3538976 | 📌 HamCycle | -| 🇳 91 | ⭕️ 1_038_128 | 🕗 0.3681797 | 📌 HamCycle | -| 🇳 92 | ⭕️ 1_072_352 | 🕗 0.3963305 | 📌 HamCycle | -| 🇳 93 | ⭕️ 1_107_320 | 🕗 0.4033277 | 📌 HamCycle | -| 🇳 94 | ⭕️ 1_143_040 | 🕗 0.4153683 | 📌 HamCycle | -| 🇳 95 | ⭕️ 1_179_520 | 🕗 0.4387953 | 📌 HamCycle | -| 🇳 96 | ⭕️ 1_216_768 | 🕗 0.4771417 | 📌 HamCycle | -| 🇳 97 | ⭕️ 1_254_792 | 🕗 0.4902358 | 📌 HamCycle | -| 🇳 98 | ⭕️ 1_293_600 | 🕗 0.4930317 | 📌 HamCycle | -| 🇳 99 | ⭕️ 1_333_200 | 🕗 0.5267313 | 📌 HamCycle | -| 🇳 100 | ⭕️ 1_373_600 | 🕗 0.5552125 | 📌 HamCycle | -| 🇳 101 | ⭕️ 1_414_808 | 🕗 0.5823348 | 📌 HamCycle | -| 🇳 102 | ⭕️ 1_456_832 | 🕗 0.5761076 | 📌 HamCycle | -| 🇳 103 | ⭕️ 1_499_680 | 🕗 0.6100927 | 📌 HamCycle | -| 🇳 104 | ⭕️ 1_543_360 | 🕗 0.6406497 | 📌 HamCycle | -| 🇳 105 | ⭕️ 1_587_880 | 🕗 0.6618903 | 📌 HamCycle | -| 🇳 106 | ⭕️ 1_633_248 | 🕗 0.6993168 | 📌 HamCycle | -| 🇳 107 | ⭕️ 1_679_472 | 🕗 0.7392572 | 📌 HamCycle | -| 🇳 108 | ⭕️ 1_726_560 | 🕗 0.7754343 | 📌 HamCycle | -| 🇳 109 | ⭕️ 1_774_520 | 🕗 0.7944393 | 📌 HamCycle | -| 🇳 110 | ⭕️ 1_823_360 | 🕗 0.8072736 | 📌 HamCycle | -| 🇳 111 | ⭕️ 1_873_088 | 🕗 0.8542167 | 📌 HamCycle | -| 🇳 112 | ⭕️ 1_923_712 | 🕗 0.8878529 | 📌 HamCycle | -| 🇳 113 | ⭕️ 1_975_240 | 🕗 0.8812421 | 📌 HamCycle | -| 🇳 114 | ⭕️ 2_027_680 | 🕗 0.9601020 | 📌 HamCycle | -| 🇳 115 | ⭕️ 2_081_040 | 🕗 0.9935364 | 📌 HamCycle | -| 🇳 116 | ⭕️ 2_135_328 | 🕗 1.0323677 | 📌 HamCycle | -| 🇳 117 | ⭕️ 2_190_552 | 🕗 1.0316335 | 📌 HamCycle | -| 🇳 118 | ⭕️ 2_246_720 | 🕗 1.1275588 | 📌 HamCycle | -| 🇳 119 | ⭕️ 2_303_840 | 🕗 1.1763284 | 📌 HamCycle | -| 🇳 120 | ⭕️ 2_361_920 | 🕗 1.2075880 | 📌 HamCycle | -| 🇳 121 | ⭕️ 2_420_968 | 🕗 1.2717817 | 📌 HamCycle | -| 🇳 122 | ⭕️ 2_480_992 | 🕗 1.2900746 | 📌 HamCycle | -| 🇳 123 | ⭕️ 2_542_000 | 🕗 1.2972989 | 📌 HamCycle | -| 🇳 124 | ⭕️ 2_604_000 | 🕗 1.3435471 | 📌 HamCycle | -| 🇳 125 | ⭕️ 2_667_000 | 🕗 1.4070555 | 📌 HamCycle | -| 🇳 126 | ⭕️ 2_731_008 | 🕗 1.4372251 | 📌 HamCycle | -| 🇳 127 | ⭕️ 2_796_032 | 🕗 1.4794157 | 📌 HamCycle | -| 🇳 128 | ⭕️ 2_862_080 | 🕗 1.5322369 | 📌 HamCycle | -| 🇳 129 | ⭕️ 2_929_160 | 🕗 1.5380286 | 📌 HamCycle | -| 🇳 130 | ⭕️ 2_997_280 | 🕗 1.6097608 | 📌 HamCycle | -| 🇳 131 | ⭕️ 3_066_448 | 🕗 1.6794202 | 📌 HamCycle | -| 🇳 132 | ⭕️ 3_136_672 | 🕗 1.7742593 | 📌 HamCycle | -| 🇳 133 | ⭕️ 3_207_960 | 🕗 1.8197930 | 📌 HamCycle | -| 🇳 134 | ⭕️ 3_280_320 | 🕗 1.8474405 | 📌 HamCycle | -| 🇳 135 | ⭕️ 3_353_760 | 🕗 1.9404466 | 📌 HamCycle | -| 🇳 136 | ⭕️ 3_428_288 | 🕗 1.9601974 | 📌 HamCycle | -| 🇳 137 | ⭕️ 3_503_912 | 🕗 2.0513310 | 📌 HamCycle | -| 🇳 138 | ⭕️ 3_580_640 | 🕗 2.0951188 | 📌 HamCycle | -| 🇳 139 | ⭕️ 3_658_480 | 🕗 2.1660309 | 📌 HamCycle | -| 🇳 140 | ⭕️ 3_737_440 | 🕗 2.2257590 | 📌 HamCycle | -| 🇳 141 | ⭕️ 3_817_528 | 🕗 2.2943380 | 📌 HamCycle | -| 🇳 142 | ⭕️ 3_898_752 | 🕗 2.3628054 | 📌 HamCycle | -| 🇳 143 | ⭕️ 3_981_120 | 🕗 2.4565878 | 📌 HamCycle | -| 🇳 144 | ⭕️ 4_064_640 | 🕗 2.4630859 | 📌 HamCycle | -| 🇳 145 | ⭕️ 4_149_320 | 🕗 2.5294545 | 📌 HamCycle | -| 🇳 146 | ⭕️ 4_235_168 | 🕗 2.6146848 | 📌 HamCycle | -| 🇳 147 | ⭕️ 4_322_192 | 🕗 2.7125676 | 📌 HamCycle | -| 🇳 148 | ⭕️ 4_410_400 | 🕗 2.7204847 | 📌 HamCycle | -| 🇳 149 | ⭕️ 4_499_800 | 🕗 2.8164327 | 📌 HamCycle | -| 🇳 150 | ⭕️ 4_590_400 | 🕗 2.9506035 | 📌 HamCycle | -| 🇳 151 | ⭕️ 4_682_208 | 🕗 2.9311955 | 📌 HamCycle | -| 🇳 152 | ⭕️ 4_775_232 | 🕗 2.9945934 | 📌 HamCycle | -| 🇳 153 | ⭕️ 4_869_480 | 🕗 3.1270444 | 📌 HamCycle | -| 🇳 154 | ⭕️ 4_964_960 | 🕗 3.1455088 | 📌 HamCycle | -| 🇳 155 | ⭕️ 5_061_680 | 🕗 3.3308525 | 📌 HamCycle | -| 🇳 156 | ⭕️ 5_159_648 | 🕗 3.3205125 | 📌 HamCycle | -| 🇳 157 | ⭕️ 5_258_872 | 🕗 3.4157286 | 📌 HamCycle | -| 🇳 158 | ⭕️ 5_359_360 | 🕗 3.5471230 | 📌 HamCycle | -| 🇳 159 | ⭕️ 5_461_120 | 🕗 3.6002979 | 📌 HamCycle | -| 🇳 160 | ⭕️ 5_564_160 | 🕗 3.8180778 | 📌 HamCycle | -| 🇳 161 | ⭕️ 5_668_488 | 🕗 3.8757975 | 📌 HamCycle | -| 🇳 162 | ⭕️ 5_774_112 | 🕗 3.9876018 | 📌 HamCycle | -| 🇳 163 | ⭕️ 5_881_040 | 🕗 4.0251026 | 📌 HamCycle | -| 🇳 164 | ⭕️ 5_989_280 | 🕗 4.0782704 | 📌 HamCycle | -| 🇳 165 | ⭕️ 6_098_840 | 🕗 4.3708367 | 📌 HamCycle | -| 🇳 166 | ⭕️ 6_209_728 | 🕗 4.4891286 | 📌 HamCycle | -| 🇳 167 | ⭕️ 6_321_952 | 🕗 4.4396729 | 📌 HamCycle | -| 🇳 168 | ⭕️ 6_435_520 | 🕗 4.7049131 | 📌 HamCycle | -| 🇳 169 | ⭕️ 6_550_440 | 🕗 4.8034945 | 📌 HamCycle | -| 🇳 170 | ⭕️ 6_666_720 | 🕗 4.8120036 | 📌 HamCycle | -| 🇳 171 | ⭕️ 6_784_368 | 🕗 5.0999947 | 📌 HamCycle | -| 🇳 172 | ⭕️ 6_903_392 | 🕗 5.1406999 | 📌 HamCycle | -| 🇳 173 | ⭕️ 7_023_800 | 🕗 5.2226992 | 📌 HamCycle | -| 🇳 174 | ⭕️ 7_145_600 | 🕗 5.4760885 | 📌 HamCycle | -| 🇳 175 | ⭕️ 7_268_800 | 🕗 5.5385985 | 📌 HamCycle | -| 🇳 176 | ⭕️ 7_393_408 | 🕗 5.6618280 | 📌 HamCycle | -| 🇳 177 | ⭕️ 7_519_432 | 🕗 5.6368289 | 📌 HamCycle | -| 🇳 178 | ⭕️ 7_646_880 | 🕗 5.9726715 | 📌 HamCycle | -| 🇳 179 | ⭕️ 7_775_760 | 🕗 5.8712640 | 📌 HamCycle | -| 🇳 180 | ⭕️ 7_906_080 | 🕗 6.3023825 | 📌 HamCycle | -| 🇳 181 | ⭕️ 8_037_848 | 🕗 6.3492045 | 📌 HamCycle | -| 🇳 182 | ⭕️ 8_171_072 | 🕗 6.5235395 | 📌 HamCycle | -| 🇳 183 | ⭕️ 8_305_760 | 🕗 6.8535862 | 📌 HamCycle | -| 🇳 184 | ⭕️ 8_441_920 | 🕗 6.8551383 | 📌 HamCycle | -| 🇳 185 | ⭕️ 8_579_560 | 🕗 7.0290108 | 📌 HamCycle | -| 🇳 186 | ⭕️ 8_718_688 | 🕗 7.2782393 | 📌 HamCycle | -| 🇳 187 | ⭕️ 8_859_312 | 🕗 7.1627302 | 📌 HamCycle | -| 🇳 188 | ⭕️ 9_001_440 | 🕗 6.5989094 | 📌 HamCycle | -| 🇳 189 | ⭕️ 9_145_080 | 🕗 6.9484482 | 📌 HamCycle | -| 🇳 190 | ⭕️ 9_290_240 | 🕗 7.1640368 | 📌 HamCycle | -| 🇳 191 | ⭕️ 9_436_928 | 🕗 7.4092646 | 📌 HamCycle | -| 🇳 192 | ⭕️ 9_585_152 | 🕗 7.0487099 | 📌 HamCycle | -| 🇳 193 | ⭕️ 9_734_920 | 🕗 7.8608513 | 📌 HamCycle | -| 🇳 194 | ⭕️ 9_886_240 | 🕗 7.5017881 | 📌 HamCycle | -| 🇳 195 | ⭕️ 10_039_120 | 🕗 8.8736382 | 📌 HamCycle | -| 🇳 196 | ⭕️ 10_193_568 | 🕗 9.1231308 | 📌 HamCycle | -| 🇳 197 | ⭕️ 10_349_592 | 🕗 8.9380989 | 📌 HamCycle | -| 🇳 198 | ⭕️ 10_507_200 | 🕗 9.3729649 | 📌 HamCycle | -| 🇳 199 | ⭕️ 10_666_400 | 🕗 9.9800529 | 📌 HamCycle | -| 🇳 200 | ⭕️ 10_827_200 | 🕗 9.6292152 | 📌 HamCycle | -| 🇳 201 | ⭕️ 10_989_608 | 🕗 10.3535652 | 📌 HamCycle | -| 🇳 202 | ⭕️ 11_153_632 | 🕗 9.9995518 | 📌 HamCycle | -| 🇳 203 | ⭕️ 11_319_280 | 🕗 10.8522596 | 📌 HamCycle | -| 🇳 204 | ⭕️ 11_486_560 | 🕗 9.9973278 | 📌 HamCycle | -| 🇳 205 | ⭕️ 11_655_480 | 🕗 10.0661449 | 📌 HamCycle | -| 🇳 206 | ⭕️ 11_826_048 | 🕗 10.5527630 | 📌 HamCycle | -| 🇳 207 | ⭕️ 11_998_272 | 🕗 10.0613995 | 📌 HamCycle | -| 🇳 208 | ⭕️ 12_172_160 | 🕗 10.3916283 | 📌 HamCycle | -| 🇳 209 | ⭕️ 12_347_720 | 🕗 11.3493938 | 📌 HamCycle | -| 🇳 210 | ⭕️ 12_524_960 | 🕗 11.0978727 | 📌 HamCycle | -| 🇳 211 | ⭕️ 12_703_888 | 🕗 11.7553492 | 📌 HamCycle | -| 🇳 212 | ⭕️ 12_884_512 | 🕗 11.7754831 | 📌 HamCycle | -| 🇳 213 | ⭕️ 13_066_840 | 🕗 12.2666359 | 📌 HamCycle | -| 🇳 214 | ⭕️ 13_250_880 | 🕗 11.4517202 | 📌 HamCycle | -| 🇳 215 | ⭕️ 13_436_640 | 🕗 12.8435555 | 📌 HamCycle | -| 🇳 216 | ⭕️ 13_624_128 | 🕗 12.4718933 | 📌 HamCycle | -| 🇳 217 | ⭕️ 13_813_352 | 🕗 12.2922544 | 📌 HamCycle | -| 🇳 218 | ⭕️ 14_004_320 | 🕗 13.0266390 | 📌 HamCycle | -| 🇳 219 | ⭕️ 14_197_040 | 🕗 13.2950439 | 📌 HamCycle | -| 🇳 220 | ⭕️ 14_391_520 | 🕗 13.9172525 | 📌 HamCycle | -| 🇳 221 | ⭕️ 14_587_768 | 🕗 13.8073683 | 📌 HamCycle | -| 🇳 222 | ⭕️ 14_785_792 | 🕗 15.7910948 | 📌 HamCycle | -| 🇳 223 | ⭕️ 14_985_600 | 🕗 16.9914913 | 📌 HamCycle | -| 🇳 224 | ⭕️ 15_187_200 | 🕗 16.2843609 | 📌 HamCycle | -| 🇳 225 | ⭕️ 15_390_600 | 🕗 17.7109051 | 📌 HamCycle | -| 🇳 226 | ⭕️ 15_595_808 | 🕗 17.9329987 | 📌 HamCycle | -| 🇳 227 | ⭕️ 15_802_832 | 🕗 16.9582157 | 📌 HamCycle | -| 🇳 228 | ⭕️ 16_011_680 | 🕗 19.2418537 | 📌 HamCycle | -| 🇳 229 | ⭕️ 16_222_360 | 🕗 19.1698818 | 📌 HamCycle | -| 🇳 230 | ⭕️ 16_434_880 | 🕗 19.6889629 | 📌 HamCycle | -| 🇳 231 | ⭕️ 16_649_248 | 🕗 19.8991928 | 📌 HamCycle | -| 🇳 232 | ⭕️ 16_865_472 | 🕗 21.5891342 | 📌 HamCycle | -| 🇳 233 | ⭕️ 17_083_560 | 🕗 20.3988705 | 📌 HamCycle | -| 🇳 234 | ⭕️ 17_303_520 | 🕗 21.7813530 | 📌 HamCycle | -| 🇳 235 | ⭕️ 17_525_360 | 🕗 21.0040817 | 📌 HamCycle | -| 🇳 236 | ⭕️ 17_749_088 | 🕗 21.1004257 | 📌 HamCycle | -| 🇳 237 | ⭕️ 17_974_712 | 🕗 21.8259106 | 📌 HamCycle | -| 🇳 238 | ⭕️ 18_202_240 | 🕗 21.2663593 | 📌 HamCycle | -| 🇳 239 | ⭕️ 18_431_680 | 🕗 23.2225170 | 📌 HamCycle | -| 🇳 240 | ⭕️ 18_663_040 | 🕗 22.7874584 | 📌 HamCycle | -| 🇳 241 | ⭕️ 18_896_328 | 🕗 22.8182411 | 📌 HamCycle | -| 🇳 242 | ⭕️ 19_131_552 | 🕗 25.7061996 | 📌 HamCycle | -| 🇳 243 | ⭕️ 19_368_720 | 🕗 23.7010460 | 📌 HamCycle | -| 🇳 244 | ⭕️ 19_607_840 | 🕗 24.9740658 | 📌 HamCycle | -| 🇳 245 | ⭕️ 19_848_920 | 🕗 25.3079643 | 📌 HamCycle | -| 🇳 246 | ⭕️ 20_091_968 | 🕗 27.0324688 | 📌 HamCycle | -| 🇳 247 | ⭕️ 20_336_992 | 🕗 27.4217663 | 📌 HamCycle | -| 🇳 248 | ⭕️ 20_584_000 | 🕗 26.6019325 | 📌 HamCycle | -| 🇳 249 | ⭕️ 20_833_000 | 🕗 27.6203270 | 📌 HamCycle | -| 🇳 250 | ⭕️ 21_084_000 | 🕗 28.2027264 | 📌 HamCycle | -| 🇳 251 | ⭕️ 21_337_008 | 🕗 27.0395622 | 📌 HamCycle | -| 🇳 252 | ⭕️ 21_592_032 | 🕗 28.6985397 | 📌 HamCycle | -| 🇳 253 | ⭕️ 21_849_080 | 🕗 29.4975128 | 📌 HamCycle | -| 🇳 254 | ⭕️ 22_108_160 | 🕗 29.6304131 | 📌 HamCycle | -| 🇳 255 | ⭕️ 22_369_280 | 🕗 30.6687088 | 📌 HamCycle | -| 🇳 256 | ⭕️ 22_632_448 | 🕗 30.4113617 | 📌 HamCycle | -| 🇳 257 | ⭕️ 22_897_672 | 🕗 29.9068413 | 📌 HamCycle | -| 🇳 258 | ⭕️ 23_164_960 | 🕗 31.8059349 | 📌 HamCycle | -| 🇳 259 | ⭕️ 23_434_320 | 🕗 32.5649033 | 📌 HamCycle | -| 🇳 260 | ⭕️ 23_705_760 | 🕗 43.0857239 | 📌 HamCycle | -| 🇳 261 | ⭕️ 23_979_288 | 🕗 35.0142784 | 📌 HamCycle | -| 🇳 262 | ⭕️ 24_254_912 | 🕗 34.9660568 | 📌 HamCycle | -| 🇳 263 | ⭕️ 24_532_640 | 🕗 37.7527428 | 📌 HamCycle | -| 🇳 264 | ⭕️ 24_812_480 | 🕗 35.2763977 | 📌 HamCycle | -| 🇳 265 | ⭕️ 25_094_440 | 🕗 35.9335899 | 📌 HamCycle | -| 🇳 266 | ⭕️ 25_378_528 | 🕗 35.7696381 | 📌 HamCycle | -| 🇳 267 | ⭕️ 25_664_752 | 🕗 36.4937744 | 📌 HamCycle | -| 🇳 268 | ⭕️ 25_953_120 | 🕗 37.5988083 | 📌 HamCycle | -| 🇳 269 | ⭕️ 26_243_640 | 🕗 38.6533852 | 📌 HamCycle | -| 🇳 270 | ⭕️ 26_536_320 | 🕗 37.9381294 | 📌 HamCycle | -| 🇳 271 | ⭕️ 26_831_168 | 🕗 38.3561020 | 📌 HamCycle | -| 🇳 272 | ⭕️ 27_128_192 | 🕗 40.8908157 | 📌 HamCycle | -| 🇳 273 | ⭕️ 27_427_400 | 🕗 40.7272644 | 📌 HamCycle | -| 🇳 274 | ⭕️ 27_728_800 | 🕗 42.1620789 | 📌 HamCycle | -| 🇳 275 | ⭕️ 28_032_400 | 🕗 43.5559692 | 📌 HamCycle | -| 🇳 276 | ⭕️ 28_338_208 | 🕗 43.0557137 | 📌 HamCycle | -| 🇳 277 | ⭕️ 28_646_232 | 🕗 43.3311501 | 📌 HamCycle | -| 🇳 278 | ⭕️ 28_956_480 | 🕗 42.8031197 | 📌 HamCycle | -| 🇳 279 | ⭕️ 29_268_960 | 🕗 42.8381500 | 📌 HamCycle | -| 🇳 280 | ⭕️ 29_583_680 | 🕗 44.9772606 | 📌 HamCycle | -| 🇳 281 | ⭕️ 29_900_648 | 🕗 43.9280205 | 📌 HamCycle | -| 🇳 282 | ⭕️ 30_219_872 | 🕗 46.0957870 | 📌 HamCycle | -| 🇳 283 | ⭕️ 30_541_360 | 🕗 45.5541229 | 📌 HamCycle | -| 🇳 284 | ⭕️ 30_865_120 | 🕗 47.6350288 | 📌 HamCycle | -| 🇳 285 | ⭕️ 31_191_160 | 🕗 45.8156738 | 📌 HamCycle | -| 🇳 286 | ⭕️ 31_519_488 | 🕗 49.6814232 | 📌 HamCycle | -| 🇳 287 | ⭕️ 31_850_112 | 🕗 50.4522057 | 📌 HamCycle | -| 🇳 288 | ⭕️ 32_183_040 | 🕗 52.4631805 | 📌 HamCycle | -| 🇳 289 | ⭕️ 32_518_280 | 🕗 51.8870506 | 📌 HamCycle | -| 🇳 290 | ⭕️ 32_855_840 | 🕗 50.3747063 | 📌 HamCycle | -| 🇳 291 | ⭕️ 33_195_728 | 🕗 52.7208900 | 📌 HamCycle | -| 🇳 292 | ⭕️ 33_537_952 | 🕗 52.0394096 | 📌 HamCycle | -| 🇳 293 | ⭕️ 33_882_520 | 🕗 55.0489998 | 📌 HamCycle | -| 🇳 294 | ⭕️ 34_229_440 | 🕗 53.3723679 | 📌 HamCycle | -| 🇳 295 | ⭕️ 34_578_720 | 🕗 55.3163872 | 📌 HamCycle | -| 🇳 296 | ⭕️ 34_930_368 | 🕗 54.2411690 | 📌 HamCycle | -| 🇳 297 | ⭕️ 35_284_392 | 🕗 51.9341431 | 📌 HamCycle | -| 🇳 298 | ⭕️ 35_640_800 | 🕗 51.9760246 | 📌 HamCycle | -| 🇳 299 | ⭕️ 35_999_600 | 🕗 55.4841614 | 📌 HamCycle | -| 🇳 300 | ⭕️ 36_360_800 | 🕗 54.6801987 | 📌 HamCycle | -| 🇳 301 | ⭕️ 36_724_408 | 🕗 54.8235283 | 📌 HamCycle | -| 🇳 302 | ⭕️ 37_090_432 | 🕗 54.9316254 | 📌 HamCycle | -| 🇳 303 | ⭕️ 37_458_880 | 🕗 56.6585999 | 📌 HamCycle | -| 🇳 304 | ⭕️ 37_829_760 | 🕗 56.6689377 | 📌 HamCycle | -| 🇳 305 | ⭕️ 38_203_080 | 🕗 58.0978699 | 📌 HamCycle | -| 🇳 306 | ⭕️ 38_578_848 | 🕗 60.0594254 | 📌 HamCycle | -| 🇳 307 | ⭕️ 38_957_072 | 🕗 58.4241867 | 📌 HamCycle | -| 🇳 308 | ⭕️ 39_337_760 | 🕗 60.0390778 | 📌 HamCycle | -| 🇳 309 | ⭕️ 39_720_920 | 🕗 58.0487709 | 📌 HamCycle | -| 🇳 310 | ⭕️ 40_106_560 | 🕗 63.4117470 | 📌 HamCycle | -| 🇳 311 | ⭕️ 40_494_688 | 🕗 64.7791367 | 📌 HamCycle | -| 🇳 312 | ⭕️ 40_885_312 | 🕗 63.1891747 | 📌 HamCycle | -| 🇳 313 | ⭕️ 41_278_440 | 🕗 62.3610802 | 📌 HamCycle | -| 🇳 314 | ⭕️ 41_674_080 | 🕗 62.7601547 | 📌 HamCycle | -| 🇳 315 | ⭕️ 42_072_240 | 🕗 70.5453110 | 📌 HamCycle | -| 🇳 316 | ⭕️ 42_472_928 | 🕗 64.9709167 | 📌 HamCycle | -| 🇳 317 | ⭕️ 42_876_152 | 🕗 67.3512802 | 📌 HamCycle | -| 🇳 318 | ⭕️ 43_281_920 | 🕗 66.5858994 | 📌 HamCycle | -| 🇳 319 | ⭕️ 43_690_240 | 🕗 63.9276123 | 📌 HamCycle | -| 🇳 320 | ⭕️ 44_101_120 | 🕗 69.6732635 | 📌 HamCycle | -| 🇳 321 | ⭕️ 44_514_568 | 🕗 69.3464203 | 📌 HamCycle | -| 🇳 322 | ⭕️ 44_930_592 | 🕗 70.3431854 | 📌 HamCycle | -| 🇳 323 | ⭕️ 45_349_200 | 🕗 73.5013657 | 📌 HamCycle | -| 🇳 324 | ⭕️ 45_770_400 | 🕗 79.6885605 | 📌 HamCycle | -| 🇳 325 | ⭕️ 46_194_200 | 🕗 74.0430298 | 📌 HamCycle | -| 🇳 326 | ⭕️ 46_620_608 | 🕗 75.2163620 | 📌 HamCycle | -| 🇳 327 | ⭕️ 47_049_632 | 🕗 78.0254517 | 📌 HamCycle | -| 🇳 328 | ⭕️ 47_481_280 | 🕗 80.5947723 | 📌 HamCycle | -| 🇳 329 | ⭕️ 47_915_560 | 🕗 79.0147934 | 📌 HamCycle | -| 🇳 330 | ⭕️ 48_352_480 | 🕗 84.0448608 | 📌 HamCycle | -| 🇳 331 | ⭕️ 48_792_048 | 🕗 75.8492889 | 📌 HamCycle | -| 🇳 332 | ⭕️ 49_234_272 | 🕗 81.1769180 | 📌 HamCycle | -| 🇳 333 | ⭕️ 49_679_160 | 🕗 81.2884064 | 📌 HamCycle | -| 🇳 334 | ⭕️ 50_126_720 | 🕗 82.8648071 | 📌 HamCycle | -| 🇳 335 | ⭕️ 50_576_960 | 🕗 86.6697006 | 📌 HamCycle | -| 🇳 336 | ⭕️ 51_029_888 | 🕗 80.7290878 | 📌 HamCycle | -| 🇳 337 | ⭕️ 51_485_512 | 🕗 87.1696930 | 📌 HamCycle | -| 🇳 338 | ⭕️ 51_943_840 | 🕗 88.1169586 | 📌 HamCycle | -| 🇳 339 | ⭕️ 52_404_880 | 🕗 89.6203918 | 📌 HamCycle | -| 🇳 340 | ⭕️ 52_868_640 | 🕗 88.3642960 | 📌 HamCycle | -| 🇳 341 | ⭕️ 53_335_128 | 🕗 91.5185699 | 📌 HamCycle | -| 🇳 342 | ⭕️ 53_804_352 | 🕗 90.6791458 | 📌 HamCycle | -| 🇳 343 | ⭕️ 54_276_320 | 🕗 93.8216400 | 📌 HamCycle | -| 🇳 344 | ⭕️ 54_751_040 | 🕗 97.2271423 | 📌 HamCycle | -| 🇳 345 | ⭕️ 55_228_520 | 🕗 98.5113297 | 📌 HamCycle | -| 🇳 346 | ⭕️ 55_708_768 | 🕗 98.7739105 | 📌 HamCycle | -| 🇳 347 | ⭕️ 56_191_792 | 🕗 100.9957047 | 📌 HamCycle | -| 🇳 348 | ⭕️ 56_677_600 | 🕗 101.0744858 | 📌 HamCycle | -| 🇳 349 | ⭕️ 57_166_200 | 🕗 102.4343033 | 📌 HamCycle | -| 🇳 350 | ⭕️ 57_657_600 | 🕗 99.1940536 | 📌 HamCycle | -| 🇳 351 | ⭕️ 58_151_808 | 🕗 99.3149796 | 📌 HamCycle | -| 🇳 352 | ⭕️ 58_648_832 | 🕗 106.0990753 | 📌 HamCycle | -| 🇳 353 | ⭕️ 59_148_680 | 🕗 105.4814377 | 📌 HamCycle | -| 🇳 354 | ⭕️ 59_651_360 | 🕗 105.9914627 | 📌 HamCycle | -| 🇳 355 | ⭕️ 60_156_880 | 🕗 107.3770676 | 📌 HamCycle | -| 🇳 356 | ⭕️ 60_665_248 | 🕗 112.0929108 | 📌 HamCycle | -| 🇳 357 | ⭕️ 61_176_472 | 🕗 113.0250702 | 📌 HamCycle | -| 🇳 358 | ⭕️ 61_690_560 | 🕗 112.2821579 | 📌 HamCycle | -| 🇳 359 | ⭕️ 62_207_520 | 🕗 113.3290863 | 📌 HamCycle | -| 🇳 360 | ⭕️ 62_727_360 | 🕗 118.3366318 | 📌 HamCycle | -| 🇳 361 | ⭕️ 63_250_088 | 🕗 114.1650162 | 📌 HamCycle | -| 🇳 362 | ⭕️ 63_775_712 | 🕗 119.7422180 | 📌 HamCycle | -| 🇳 363 | ⭕️ 64_304_240 | 🕗 118.4231873 | 📌 HamCycle | -| 🇳 364 | ⭕️ 64_835_680 | 🕗 119.1417236 | 📌 HamCycle | -| 🇳 365 | ⭕️ 65_370_040 | 🕗 122.5782623 | 📌 HamCycle | -| 🇳 366 | ⭕️ 65_907_328 | 🕗 122.3472290 | 📌 HamCycle | -| 🇳 367 | ⭕️ 66_447_552 | 🕗 121.7662506 | 📌 HamCycle | -| 🇳 368 | ⭕️ 66_990_720 | 🕗 128.8301849 | 📌 HamCycle | -| 🇳 369 | ⭕️ 67_536_840 | 🕗 127.1080475 | 📌 HamCycle | -| 🇳 370 | ⭕️ 68_085_920 | 🕗 129.2564545 | 📌 HamCycle | -| 🇳 371 | ⭕️ 68_637_968 | 🕗 142.4124908 | 📌 HamCycle | -| 🇳 372 | ⭕️ 69_192_992 | 🕗 138.0613861 | 📌 HamCycle | -| 🇳 373 | ⭕️ 69_751_000 | 🕗 138.7724304 | 📌 HamCycle | -| 🇳 374 | ⭕️ 70_312_000 | 🕗 137.8485718 | 📌 HamCycle | -| 🇳 375 | ⭕️ 70_876_000 | 🕗 141.4355316 | 📌 HamCycle | -| 🇳 376 | ⭕️ 71_443_008 | 🕗 142.3190918 | 📌 HamCycle | -| 🇳 377 | ⭕️ 72_013_032 | 🕗 138.6949768 | 📌 HamCycle | -| 🇳 378 | ⭕️ 72_586_080 | 🕗 139.6701355 | 📌 HamCycle | -| 🇳 379 | ⭕️ 73_162_160 | 🕗 140.9620361 | 📌 HamCycle | -| 🇳 380 | ⭕️ 73_741_280 | 🕗 147.0547333 | 📌 HamCycle | -| 🇳 381 | ⭕️ 74_323_448 | 🕗 147.3148956 | 📌 HamCycle | -| 🇳 382 | ⭕️ 74_908_672 | 🕗 154.1600494 | 📌 HamCycle | -| 🇳 383 | ⭕️ 75_496_960 | 🕗 148.8446350 | 📌 HamCycle | -| 🇳 384 | ⭕️ 76_088_320 | 🕗 159.7727356 | 📌 HamCycle | -| 🇳 385 | ⭕️ 76_682_760 | 🕗 153.8689575 | 📌 HamCycle | -| 🇳 386 | ⭕️ 77_280_288 | 🕗 153.9478607 | 📌 HamCycle | -| 🇳 387 | ⭕️ 77_880_912 | 🕗 152.6566315 | 📌 HamCycle | -| 🇳 388 | ⭕️ 78_484_640 | 🕗 154.2044067 | 📌 HamCycle | -| 🇳 389 | ⭕️ 79_091_480 | 🕗 151.8361816 | 📌 HamCycle | -| 🇳 390 | ⭕️ 79_701_440 | 🕗 159.2859039 | 📌 HamCycle | -| 🇳 391 | ⭕️ 80_314_528 | 🕗 157.1283112 | 📌 HamCycle | -| 🇳 392 | ⭕️ 80_930_752 | 🕗 163.1609955 | 📌 HamCycle | -| 🇳 393 | ⭕️ 81_550_120 | 🕗 168.0905151 | 📌 HamCycle | -| 🇳 394 | ⭕️ 82_172_640 | 🕗 174.3224030 | 📌 HamCycle | -| 🇳 395 | ⭕️ 82_798_320 | 🕗 173.4094696 | 📌 HamCycle | -| 🇳 396 | ⭕️ 83_427_168 | 🕗 166.3798370 | 📌 HamCycle | -| 🇳 397 | ⭕️ 84_059_192 | 🕗 174.8748474 | 📌 HamCycle | -| 🇳 398 | ⭕️ 84_694_400 | 🕗 171.5663300 | 📌 HamCycle | -| 🇳 399 | ⭕️ 85_332_800 | 🕗 176.2673798 | 📌 HamCycle | -| 🇳 400 | ⭕️ 85_974_400 | 🕗 181.5958099 | 📌 HamCycle | -| 🇳 401 | ⭕️ 86_619_208 | 🕗 180.0063477 | 📌 HamCycle | -| 🇳 402 | ⭕️ 87_267_232 | 🕗 179.0526123 | 📌 HamCycle | -| 🇳 403 | ⭕️ 87_918_480 | 🕗 182.1016083 | 📌 HamCycle | -| 🇳 404 | ⭕️ 88_572_960 | 🕗 180.8249359 | 📌 HamCycle | -| 🇳 405 | ⭕️ 89_230_680 | 🕗 180.9492340 | 📌 HamCycle | -| 🇳 406 | ⭕️ 89_891_648 | 🕗 190.3913879 | 📌 HamCycle | -| 🇳 407 | ⭕️ 90_555_872 | 🕗 192.4388580 | 📌 HamCycle | -| 🇳 408 | ⭕️ 91_223_360 | 🕗 191.1726532 | 📌 HamCycle | -| 🇳 409 | ⭕️ 91_894_120 | 🕗 201.1885529 | 📌 HamCycle | -| 🇳 410 | ⭕️ 92_568_160 | 🕗 198.3737030 | 📌 HamCycle | -| 🇳 411 | ⭕️ 93_245_488 | 🕗 194.6151276 | 📌 HamCycle | -| 🇳 412 | ⭕️ 93_926_112 | 🕗 205.8743744 | 📌 HamCycle | -| 🇳 413 | ⭕️ 94_610_040 | 🕗 205.3444519 | 📌 HamCycle | -| 🇳 414 | ⭕️ 95_297_280 | 🕗 204.2312012 | 📌 HamCycle | -| 🇳 415 | ⭕️ 95_987_840 | 🕗 214.5655060 | 📌 HamCycle | -| 🇳 416 | ⭕️ 96_681_728 | 🕗 204.0137482 | 📌 HamCycle | -| 🇳 417 | ⭕️ 97_378_952 | 🕗 212.5135193 | 📌 HamCycle | -| 🇳 418 | ⭕️ 98_079_520 | 🕗 225.6294098 | 📌 HamCycle | -| 🇳 419 | ⭕️ 98_783_440 | 🕗 209.5414124 | 📌 HamCycle | -| 🇳 420 | ⭕️ 99_490_720 | 🕗 205.7293549 | 📌 HamCycle | -| 🇳 421 | ⭕️ 100_201_368 | 🕗 228.3509674 | 📌 HamCycle | -| 🇳 422 | ⭕️ 100_915_392 | 🕗 229.7209167 | 📌 HamCycle | -| 🇳 423 | ⭕️ 101_632_800 | 🕗 233.1378174 | 📌 HamCycle | -| 🇳 424 | ⭕️ 102_353_600 | 🕗 222.1818085 | 📌 HamCycle | -| 🇳 425 | ⭕️ 103_077_800 | 🕗 232.3297272 | 📌 HamCycle | -| 🇳 426 | ⭕️ 103_805_408 | 🕗 229.1684723 | 📌 HamCycle | -| 🇳 427 | ⭕️ 104_536_432 | 🕗 243.6679382 | 📌 HamCycle | -| 🇳 428 | ⭕️ 105_270_880 | 🕗 236.8065186 | 📌 HamCycle | -| 🇳 425 | ⭕️ 103_077_800 | 🕗 232.3297272 | 📌 HamCycle | -| 🇳 426 | ⭕️ 103_805_408 | 🕗 229.1684723 | 📌 HamCycle | -| 🇳 427 | ⭕️ 104_536_432 | 🕗 243.6679382 | 📌 HamCycle | -| 🇳 428 | ⭕️ 105_270_880 | 🕗 236.8065186 | 📌 HamCycle | -| 🇳 425 | ⭕️ 103_077_800 | 🕗 232.3297272 | 📌 HamCycle | -| 🇳 426 | ⭕️ 103_805_408 | 🕗 229.1684723 | 📌 HamCycle | -| 🇳 427 | ⭕️ 104_536_432 | 🕗 243.6679382 | 📌 HamCycle | -| 🇳 428 | ⭕️ 105_270_880 | 🕗 236.8065186 | 📌 HamCycle | -| 🇳 429 | ⭕️ 106_008_760 | 🕗 238.1333313 | 📌 HamCycle | -| 🇳 430 | ⭕️ 106_750_080 | 🕗 246.2862091 | 📌 HamCycle | -| 🇳 431 | ⭕️ 107_494_848 | 🕗 246.6469116 | 📌 HamCycle | -| 🇳 432 | ⭕️ 108_243_072 | 🕗 262.9234924 | 📌 HamCycle | -| 🇳 433 | ⭕️ 108_994_760 | 🕗 249.9560699 | 📌 HamCycle | -| 🇳 434 | ⭕️ 109_749_920 | 🕗 251.8942566 | 📌 HamCycle | -| 🇳 440 | ⭕️ 114_354_240 | 🕗 260.3761292 | 📌 HamCycle | -| 🇳 441 | ⭕️ 115_133_928 | 🕗 263.5421143 | 📌 HamCycle | -| 🇳 442 | ⭕️ 115_917_152 | 🕗 259.1378784 | 📌 HamCycle | -| 🇳 443 | ⭕️ 116_703_920 | 🕗 270.7347717 | 📌 HamCycle | -| 🇳 444 | ⭕️ 117_494_240 | 🕗 288.3459778 | 📌 HamCycle | -| 🇳 445 | ⭕️ 118_288_120 | 🕗 278.2333679 | 📌 HamCycle | -| 🇳 446 | ⭕️ 119_085_568 | 🕗 280.1857910 | 📌 HamCycle | -| 🇳 447 | ⭕️ 119_886_592 | 🕗 299.4025269 | 📌 HamCycle | -| 🇳 448 | ⭕️ 120_691_200 | 🕗 303.8379517 | 📌 HamCycle | -| 🇳 449 | ⭕️ 121_499_400 | 🕗 315.9012451 | 📌 HamCycle | -| 🇳 450 | ⭕️ 122_311_200 | 🕗 314.5906372 | 📌 HamCycle | -| 🇳 451 | ⭕️ 123_126_608 | 🕗 326.6910400 | 📌 HamCycle | -| 🇳 452 | ⭕️ 123_945_632 | 🕗 334.6388855 | 📌 HamCycle | -| 🇳 453 | ⭕️ 124_768_280 | 🕗 340.3795471 | 📌 HamCycle | -| 🇳 454 | ⭕️ 125_594_560 | 🕗 345.4236450 | 📌 HamCycle | -| 🇳 455 | ⭕️ 126_424_480 | 🕗 332.5567932 | 📌 HamCycle | -| 🇳 456 | ⭕️ 127_258_048 | 🕗 346.8245544 | 📌 HamCycle | -| 🇳 457 | ⭕️ 128_095_272 | 🕗 355.9805908 | 📌 HamCycle | -| 🇳 458 | ⭕️ 128_936_160 | 🕗 359.0083313 | 📌 HamCycle | -| 🇳 459 | ⭕️ 129_780_720 | 🕗 375.8215637 | 📌 HamCycle | -| 🇳 460 | ⭕️ 130_628_960 | 🕗 376.1432495 | 📌 HamCycle | -| 🇳 461 | ⭕️ 131_480_888 | 🕗 376.5814209 | 📌 HamCycle | -| 🇳 462 | ⭕️ 132_336_512 | 🕗 397.5814209 | 📌 HamCycle | -| 🇳 463 | ⭕️ 133_195_840 | 🕗 377.2076111 | 📌 HamCycle | -| 🇳 464 | ⭕️ 134_058_880 | 🕗 375.8837280 | 📌 HamCycle | -| 🇳 465 | ⭕️ 134_925_640 | 🕗 388.6386108 | 📌 HamCycle | -| 🇳 466 | ⭕️ 135_796_128 | 🕗 395.4193420 | 📌 HamCycle | -| 🇳 467 | ⭕️ 136_670_352 | 🕗 388.5943604 | 📌 HamCycle | -| 🇳 468 | ⭕️ 137_548_320 | 🕗 379.1246338 | 📌 HamCycle | -| 🇳 469 | ⭕️ 138_430_040 | 🕗 392.6550903 | 📌 HamCycle | -| 🇳 470 | ⭕️ 139_315_520 | 🕗 388.9270325 | 📌 HamCycle | -| 🇳 471 | ⭕️ 140_204_768 | 🕗 318.1142578 | 📌 HamCycle | -| 🇳 472 | ⭕️ 141_097_792 | 🕗 355.8233643 | 📌 HamCycle | -| 🇳 473 | ⭕️ 141_994_600 | 🕗 344.4631348 | 📌 HamCycle | -| 🇳 474 | ⭕️ 142_895_200 | 🕗 345.8013916 | 📌 HamCycle | -| 🇳 475 | ⭕️ 143_799_600 | 🕗 352.4673462 | 📌 HamCycle | -| 🇳 476 | ⭕️ 144_707_808 | 🕗 343.4831543 | 📌 HamCycle | -| 🇳 477 | ⭕️ 145_619_832 | 🕗 365.9343567 | 📌 HamCycle | -| 🇳 478 | ⭕️ 146_535_680 | 🕗 377.1398010 | 📌 HamCycle | -| 🇳 479 | ⭕️ 147_455_360 | 🕗 365.9949951 | 📌 HamCycle | -| 🇳 480 | ⭕️ 148_378_880 | 🕗 386.4993591 | 📌 HamCycle | -| 🇳 481 | ⭕️ 149_306_248 | 🕗 373.3592224 | 📌 HamCycle | -| 🇳 482 | ⭕️ 150_237_472 | 🕗 370.6579895 | 📌 HamCycle | -| 🇳 483 | ⭕️ 151_172_560 | 🕗 372.9201965 | 📌 HamCycle | -| 🇳 484 | ⭕️ 152_111_520 | 🕗 392.2236938 | 📌 HamCycle | -| 🇳 485 | ⭕️ 153_054_360 | 🕗 391.6574402 | 📌 HamCycle | -| 🇳 486 | ⭕️ 154_001_088 | 🕗 376.3860474 | 📌 HamCycle | -| 🇳 487 | ⭕️ 154_951_712 | 🕗 394.4570312 | 📌 HamCycle | -| 🇳 488 | ⭕️ 155_906_240 | 🕗 390.2160034 | 📌 HamCycle | -| 🇳 489 | ⭕️ 156_864_680 | 🕗 388.6850586 | 📌 HamCycle | -| 🇳 490 | ⭕️ 157_827_040 | 🕗 403.0396729 | 📌 HamCycle | -| 🇳 491 | ⭕️ 158_793_328 | 🕗 407.4985352 | 📌 HamCycle | -| 🇳 492 | ⭕️ 159_763_552 | 🕗 409.3179932 | 📌 HamCycle | -| 🇳 493 | ⭕️ 160_737_720 | 🕗 412.5714417 | 📌 HamCycle | -| 🇳 494 | ⭕️ 161_715_840 | 🕗 410.0222778 | 📌 HamCycle | -| 🇳 495 | ⭕️ 162_697_920 | 🕗 418.6289673 | 📌 HamCycle | -| 🇳 496 | ⭕️ 163_683_968 | 🕗 418.1947937 | 📌 HamCycle | -| 🇳 497 | ⭕️ 164_673_992 | 🕗 439.4223633 | 📌 HamCycle | -| 🇳 498 | ⭕️ 165_668_000 | 🕗 438.3364868 | 📌 HamCycle | -| 🇳 499 | ⭕️ 166_666_000 | 🕗 492.7932739 | 📌 HamCycle | -| 🇳 500 | ⭕️ 167_668_000 | 🕗 516.4312134 | 📌 HamCycle | -| 🇳 501 | ⭕️ 168_674_008 | 🕗 524.0866699 | 📌 HamCycle | -| 🇳 502 | ⭕️ 169_684_032 | 🕗 511.3805542 | 📌 HamCycle | -| 🇳 503 | ⭕️ 170_698_080 | 🕗 514.9252930 | 📌 HamCycle | -| 🇳 504 | ⭕️ 171_716_160 | 🕗 522.7913818 | 📌 HamCycle | -| 🇳 505 | ⭕️ 172_738_280 | 🕗 505.0050659 | 📌 HamCycle | -| 🇳 506 | ⭕️ 173_764_448 | 🕗 521.3956299 | 📌 HamCycle | -| 🇳 507 | ⭕️ 174_794_672 | 🕗 534.2333374 | 📌 HamCycle | -| 🇳 508 | ⭕️ 175_828_960 | 🕗 533.0936279 | 📌 HamCycle | -| 🇳 509 | ⭕️ 176_867_320 | 🕗 530.5546265 | 📌 HamCycle | -| 🇳 510 | ⭕️ 177_909_760 | 🕗 537.9629517 | 📌 HamCycle | -| 🇳 511 | ⭕️ 178_956_288 | 🕗 554.1561279 | 📌 HamCycle | -| 🇳 512 | ⭕️ 180_006_912 | 🕗 562.2781372 | 📌 HamCycle | -| 🇳 513 | ⭕️ 181_061_640 | 🕗 536.6725464 | 📌 HamCycle | -| 🇳 514 | ⭕️ 182_120_480 | 🕗 558.1255493 | 📌 HamCycle | -| 🇳 515 | ⭕️ 183_183_440 | 🕗 559.7949829 | 📌 HamCycle | -| 🇳 516 | ⭕️ 184_250_528 | 🕗 553.7504272 | 📌 HamCycle | -| 🇳 517 | ⭕️ 185_321_752 | 🕗 568.6388550 | 📌 HamCycle | -| 🇳 518 | ⭕️ 186_397_120 | 🕗 566.1765747 | 📌 HamCycle | -| 🇳 519 | ⭕️ 187_476_640 | 🕗 554.7770996 | 📌 HamCycle | -| 🇳 520 | ⭕️ 188_560_320 | 🕗 567.4897461 | 📌 HamCycle | -| 🇳 521 | ⭕️ 189_648_168 | 🕗 582.4830933 | 📌 HamCycle | -| 🇳 512 | ⭕️ 180_006_912 | 🕗 562.2781372 | 📌 HamCycle | -| 🇳 513 | ⭕️ 181_061_640 | 🕗 536.6725464 | 📌 HamCycle | -| 🇳 514 | ⭕️ 182_120_480 | 🕗 558.1255493 | 📌 HamCycle | -| 🇳 515 | ⭕️ 183_183_440 | 🕗 559.7949829 | 📌 HamCycle | -| 🇳 516 | ⭕️ 184_250_528 | 🕗 553.7504272 | 📌 HamCycle | -| 🇳 517 | ⭕️ 185_321_752 | 🕗 568.6388550 | 📌 HamCycle | -| 🇳 518 | ⭕️ 186_397_120 | 🕗 566.1765747 | 📌 HamCycle | -| 🇳 519 | ⭕️ 187_476_640 | 🕗 554.7770996 | 📌 HamCycle | -| 🇳 520 | ⭕️ 188_560_320 | 🕗 567.4897461 | 📌 HamCycle | -| 🇳 521 | ⭕️ 189_648_168 | 🕗 582.4830933 | 📌 HamCycle | -| 🇳 522 | ⭕️ 190_740_192 | 🕗 569.0377197 | 📌 HamCycle | -| 🇳 523 | ⭕️ 191_836_400 | 🕗 597.1223755 | 📌 HamCycle | -| 🇳 524 | ⭕️ 192_936_800 | 🕗 601.2348633 | 📌 HamCycle | -| 🇳 525 | ⭕️ 194_041_400 | 🕗 580.0333862 | 📌 HamCycle | -| 🇳 526 | ⭕️ 195_150_208 | 🕗 507.3114014 | 📌 HamCycle | -| 🇳 527 | ⭕️ 196_263_232 | 🕗 502.4771118 | 📌 HamCycle | -| 🇳 528 | ⭕️ 197_380_480 | 🕗 511.4998169 | 📌 HamCycle | -| 🇳 529 | ⭕️ 198_501_960 | 🕗 509.7370605 | 📌 HamCycle | -| 🇳 530 | ⭕️ 199_627_680 | 🕗 520.2709961 | 📌 HamCycle | -| 🇳 531 | ⭕️ 200_757_648 | 🕗 518.3181152 | 📌 HamCycle | -| 🇳 532 | ⭕️ 201_891_872 | 🕗 504.7783813 | 📌 HamCycle | -| 🇳 533 | ⭕️ 203_030_360 | 🕗 535.0303345 | 📌 HamCycle | -| 🇳 534 | ⭕️ 204_173_120 | 🕗 544.2910156 | 📌 HamCycle | 51.5 GB -| 🇳 535 | ⭕️ 205_320_160 | 🕗 531.3876953 | 📌 HamCycle | 53.3 GB -| 🇳 536 | ⭕️ 206_471_488 | 🕗 566.9558716 | 📌 HamCycle | 54.6 GB -| 🇳 537 | ⭕️ 207_627_112 | 🕗 573.6485596 | 📌 HamCycle | -| 🇳 538 | ⭕️ 208_787_040 | 🕗 555.6110229 | 📌 HamCycle | -| 🇳 539 | ⭕️ 209_951_280 | 🕗 570.1338501 | 📌 HamCycle | -| 🇳 540 | ⭕️ 211_119_840 | 🕗 565.0805664 | 📌 HamCycle | -| 🇳 541 | ⭕️ 212_292_728 | 🕗 563.1724243 | 📌 HamCycle | -| 🇳 542 | ⭕️ 213_469_952 | 🕗 572.6234131 | 📌 HamCycle | -| 🇳 543 | ⭕️ 214_651_520 | 🕗 595.1621094 | 📌 HamCycle | -| 🇳 544 | ⭕️ 215_837_440 | 🕗 595.5155029 | 📌 HamCycle | 55.8 -| 🇳 545 | ⭕️ 217_027_720 | 🕗 614.3336182 | 📌 HamCycle | 56.8 -| 🇳 546 | ⭕️ 218_222_368 | 🕗 676.3571167 | 📌 HamCycle | -| 🇳 547 | ⭕️ 219_421_392 | 🕗 706.4018555 | 📌 HamCycle | -| 🇳 548 | ⭕️ 220_624_800 | 🕗 707.0447388 | 📌 HamCycle | -| 🇳 549 | ⭕️ 221_832_600 | 🕗 690.8361206 | 📌 HamCycle | -| 🇳 550 | ⭕️ 223_044_800 | 🕗 601.1645508 | 📌 HamCycle | 51.6 -| 🇳 551 | ⭕️ 224_261_408 | 🕗 666.2920532 | 📌 HamCycle | 53.5 -| 🇳 552 | ⭕️ 225_482_432 | 🕗 707.9029541 | 📌 HamCycle | -| 🇳 553 | ⭕️ 226_707_880 | 🕗 748.0688477 | 📌 HamCycle | -| 🇳 554 | ⭕️ 227_937_760 | 🕗 676.2214966 | 📌 HamCycle | -| 🇳 555 | ⭕️ 229_172_080 | 🕗 712.5463867 | 📌 HamCycle | -| 🇳 556 | ⭕️ 230_410_848 | 🕗 714.9957275 | 📌 HamCycle | 56.1 -| 🇳 557 | ⭕️ 231_654_072 | 🕗 714.2865601 | 📌 HamCycle | 53.5 -| 🇳 558 | ⭕️ 232_901_760 | 🕗 738.4812622 | 📌 HamCycle | 53.1 -| 🇳 559 | ⭕️ 234_153_920 | 🕗 678.1728516 | 📌 HamCycle | 61.1 -| 🇳 560 | ⭕️ 235_410_560 | 🕗 741.5216064 | 📌 HamCycle | 58.2 / i32 to i16 -| 🇳 561 | ⭕️ 235_410_560 | 🕗 739.4226074 | 📌 HamCycle | 60.3 -| 🇳 562 | ⭕️ 237_937_312 | 🕗 751.3547363 | 📌 HamCycle | 60.3 -| 🇳 563 | ⭕️ 239_207_440 | 🕗 751.3547363 | 📌 HamCycle | 58.6 / 71.4 -| 🇳 563 | ⭕️ 239_207_440 | 🕗 807.9031982 | 📌 HamCycle | -| 🇳 564 | ⭕️ 240_482_080 | 🕗 800.5877686 | 📌 HamCycle | -| 🇳 565 | ⭕️ 241_761_240 | 🕗 803.6581421 | 📌 HamCycle | -| 🇳 566 | ⭕️ 243_044_928 | 🕗 814.1091919 | 📌 HamCycle | -| 🇳 567 | ⭕️ 244_333_152 | 🕗 862.6309204 | 📌 HamCycle | -| 🇳 568 | ⭕️ 245_625_920 | 🕗 827.5814819 | 📌 HamCycle | 63.7 -| 🇳 569 | ⭕️ 246_923_240 | 🕗 795.9773560 | 📌 HamCycle | -| 🇳 570 | ⭕️ 248_225_120 | 🕗 830.3286133 | 📌 HamCycle | 60.2 / 73.2 -| 🇳 571 | ⭕️ 249_531_568 | 🕗 **** killed | 📌 ???????? | 60.7 / 69.8 -| 🇳 572 | ⭕️ 250_842_592 | 🕗 842.4531250 | 📌 HamCycle | 60.5 / 73.2 -| 🇳 573 | ⭕️ 252_158_200 | 🕗 832.7617188 | 📌 HamCycle | 61.5 / 85.4 -| 🇳 574 | ⭕️ 253_478_400 | 🕗 923.9602661 | 📌 HamCycle | -| 🇳 575 | ⭕️ 254_803_200 | 🕗 766.1255493 | 📌 HamCycle | -| 🇳 576 | ⭕️ 256_132_608 | 🕗 774.5940552 | 📌 HamCycle | -| 🇳 577 | ⭕️ 257_466_632 | 🕗 791.0694580 | 📌 HamCycle | -| 🇳 578 | ⭕️ 258_805_280 | 🕗 807.0501709 | 📌 HamCycle | 60.4 / 70.2 -| 🇳 579 | ⭕️ 260_148_560 | 🕗 824.6404419 | 📌 HamCycle | -| 🇳 580 | ⭕️ 261_496_480 | 🕗 872.5145264 | 📌 HamCycle | 61.8 / 111.1 -| 🇳 581 | ⭕️ 262_849_048 | 🕗 837.4335327 | 📌 HamCycle | -| 🇳 582 | ⭕️ 264_206_272 | 🕗 891.2608643 | 📌 HamCycle | -| 🇳 583 | ⭕️ 265_568_160 | 🕗 905.2769165 | 📌 HamCycle | -| 🇳 584 | ⭕️ 266_934_720 | 🕗 857.3369751 | 📌 HamCycle | -| 🇳 585 | ⭕️ 268_305_960 | 🕗 872.7847290 | 📌 HamCycle | 62.6 / 73.3 -| 🇳 586 | ⭕️ 269_681_888 | 🕗 874.3071289 | 📌 HamCycle | -| 🇳 587 | ⭕️ 271_062_512 | 🕗 945.0466919 | 📌 HamCycle | -| 🇳 588 | ⭕️ 272_447_840 | 🕗 922.8352661 | 📌 HamCycle | -| 🇳 589 | ⭕️ 273_837_880 | 🕗 904.4743652 | 📌 HamCycle | 62.1 / 74.5 -| 🇳 590 | ⭕️ 275_232_640 | 🕗 1047.4342041 | 📌 HamCycle | -| 🇳 591 | ⭕️ 276_632_128 | 🕗 1068.1927490 | 📌 HamCycle | -| 🇳 592 | ⭕️ 278_036_352 | 🕗 1068.0819092 | 📌 HamCycle | -| 🇳 593 | ⭕️ 279_445_320 | 🕗 1085.4078369 | 📌 HamCycle | 62.0 / 76.6 -| 🇳 594 | ⭕️ 280_859_040 | 🕗 1087.4641113 | 📌 HamCycle | -| 🇳 595 | ⭕️ 282_277_520 | 🕗 1064.1060791 | 📌 HamCycle | 62.0 / 77.6 -| 🇳 596 | ⭕️ 283_700_768 | 🕗 1065.7447510 | 📌 HamCycle | -| 🇳 597 | ⭕️ 285_128_792 | 🕗 1075.8626709 | 📌 HamCycle | -| 🇳 598 | ⭕️ 286_561_600 | 🕗 1125.0163574 | 📌 HamCycle | -| 🇳 599 | ⭕️ 287_999_200 | 🕗 1105.4565430 | 📌 HamCycle | 61.2 / 79.9 -| 🇳 600 | ⭕️ 289_441_600 | 🕗 1137.9167480 | 📌 HamCycle | -| 🇳 601 | ⭕️ 290_888_808 | 🕗 1183.4355132 | 📌 HamCycle | -| 🇳 602 | ⭕️ 292_340_832 | 🕗 1202.5359846 | 📌 HamCycle | -| 🇳 603 | ⭕️ 293_797_680 | 🕗 1240.7123410 | 📌 HamCycle | -| 🇳 604 | ⭕️ 295_259_360 | 🕗 1256.9564694 | 📌 HamCycle | -| 🇳 605 | ⭕️ 296_725_880 | 🕗 1243.0841124 | 📌 HamCycle | -| 🇳 606 | ⭕️ 298_197_248 | 🕗 1273.3368623 | 📌 HamCycle | -| 🇳 607 | ⭕️ 299_673_472 | 🕗 1264.3157187 | 📌 HamCycle | -| 🇳 608 | ⭕️ 301_154_560 | 🕗 1310.4387956 | 📌 HamCycle | -| 🇳 609 | ⭕️ 302_640_520 | 🕗 1231.1969285 | 📌 HamCycle | 60.4 / 79.6 -| 🇳 610 | ⭕️ 304_131_360 | 🕗 1295.3673169 | 📌 HamCycle | -| 🇳 611 | ⭕️ 305_627_088 | 🕗 1309.5391812 | 📌 HamCycle | -| 🇳 612 | ⭕️ 307_127_712 | 🕗 1283.9041247 | 📌 HamCycle | -| 🇳 613 | ⭕️ 308_633_240 | 🕗 1316.5825417 | 📌 HamCycle | -| 🇳 614 | ⭕️ 310_143_680 | 🕗 1335.3164145 | 📌 HamCycle | 57.9 / 79.3 -| 🇳 615 | ⭕️ 311_659_040 | 🕗 1339.8711837 | 📌 HamCycle | 58.6 / 81.7 -| 🇳 616 | ⭕️ 313_179_328 | 🕗 1356.7494135 | 📌 HamCycle | -| 🇳 617 | ⭕️ 314_704_552 | 🕗 1349.0923216 | 📌 HamCycle | -| 🇳 618 | ⭕️ 316_234_720 | 🕗 1316.2991972 | 📌 HamCycle | -| 🇳 619 | ⭕️ 317_769_840 | 🕗 1339.4341435 | 📌 HamCycle | -| 🇳 620 | ⭕️ 319_309_920 | 🕗 1270.0123817 | 📌 HamCycle | -| 🇳 621 | ⭕️ 320_854_968 | 🕗 1267.0729675 | 📌 HamCycle | -| 🇳 622 | ⭕️ 322_404_992 | 🕗 1312.5234320 | 📌 HamCycle | -| 🇳 623 | ⭕️ 323_960_000 | 🕗 1315.1709561 | 📌 HamCycle | 60.5 / 83.7 -| 🇳 624 | ⭕️ 325_520_000 | 🕗 1331.8412612 | 📌 HamCycle | 60.5 / 83.7 -| 🇳 625 | ⭕️ 327_085_000 | 🕗 979.7814374 | 📌 HamCycle | -| 🇳 626 | ⭕️ 328_655_008 | 🕗 993.1074312 | 📌 HamCycle | -| 🇳 627 | ⭕️ 330_230_032 | 🕗 979.7983576 | 📌 HamCycle | -UPDATE 1: TO BE CONTINUALLY OPTIMIZED TO SOLVE UP TO: | 🇳 1000 | ⭕️ 1_337_336_000 BILLION VERTICES -UPDATE 2: ACTUALLY NOT, AS IT WOULD REQUIRE THE AMOUNT OF MEMORY LISTED BELOW TO ACCOMPLISH THE TASK.. -UPDATE 3: JOIN VERTICES + VI INTO A SINGLE STRUCTURE: AN INDEXABLE HASHMAP. LIKE AN ORDERED DICT IN PYTHON. -UPDATE 4: USING INDEXMAP RESULTS IN LONGER TIMES PROBABLY OWING TO HAVING TO ACCESS vertn[n].1 etc... vs. adj[n] - | 🇳 100 | ⭕️ 1373600 | 🕗 1.3939092 | 📌 HamCycle | -UPDATE 5: Also the possibility of using a distributed graph engine on a memory cloud: -https://www.graphengine.io/downloads/papers/Trinity.pdf -``` - -#### EACH GRAPH STRUCTURE'S SIZE REQUIREMENTS: - -| ORDER | VERTS | TOUR | VI_MAP | ADJ | TOTAL | -| ------:| ----------:| --------:|----------:| ---------:| -----------:| -| 200M | 7.6 GB | 0.8 GB | 8.4 GB | 2.4 GB | 18.2 GB | -| 250M | 11.7 GB | 1.3 GB | 14.0 GB | 3.8 GB | 31.8 GB | -| 300M | 16.7 GB | 1.8 GB | 21.0 GB | 5.9 GB | 45.4 GB | -| 350M | 22.6 GB | 2.3 GB | 30.0 GB | 8.4 GB | 63.3 GB | -| 400M | 29.4 GB | 3.1 GB | 42.0 GB | 12.0 GB | 86.5 GB | -| 450M | 37.2 GB | 3.8 GB | 58.0 GB | 16.0 GB | 115.0 GB | -| 500M | 46.0 GB | 4.6 GB | 80.0 GB | 22.0 GB | 153.6 GB | -| 550M | 55.8 GB | 5.5 GB | 108.0 GB | 29.0 GB | 198.3 GB | -| 600M | 66.6 GB | 6.6 GB | 144.0 GB | 37.0 GB | 254.6 GB | -| 650M | 78.4 GB | 7.8 GB | 188.0 GB | 46.0 GB | 320.2 GB | -| 700M | 91.2 GB | 9.1 GB | 240.0 GB | 56.0 GB | 417.3 GB | -| 750M | 105.0 GB | 10.5 GB | 302.0 GB | 67.0 GB | 484.5 GB | -| 800M | 119.8 GB | 12.0 GB | 376.0 GB | 79.0 GB | 586.8 GB | -| 850M | 135.6 GB | 13.6 GB | 462.0 GB | 92.0 GB | 703.2 GB | -| 900M | 152.4 GB | 15.2 GB | 562.0 GB | 106.0 GB | 836.6 GB | -| 950M | 170.2 GB | 17.0 GB | 678.0 GB | 121.0 GB | 1.005 TB | -| 1B | 189.0 GB | 18.9 GB | 810.0 GB | 137.0 GB | 1.154 TB | - - +| 🇳 1 | ⭕️ 8 | 🕗 0.000010179 | 📌 HamCycle | +| 🇳 2 | ⭕️ 32 | 🕗 0.000018255 | 📌 HamCycle | +| 🇳 3 | ⭕️ 80 | 🕗 0.000283618 | 📌 HamCycle | +| 🇳 4 | ⭕️ 160 | 🕗 0.000169882 | 📌 HamCycle | +| 🇳 5 | ⭕️ 280 | 🕗 0.00030587 | 📌 HamCycle | +| 🇳 6 | ⭕️ 448 | 🕗 0.000337921 | 📌 HamCycle | +| 🇳 7 | ⭕️ 672 | 🕗 0.000539654 | 📌 HamCycle | +| 🇳 8 | ⭕️ 960 | 🕗 0.00050552 | 📌 HamCycle | +| 🇳 9 | ⭕️ 1320 | 🕗 0.000522511 | 📌 HamCycle | +| 🇳 10 | ⭕️ 1760 | 🕗 0.000824325 | 📌 HamCycle | +| 🇳 11 | ⭕️ 2288 | 🕗 0.000646206 | 📌 HamCycle | +| 🇳 12 | ⭕️ 2912 | 🕗 0.000703355 | 📌 HamCycle | +| 🇳 13 | ⭕️ 3640 | 🕗 0.000800429 | 📌 HamCycle | +| 🇳 14 | ⭕️ 4480 | 🕗 0.000998104 | 📌 HamCycle | +| 🇳 15 | ⭕️ 5440 | 🕗 0.001419092 | 📌 HamCycle | +| 🇳 16 | ⭕️ 6528 | 🕗 0.001677904 | 📌 HamCycle | +| 🇳 17 | ⭕️ 7752 | 🕗 0.001635744 | 📌 HamCycle | +| 🇳 18 | ⭕️ 9120 | 🕗 0.001986249 | 📌 HamCycle | +| 🇳 19 | ⭕️ 10640 | 🕗 0.001993143 | 📌 HamCycle | +| 🇳 20 | ⭕️ 12320 | 🕗 0.00203425 | 📌 HamCycle | +| 🇳 21 | ⭕️ 14168 | 🕗 0.002479435 | 📌 HamCycle | +| 🇳 22 | ⭕️ 16192 | 🕗 0.002503029 | 📌 HamCycle | +| 🇳 23 | ⭕️ 18400 | 🕗 0.00254034 | 📌 HamCycle | +| 🇳 24 | ⭕️ 20800 | 🕗 0.002812948 | 📌 HamCycle | +| 🇳 25 | ⭕️ 23400 | 🕗 0.003037193 | 📌 HamCycle | +| 🇳 26 | ⭕️ 26208 | 🕗 0.003922813 | 📌 HamCycle | +| 🇳 27 | ⭕️ 29232 | 🕗 0.003849575 | 📌 HamCycle | +| 🇳 28 | ⭕️ 32480 | 🕗 0.004456847 | 📌 HamCycle | +| 🇳 29 | ⭕️ 35960 | 🕗 0.004726588 | 📌 HamCycle | +| 🇳 30 | ⭕️ 39680 | 🕗 0.004998615 | 📌 HamCycle | +| 🇳 31 | ⭕️ 43648 | 🕗 0.00612388 | 📌 HamCycle | +| 🇳 32 | ⭕️ 47872 | 🕗 0.006315073 | 📌 HamCycle | +| 🇳 33 | ⭕️ 52360 | 🕗 0.005878725 | 📌 HamCycle | +| 🇳 34 | ⭕️ 57120 | 🕗 0.007008919 | 📌 HamCycle | +| 🇳 35 | ⭕️ 62160 | 🕗 0.007347783 | 📌 HamCycle | +| 🇳 36 | ⭕️ 67488 | 🕗 0.007969702 | 📌 HamCycle | +| 🇳 37 | ⭕️ 73112 | 🕗 0.0095493 | 📌 HamCycle | +| 🇳 38 | ⭕️ 79040 | 🕗 0.011495343 | 📌 HamCycle | +| 🇳 39 | ⭕️ 85280 | 🕗 0.0121266 | 📌 HamCycle | +| 🇳 40 | ⭕️ 91840 | 🕗 0.013320286 | 📌 HamCycle | +| 🇳 41 | ⭕️ 98728 | 🕗 0.013511047 | 📌 HamCycle | +| 🇳 42 | ⭕️ 105952 | 🕗 0.013991549 | 📌 HamCycle | +| 🇳 43 | ⭕️ 113520 | 🕗 0.015163283 | 📌 HamCycle | +| 🇳 44 | ⭕️ 121440 | 🕗 0.01770702 | 📌 HamCycle | +| 🇳 45 | ⭕️ 129720 | 🕗 0.020936416 | 📌 HamCycle | +| 🇳 46 | ⭕️ 138368 | 🕗 0.021208504 | 📌 HamCycle | +| 🇳 47 | ⭕️ 147392 | 🕗 0.024101734 | 📌 HamCycle | +| 🇳 48 | ⭕️ 156800 | 🕗 0.022927316 | 📌 HamCycle | +| 🇳 49 | ⭕️ 166600 | 🕗 0.026293512 | 📌 HamCycle | +| 🇳 50 | ⭕️ 176800 | 🕗 0.029030116 | 📌 HamCycle | +| 🇳 51 | ⭕️ 187408 | 🕗 0.029561944 | 📌 HamCycle | +| 🇳 52 | ⭕️ 198432 | 🕗 0.029597571 | 📌 HamCycle | +| 🇳 53 | ⭕️ 209880 | 🕗 0.031674866 | 📌 HamCycle | +| 🇳 54 | ⭕️ 221760 | 🕗 0.033894274 | 📌 HamCycle | +| 🇳 55 | ⭕️ 234080 | 🕗 0.039308295 | 📌 HamCycle | +| 🇳 56 | ⭕️ 246848 | 🕗 0.040414516 | 📌 HamCycle | +| 🇳 57 | ⭕️ 260072 | 🕗 0.042420182 | 📌 HamCycle | +| 🇳 58 | ⭕️ 273760 | 🕗 0.042702727 | 📌 HamCycle | +| 🇳 59 | ⭕️ 287920 | 🕗 0.044963486 | 📌 HamCycle | +| 🇳 60 | ⭕️ 302560 | 🕗 0.05224782 | 📌 HamCycle | +| 🇳 61 | ⭕️ 317688 | 🕗 0.055054758 | 📌 HamCycle | +| 🇳 62 | ⭕️ 333312 | 🕗 0.060857207 | 📌 HamCycle | +| 🇳 63 | ⭕️ 349440 | 🕗 0.05793857 | 📌 HamCycle | +| 🇳 64 | ⭕️ 366080 | 🕗 0.06330587 | 📌 HamCycle | +| 🇳 65 | ⭕️ 383240 | 🕗 0.068265855 | 📌 HamCycle | +| 🇳 66 | ⭕️ 400928 | 🕗 0.068454966 | 📌 HamCycle | +| 🇳 67 | ⭕️ 419152 | 🕗 0.0774078 | 📌 HamCycle | +| 🇳 68 | ⭕️ 437920 | 🕗 0.08340845 | 📌 HamCycle | +| 🇳 69 | ⭕️ 457240 | 🕗 0.092542306 | 📌 HamCycle | +| 🇳 70 | ⭕️ 477120 | 🕗 0.09312241 | 📌 HamCycle | +| 🇳 71 | ⭕️ 497568 | 🕗 0.0949187 | 📌 HamCycle | +| 🇳 72 | ⭕️ 518592 | 🕗 0.10142887 | 📌 HamCycle | +| 🇳 73 | ⭕️ 540200 | 🕗 0.09735174 | 📌 HamCycle | +| 🇳 74 | ⭕️ 562400 | 🕗 0.11714704 | 📌 HamCycle | +| 🇳 75 | ⭕️ 585200 | 🕗 0.12063946 | 📌 HamCycle | +| 🇳 76 | ⭕️ 608608 | 🕗 0.11892852 | 📌 HamCycle | +| 🇳 77 | ⭕️ 632632 | 🕗 0.12712795 | 📌 HamCycle | +| 🇳 78 | ⭕️ 657280 | 🕗 0.13093683 | 📌 HamCycle | +| 🇳 79 | ⭕️ 682560 | 🕗 0.13360427 | 📌 HamCycle | +| 🇳 80 | ⭕️ 708480 | 🕗 0.13917398 | 📌 HamCycle | +| 🇳 81 | ⭕️ 735048 | 🕗 0.14792669 | 📌 HamCycle | +| 🇳 82 | ⭕️ 762272 | 🕗 0.16350742 | 📌 HamCycle | +| 🇳 83 | ⭕️ 790160 | 🕗 0.16328318 | 📌 HamCycle | +| 🇳 84 | ⭕️ 818720 | 🕗 0.16780606 | 📌 HamCycle | +| 🇳 85 | ⭕️ 847960 | 🕗 0.16695078 | 📌 HamCycle | +| 🇳 86 | ⭕️ 877888 | 🕗 0.17740835 | 📌 HamCycle | +| 🇳 87 | ⭕️ 908512 | 🕗 0.19069728 | 📌 HamCycle | +| 🇳 88 | ⭕️ 939840 | 🕗 0.18747258 | 📌 HamCycle | +| 🇳 89 | ⭕️ 971880 | 🕗 0.20597778 | 📌 HamCycle | +| 🇳 90 | ⭕️ 1004640 | 🕗 0.21213219 | 📌 HamCycle | +| 🇳 91 | ⭕️ 1038128 | 🕗 0.22415698 | 📌 HamCycle | +| 🇳 92 | ⭕️ 1072352 | 🕗 0.22618763 | 📌 HamCycle | +| 🇳 93 | ⭕️ 1107320 | 🕗 0.22506136 | 📌 HamCycle | +| 🇳 94 | ⭕️ 1143040 | 🕗 0.25826323 | 📌 HamCycle | +| 🇳 95 | ⭕️ 1179520 | 🕗 0.28059712 | 📌 HamCycle | +| 🇳 96 | ⭕️ 1216768 | 🕗 0.2955699 | 📌 HamCycle | +| 🇳 97 | ⭕️ 1254792 | 🕗 0.29338446 | 📌 HamCycle | +| 🇳 98 | ⭕️ 1293600 | 🕗 0.30179793 | 📌 HamCycle | +| 🇳 99 | ⭕️ 1333200 | 🕗 0.2997555 | 📌 HamCycle | +| 🇳 100 | ⭕️ 1373600 | 🕗 0.30730814 | 📌 HamCycle | +| 🇳 101 | ⭕️ 1414808 | 🕗 0.3379341 | 📌 HamCycle | +| 🇳 102 | ⭕️ 1456832 | 🕗 0.33156005 | 📌 HamCycle | +| 🇳 103 | ⭕️ 1499680 | 🕗 0.34553766 | 📌 HamCycle | +| 🇳 104 | ⭕️ 1543360 | 🕗 0.3442304 | 📌 HamCycle | +| 🇳 105 | ⭕️ 1587880 | 🕗 0.36213267 | 📌 HamCycle | +| 🇳 106 | ⭕️ 1633248 | 🕗 0.37605652 | 📌 HamCycle | +| 🇳 107 | ⭕️ 1679472 | 🕗 0.3725381 | 📌 HamCycle | +| 🇳 108 | ⭕️ 1726560 | 🕗 0.41962066 | 📌 HamCycle | +| 🇳 109 | ⭕️ 1774520 | 🕗 0.43811184 | 📌 HamCycle | +| 🇳 110 | ⭕️ 1823360 | 🕗 0.46622387 | 📌 HamCycle | +| 🇳 111 | ⭕️ 1873088 | 🕗 0.45527634 | 📌 HamCycle | +| 🇳 112 | ⭕️ 1923712 | 🕗 0.45899248 | 📌 HamCycle | +| 🇳 113 | ⭕️ 1975240 | 🕗 0.4656841 | 📌 HamCycle | +| 🇳 114 | ⭕️ 2027680 | 🕗 0.51470727 | 📌 HamCycle | +| 🇳 115 | ⭕️ 2081040 | 🕗 0.55015206 | 📌 HamCycle | +| 🇳 116 | ⭕️ 2135328 | 🕗 0.5460732 | 📌 HamCycle | +| 🇳 117 | ⭕️ 2190552 | 🕗 0.574392 | 📌 HamCycle | +| 🇳 118 | ⭕️ 2246720 | 🕗 0.594223 | 📌 HamCycle | +| 🇳 119 | ⭕️ 2303840 | 🕗 0.62288606 | 📌 HamCycle | +| 🇳 120 | ⭕️ 2361920 | 🕗 0.6434338 | 📌 HamCycle | +| 🇳 121 | ⭕️ 2420968 | 🕗 0.6429697 | 📌 HamCycle | +| 🇳 122 | ⭕️ 2480992 | 🕗 0.6714702 | 📌 HamCycle | +| 🇳 123 | ⭕️ 2542000 | 🕗 0.69785696 | 📌 HamCycle | +| 🇳 124 | ⭕️ 2604000 | 🕗 0.70497197 | 📌 HamCycle | +| 🇳 125 | ⭕️ 2667000 | 🕗 0.727654 | 📌 HamCycle | +| 🇳 126 | ⭕️ 2731008 | 🕗 0.73778033 | 📌 HamCycle | +| 🇳 127 | ⭕️ 2796032 | 🕗 0.7767268 | 📌 HamCycle | +| 🇳 128 | ⭕️ 2862080 | 🕗 0.78686845 | 📌 HamCycle | +| 🇳 129 | ⭕️ 2929160 | 🕗 0.8504334 | 📌 HamCycle | +| 🇳 130 | ⭕️ 2997280 | 🕗 0.87121445 | 📌 HamCycle | +| 🇳 131 | ⭕️ 3066448 | 🕗 0.8745579 | 📌 HamCycle | +| 🇳 132 | ⭕️ 3136672 | 🕗 0.8868567 | 📌 HamCycle | +| 🇳 133 | ⭕️ 3207960 | 🕗 0.94231975 | 📌 HamCycle | +| 🇳 134 | ⭕️ 3280320 | 🕗 0.9914202 | 📌 HamCycle | +| 🇳 135 | ⭕️ 3353760 | 🕗 1.0388473 | 📌 HamCycle | +| 🇳 136 | ⭕️ 3428288 | 🕗 1.0109073 | 📌 HamCycle | +| 🇳 137 | ⭕️ 3503912 | 🕗 1.0276672 | 📌 HamCycle | +| 🇳 138 | ⭕️ 3580640 | 🕗 1.1127745 | 📌 HamCycle | +| 🇳 139 | ⭕️ 3658480 | 🕗 1.1656529 | 📌 HamCycle | +| 🇳 140 | ⭕️ 3737440 | 🕗 1.1707357 | 📌 HamCycle | +| 🇳 141 | ⭕️ 3817528 | 🕗 1.1739498 | 📌 HamCycle | +| 🇳 142 | ⭕️ 3898752 | 🕗 1.1887686 | 📌 HamCycle | +| 🇳 143 | ⭕️ 3981120 | 🕗 1.244189 | 📌 HamCycle | +| 🇳 144 | ⭕️ 4064640 | 🕗 1.2615665 | 📌 HamCycle | +| 🇳 145 | ⭕️ 4149320 | 🕗 1.345032 | 📌 HamCycle | +| 🇳 146 | ⭕️ 4235168 | 🕗 1.3407199 | 📌 HamCycle | +| 🇳 147 | ⭕️ 4322192 | 🕗 1.3436819 | 📌 HamCycle | +| 🇳 148 | ⭕️ 4410400 | 🕗 1.4318922 | 📌 HamCycle | +| 🇳 149 | ⭕️ 4499800 | 🕗 1.4623578 | 📌 HamCycle | +| 🇳 150 | ⭕️ 4590400 | 🕗 1.532712 | 📌 HamCycle | +| 🇳 151 | ⭕️ 4682208 | 🕗 1.5433009 | 📌 HamCycle | +| 🇳 152 | ⭕️ 4775232 | 🕗 1.5713217 | 📌 HamCycle | +| 🇳 153 | ⭕️ 4869480 | 🕗 1.6167154 | 📌 HamCycle | +| 🇳 154 | ⭕️ 4964960 | 🕗 1.6924952 | 📌 HamCycle | +| 🇳 155 | ⭕️ 5061680 | 🕗 1.8206146 | 📌 HamCycle | +| 🇳 156 | ⭕️ 5159648 | 🕗 1.8619893 | 📌 HamCycle | +| 🇳 157 | ⭕️ 5258872 | 🕗 1.8311862 | 📌 HamCycle | +| 🇳 158 | ⭕️ 5359360 | 🕗 1.9049762 | 📌 HamCycle | +| 🇳 159 | ⭕️ 5461120 | 🕗 1.7879434 | 📌 HamCycle | +| 🇳 160 | ⭕️ 5564160 | 🕗 1.9257221 | 📌 HamCycle | +| 🇳 161 | ⭕️ 5668488 | 🕗 2.0300062 | 📌 HamCycle | +| 🇳 162 | ⭕️ 5774112 | 🕗 2.0281081 | 📌 HamCycle | +| 🇳 163 | ⭕️ 5881040 | 🕗 2.1137042 | 📌 HamCycle | +| 🇳 164 | ⭕️ 5989280 | 🕗 2.1011171 | 📌 HamCycle | +| 🇳 165 | ⭕️ 6098840 | 🕗 2.2316356 | 📌 HamCycle | +| 🇳 166 | ⭕️ 6209728 | 🕗 2.2139678 | 📌 HamCycle | +| 🇳 167 | ⭕️ 6321952 | 🕗 2.2026684 | 📌 HamCycle | +| 🇳 168 | ⭕️ 6435520 | 🕗 2.2135189 | 📌 HamCycle | +| 🇳 169 | ⭕️ 6550440 | 🕗 2.470571 | 📌 HamCycle | +| 🇳 170 | ⭕️ 6666720 | 🕗 2.48348 | 📌 HamCycle | +| 🇳 171 | ⭕️ 6784368 | 🕗 2.5992546 | 📌 HamCycle | +| 🇳 172 | ⭕️ 6903392 | 🕗 2.559159 | 📌 HamCycle | +| 🇳 173 | ⭕️ 7023800 | 🕗 2.6966982 | 📌 HamCycle | +| 🇳 174 | ⭕️ 7145600 | 🕗 2.7312272 | 📌 HamCycle | +| 🇳 175 | ⭕️ 7268800 | 🕗 2.8405538 | 📌 HamCycle | +| 🇳 176 | ⭕️ 7393408 | 🕗 2.8336015 | 📌 HamCycle | +| 🇳 177 | ⭕️ 7519432 | 🕗 2.9871907 | 📌 HamCycle | +| 🇳 178 | ⭕️ 7646880 | 🕗 3.0249138 | 📌 HamCycle | +| 🇳 179 | ⭕️ 7775760 | 🕗 3.1628473 | 📌 HamCycle | +| 🇳 180 | ⭕️ 7906080 | 🕗 3.1857908 | 📌 HamCycle | +| 🇳 181 | ⭕️ 8037848 | 🕗 3.2282696 | 📌 HamCycle | +| 🇳 182 | ⭕️ 8171072 | 🕗 3.274109 | 📌 HamCycle | +| 🇳 183 | ⭕️ 8305760 | 🕗 3.3035817 | 📌 HamCycle | +| 🇳 184 | ⭕️ 8441920 | 🕗 3.289866 | 📌 HamCycle | +| 🇳 185 | ⭕️ 8579560 | 🕗 3.4607885 | 📌 HamCycle | +| 🇳 186 | ⭕️ 8718688 | 🕗 3.6351204 | 📌 HamCycle | +| 🇳 187 | ⭕️ 8859312 | 🕗 3.670026 | 📌 HamCycle | +| 🇳 188 | ⭕️ 9001440 | 🕗 3.7371466 | 📌 HamCycle | +| 🇳 189 | ⭕️ 9145080 | 🕗 3.751327 | 📌 HamCycle | +| 🇳 190 | ⭕️ 9290240 | 🕗 3.754137 | 📌 HamCycle | +| 🇳 191 | ⭕️ 9436928 | 🕗 3.969777 | 📌 HamCycle | +| 🇳 192 | ⭕️ 9585152 | 🕗 3.9433873 | 📌 HamCycle | +| 🇳 193 | ⭕️ 9734920 | 🕗 4.0607295 | 📌 HamCycle | +| 🇳 194 | ⭕️ 9886240 | 🕗 4.1339374 | 📌 HamCycle | +| 🇳 195 | ⭕️ 10039120 | 🕗 4.246082 | 📌 HamCycle | +| 🇳 196 | ⭕️ 10193568 | 🕗 4.1792674 | 📌 HamCycle | +| 🇳 197 | ⭕️ 10349592 | 🕗 4.533998 | 📌 HamCycle | +| 🇳 198 | ⭕️ 10507200 | 🕗 4.5180454 | 📌 HamCycle | +| 🇳 199 | ⭕️ 10666400 | 🕗 4.54856 | 📌 HamCycle | +| 🇳 200 | ⭕️ 10827200 | 🕗 4.7725883 | 📌 HamCycle | +| 🇳 201 | ⭕️ 10989608 | 🕗 4.744052 | 📌 HamCycle | +| 🇳 202 | ⭕️ 11153632 | 🕗 4.8175836 | 📌 HamCycle | +| 🇳 203 | ⭕️ 11319280 | 🕗 5.069594 | 📌 HamCycle | +| 🇳 204 | ⭕️ 11486560 | 🕗 5.1115675 | 📌 HamCycle | +| 🇳 205 | ⭕️ 11655480 | 🕗 5.2389784 | 📌 HamCycle | +| 🇳 206 | ⭕️ 11826048 | 🕗 5.1980133 | 📌 HamCycle | +| 🇳 207 | ⭕️ 11998272 | 🕗 5.5012507 | 📌 HamCycle | +| 🇳 208 | ⭕️ 12172160 | 🕗 5.5820823 | 📌 HamCycle | +| 🇳 209 | ⭕️ 12347720 | 🕗 5.5717516 | 📌 HamCycle | +| 🇳 210 | ⭕️ 12524960 | 🕗 5.9001365 | 📌 HamCycle | +| 🇳 211 | ⭕️ 12703888 | 🕗 5.900571 | 📌 HamCycle | +| 🇳 212 | ⭕️ 12884512 | 🕗 5.9751453 | 📌 HamCycle | +| 🇳 213 | ⭕️ 13066840 | 🕗 5.9047737 | 📌 HamCycle | +| 🇳 214 | ⭕️ 13250880 | 🕗 6.0134053 | 📌 HamCycle | +| 🇳 215 | ⭕️ 13436640 | 🕗 6.187554 | 📌 HamCycle | +| 🇳 216 | ⭕️ 13624128 | 🕗 6.2958107 | 📌 HamCycle | +| 🇳 217 | ⭕️ 13813352 | 🕗 6.564789 | 📌 HamCycle | +| 🇳 218 | ⭕️ 14004320 | 🕗 6.830187 | 📌 HamCycle | +| 🇳 219 | ⭕️ 14197040 | 🕗 6.839751 | 📌 HamCycle | +| 🇳 220 | ⭕️ 14391520 | 🕗 7.0278063 | 📌 HamCycle | +| 🇳 221 | ⭕️ 14587768 | 🕗 6.978607 | 📌 HamCycle | +| 🇳 222 | ⭕️ 14785792 | 🕗 6.8333755 | 📌 HamCycle | +| 🇳 223 | ⭕️ 14985600 | 🕗 7.375588 | 📌 HamCycle | +| 🇳 224 | ⭕️ 15187200 | 🕗 7.6024384 | 📌 HamCycle | +| 🇳 225 | ⭕️ 15390600 | 🕗 7.7625895 | 📌 HamCycle | +| 🇳 226 | ⭕️ 15595808 | 🕗 7.8449244 | 📌 HamCycle | +| 🇳 227 | ⭕️ 15802832 | 🕗 7.8937597 | 📌 HamCycle | +| 🇳 228 | ⭕️ 16011680 | 🕗 7.793078 | 📌 HamCycle | +| 🇳 229 | ⭕️ 16222360 | 🕗 8.249264 | 📌 HamCycle | +| 🇳 230 | ⭕️ 16434880 | 🕗 8.309665 | 📌 HamCycle | +| 🇳 231 | ⭕️ 16649248 | 🕗 8.509145 | 📌 HamCycle | +| 🇳 232 | ⭕️ 16865472 | 🕗 8.494013 | 📌 HamCycle | +| 🇳 233 | ⭕️ 17083560 | 🕗 8.75697 | 📌 HamCycle | +| 🇳 234 | ⭕️ 17303520 | 🕗 8.867424 | 📌 HamCycle | +| 🇳 235 | ⭕️ 17525360 | 🕗 8.971322 | 📌 HamCycle | +| 🇳 236 | ⭕️ 17749088 | 🕗 9.290791 | 📌 HamCycle | +| 🇳 237 | ⭕️ 17974712 | 🕗 9.681785 | 📌 HamCycle | +| 🇳 238 | ⭕️ 18202240 | 🕗 9.567891 | 📌 HamCycle | +| 🇳 239 | ⭕️ 18431680 | 🕗 9.648733 | 📌 HamCycle | +| 🇳 240 | ⭕️ 18663040 | 🕗 9.743435 | 📌 HamCycle | +| 🇳 241 | ⭕️ 18896328 | 🕗 10.138957 | 📌 HamCycle | +| 🇳 242 | ⭕️ 19131552 | 🕗 10.1319895 | 📌 HamCycle | +| 🇳 243 | ⭕️ 19368720 | 🕗 10.484348 | 📌 HamCycle | +| 🇳 244 | ⭕️ 19607840 | 🕗 10.392075 | 📌 HamCycle | +| 🇳 245 | ⭕️ 19848920 | 🕗 10.452226 | 📌 HamCycle | +| 🇳 246 | ⭕️ 20091968 | 🕗 10.9395485 | 📌 HamCycle | +| 🇳 247 | ⭕️ 20336992 | 🕗 11.00781 | 📌 HamCycle | +| 🇳 248 | ⭕️ 20584000 | 🕗 11.238273 | 📌 HamCycle | +| 🇳 249 | ⭕️ 20833000 | 🕗 11.500829 | 📌 HamCycle | +| 🇳 250 | ⭕️ 21084000 | 🕗 11.707056 | 📌 HamCycle | +| 🇳 251 | ⭕️ 21337008 | 🕗 11.882931 | 📌 HamCycle | +| 🇳 252 | ⭕️ 21592032 | 🕗 12.065309 | 📌 HamCycle | +| 🇳 253 | ⭕️ 21849080 | 🕗 12.268994 | 📌 HamCycle | +| 🇳 254 | ⭕️ 22108160 | 🕗 12.600367 | 📌 HamCycle | +| 🇳 255 | ⭕️ 22369280 | 🕗 13.023065 | 📌 HamCycle | +| 🇳 256 | ⭕️ 22632448 | 🕗 12.539975 | 📌 HamCycle | +| 🇳 257 | ⭕️ 22897672 | 🕗 12.856799 | 📌 HamCycle | +| 🇳 258 | ⭕️ 23164960 | 🕗 12.903861 | 📌 HamCycle | +| 🇳 259 | ⭕️ 23434320 | 🕗 13.518628 | 📌 HamCycle | +| 🇳 260 | ⭕️ 23705760 | 🕗 13.740718 | 📌 HamCycle | +| 🇳 261 | ⭕️ 23979288 | 🕗 13.776897 | 📌 HamCycle | +| 🇳 262 | ⭕️ 24254912 | 🕗 13.713969 | 📌 HamCycle | +| 🇳 263 | ⭕️ 24532640 | 🕗 14.200993 | 📌 HamCycle | +| 🇳 264 | ⭕️ 24812480 | 🕗 14.683668 | 📌 HamCycle | +| 🇳 265 | ⭕️ 25094440 | 🕗 14.797649 | 📌 HamCycle | +| 🇳 266 | ⭕️ 25378528 | 🕗 14.8939 | 📌 HamCycle | +| 🇳 267 | ⭕️ 25664752 | 🕗 15.082576 | 📌 HamCycle | +| 🇳 268 | ⭕️ 25953120 | 🕗 15.450015 | 📌 HamCycle | +| 🇳 269 | ⭕️ 26243640 | 🕗 15.281745 | 📌 HamCycle | +| 🇳 270 | ⭕️ 26536320 | 🕗 16.039795 | 📌 HamCycle | +| 🇳 271 | ⭕️ 26831168 | 🕗 16.043816 | 📌 HamCycle | +| 🇳 272 | ⭕️ 27128192 | 🕗 16.194965 | 📌 HamCycle | +| 🇳 273 | ⭕️ 27427400 | 🕗 16.245487 | 📌 HamCycle | +| 🇳 274 | ⭕️ 27728800 | 🕗 16.96553 | 📌 HamCycle | +| 🇳 275 | ⭕️ 28032400 | 🕗 16.721748 | 📌 HamCycle | +| 🇳 276 | ⭕️ 28338208 | 🕗 17.652445 | 📌 HamCycle | +| 🇳 277 | ⭕️ 28646232 | 🕗 17.599913 | 📌 HamCycle | +| 🇳 278 | ⭕️ 28956480 | 🕗 17.16386 | 📌 HamCycle | +| 🇳 279 | ⭕️ 29268960 | 🕗 17.591763 | 📌 HamCycle | +| 🇳 280 | ⭕️ 29583680 | 🕗 17.99549 | 📌 HamCycle | +| 🇳 281 | ⭕️ 29900648 | 🕗 18.62527 | 📌 HamCycle | +| 🇳 282 | ⭕️ 30219872 | 🕗 18.930893 | 📌 HamCycle | +| 🇳 283 | ⭕️ 30541360 | 🕗 19.07169 | 📌 HamCycle | +| 🇳 284 | ⭕️ 30865120 | 🕗 19.62686 | 📌 HamCycle | +| 🇳 285 | ⭕️ 31191160 | 🕗 19.488274 | 📌 HamCycle | +| 🇳 286 | ⭕️ 31519488 | 🕗 19.766228 | 📌 HamCycle | +| 🇳 287 | ⭕️ 31850112 | 🕗 20.576672 | 📌 HamCycle | +| 🇳 288 | ⭕️ 32183040 | 🕗 20.503284 | 📌 HamCycle | +| 🇳 289 | ⭕️ 32518280 | 🕗 20.625124 | 📌 HamCycle | +| 🇳 290 | ⭕️ 32855840 | 🕗 20.646198 | 📌 HamCycle | +| 🇳 291 | ⭕️ 33195728 | 🕗 21.04433 | 📌 HamCycle | +| 🇳 292 | ⭕️ 33537952 | 🕗 21.503906 | 📌 HamCycle | +| 🇳 293 | ⭕️ 33882520 | 🕗 22.053566 | 📌 HamCycle | +| 🇳 294 | ⭕️ 34229440 | 🕗 22.439325 | 📌 HamCycle | +| 🇳 295 | ⭕️ 34578720 | 🕗 22.41768 | 📌 HamCycle | +| 🇳 296 | ⭕️ 34930368 | 🕗 22.739496 | 📌 HamCycle | +| 🇳 297 | ⭕️ 35284392 | 🕗 23.121439 | 📌 HamCycle | +| 🇳 298 | ⭕️ 35640800 | 🕗 23.281982 | 📌 HamCycle | +| 🇳 299 | ⭕️ 35999600 | 🕗 23.352985 | 📌 HamCycle | +| 🇳 300 | ⭕️ 36360800 | 🕗 23.841917 | 📌 HamCycle | +| 🇳 301 | ⭕️ 36724408 | 🕗 24.645237 | 📌 HamCycle | +| 🇳 302 | ⭕️ 37090432 | 🕗 24.904644 | 📌 HamCycle | +| 🇳 303 | ⭕️ 37458880 | 🕗 25.39366 | 📌 HamCycle | +| 🇳 304 | ⭕️ 37829760 | 🕗 25.662151 | 📌 HamCycle | +| 🇳 305 | ⭕️ 38203080 | 🕗 25.057665 | 📌 HamCycle | +| 🇳 306 | ⭕️ 38578848 | 🕗 26.07478 | 📌 HamCycle | +| 🇳 307 | ⭕️ 38957072 | 🕗 26.506424 | 📌 HamCycle | +| 🇳 308 | ⭕️ 39337760 | 🕗 26.259256 | 📌 HamCycle | +| 🇳 309 | ⭕️ 39720920 | 🕗 26.389694 | 📌 HamCycle | +| 🇳 310 | ⭕️ 40106560 | 🕗 27.441545 | 📌 HamCycle | +| 🇳 311 | ⭕️ 40494688 | 🕗 27.387396 | 📌 HamCycle | +| 🇳 312 | ⭕️ 40885312 | 🕗 27.987255 | 📌 HamCycle | +| 🇳 313 | ⭕️ 41278440 | 🕗 28.453253 | 📌 HamCycle | +| 🇳 314 | ⭕️ 41674080 | 🕗 29.216234 | 📌 HamCycle | +| 🇳 315 | ⭕️ 42072240 | 🕗 29.522484 | 📌 HamCycle | +| 🇳 316 | ⭕️ 42472928 | 🕗 28.996168 | 📌 HamCycle | +| 🇳 317 | ⭕️ 42876152 | 🕗 29.831917 | 📌 HamCycle | +| 🇳 318 | ⭕️ 43281920 | 🕗 30.16647 | 📌 HamCycle | +| 🇳 319 | ⭕️ 43690240 | 🕗 30.45604 | 📌 HamCycle | +| 🇳 320 | ⭕️ 44101120 | 🕗 30.526943 | 📌 HamCycle | +| 🇳 321 | ⭕️ 44514568 | 🕗 30.816227 | 📌 HamCycle | +| 🇳 322 | ⭕️ 44930592 | 🕗 31.59338 | 📌 HamCycle | +| 🇳 323 | ⭕️ 45349200 | 🕗 31.284748 | 📌 HamCycle | +| 🇳 324 | ⭕️ 45770400 | 🕗 31.70785 | 📌 HamCycle | +| 🇳 325 | ⭕️ 46194200 | 🕗 32.263046 | 📌 HamCycle | +| 🇳 326 | ⭕️ 46620608 | 🕗 32.52913 | 📌 HamCycle | +| 🇳 327 | ⭕️ 47049632 | 🕗 32.404526 | 📌 HamCycle | +| 🇳 328 | ⭕️ 47481280 | 🕗 33.372356 | 📌 HamCycle | +| 🇳 329 | ⭕️ 47915560 | 🕗 34.107605 | 📌 HamCycle | +| 🇳 330 | ⭕️ 48352480 | 🕗 34.84545 | 📌 HamCycle | +| 🇳 331 | ⭕️ 48792048 | 🕗 35.395466 | 📌 HamCycle | +| 🇳 332 | ⭕️ 49234272 | 🕗 35.663296 | 📌 HamCycle | +| 🇳 333 | ⭕️ 49679160 | 🕗 36.161873 | 📌 HamCycle | +| 🇳 334 | ⭕️ 50126720 | 🕗 36.76804 | 📌 HamCycle | +| 🇳 335 | ⭕️ 50576960 | 🕗 36.066734 | 📌 HamCycle | +| 🇳 336 | ⭕️ 51029888 | 🕗 37.578373 | 📌 HamCycle | +| 🇳 337 | ⭕️ 51485512 | 🕗 38.459877 | 📌 HamCycle | +| 🇳 338 | ⭕️ 51943840 | 🕗 39.110756 | 📌 HamCycle | +| 🇳 339 | ⭕️ 52404880 | 🕗 38.875164 | 📌 HamCycle | +| 🇳 340 | ⭕️ 52868640 | 🕗 40.10053 | 📌 HamCycle | +| 🇳 341 | ⭕️ 53335128 | 🕗 40.63095 | 📌 HamCycle | +| 🇳 342 | ⭕️ 53804352 | 🕗 39.809475 | 📌 HamCycle | +| 🇳 343 | ⭕️ 54276320 | 🕗 39.508545 | 📌 HamCycle | +| 🇳 344 | ⭕️ 54751040 | 🕗 39.940525 | 📌 HamCycle | +| 🇳 345 | ⭕️ 55228520 | 🕗 39.897953 | 📌 HamCycle | +| 🇳 346 | ⭕️ 55708768 | 🕗 41.114925 | 📌 HamCycle | +| 🇳 347 | ⭕️ 56191792 | 🕗 41.493896 | 📌 HamCycle | +| 🇳 348 | ⭕️ 56677600 | 🕗 42.601185 | 📌 HamCycle | +| 🇳 349 | ⭕️ 57166200 | 🕗 43.24077 | 📌 HamCycle | +| 🇳 350 | ⭕️ 57657600 | 🕗 43.642044 | 📌 HamCycle | +| 🇳 351 | ⭕️ 58151808 | 🕗 44.835945 | 📌 HamCycle | +| 🇳 352 | ⭕️ 58648832 | 🕗 45.415348 | 📌 HamCycle | +| 🇳 353 | ⭕️ 59148680 | 🕗 45.44666 | 📌 HamCycle | +| 🇳 354 | ⭕️ 59651360 | 🕗 45.434925 | 📌 HamCycle | +| 🇳 355 | ⭕️ 60156880 | 🕗 46.062496 | 📌 HamCycle | +| 🇳 356 | ⭕️ 60665248 | 🕗 45.778976 | 📌 HamCycle | +| 🇳 357 | ⭕️ 61176472 | 🕗 46.42256 | 📌 HamCycle | +| 🇳 358 | ⭕️ 61690560 | 🕗 47.201904 | 📌 HamCycle | +| 🇳 359 | ⭕️ 62207520 | 🕗 47.154476 | 📌 HamCycle | +| 🇳 360 | ⭕️ 62727360 | 🕗 48.350563 | 📌 HamCycle | +| 🇳 361 | ⭕️ 63250088 | 🕗 48.382736 | 📌 HamCycle | +| 🇳 362 | ⭕️ 63775712 | 🕗 48.81067 | 📌 HamCycle | +| 🇳 363 | ⭕️ 64304240 | 🕗 50.387054 | 📌 HamCycle | +| 🇳 364 | ⭕️ 64835680 | 🕗 50.89312 | 📌 HamCycle | +| 🇳 365 | ⭕️ 65370040 | 🕗 49.637207 | 📌 HamCycle | +| 🇳 366 | ⭕️ 65907328 | 🕗 52.48187 | 📌 HamCycle | +| 🇳 367 | ⭕️ 66447552 | 🕗 53.13073 | 📌 HamCycle | +| 🇳 368 | ⭕️ 66990720 | 🕗 53.57245 | 📌 HamCycle | +| 🇳 369 | ⭕️ 67536840 | 🕗 53.268658 | 📌 HamCycle | +| 🇳 370 | ⭕️ 68085920 | 🕗 53.900703 | 📌 HamCycle | +| 🇳 371 | ⭕️ 68637968 | 🕗 54.43866 | 📌 HamCycle | +| 🇳 372 | ⭕️ 69192992 | 🕗 55.986305 | 📌 HamCycle | +| 🇳 373 | ⭕️ 69751000 | 🕗 57.808537 | 📌 HamCycle | +| 🇳 374 | ⭕️ 70312000 | 🕗 57.59592 | 📌 HamCycle | +| 🇳 375 | ⭕️ 70876000 | 🕗 59.186256 | 📌 HamCycle | +| 🇳 376 | ⭕️ 71443008 | 🕗 57.487732 | 📌 HamCycle | +| 🇳 377 | ⭕️ 72013032 | 🕗 58.56393 | 📌 HamCycle | +| 🇳 378 | ⭕️ 72586080 | 🕗 59.90338 | 📌 HamCycle | +| 🇳 379 | ⭕️ 73162160 | 🕗 59.618282 | 📌 HamCycle | +| 🇳 380 | ⭕️ 73741280 | 🕗 61.561054 | 📌 HamCycle | +| 🇳 381 | ⭕️ 74323448 | 🕗 62.34235 | 📌 HamCycle | +| 🇳 382 | ⭕️ 74908672 | 🕗 61.765938 | 📌 HamCycle | +| 🇳 383 | ⭕️ 75496960 | 🕗 63.28424 | 📌 HamCycle | +| 🇳 384 | ⭕️ 76088320 | 🕗 65.77523 | 📌 HamCycle | +| 🇳 385 | ⭕️ 76682760 | 🕗 63.904064 | 📌 HamCycle | +| 🇳 386 | ⭕️ 77280288 | 🕗 65.5235 | 📌 HamCycle | +| 🇳 387 | ⭕️ 77880912 | 🕗 66.06956 | 📌 HamCycle | +| 🇳 388 | ⭕️ 78484640 | 🕗 67.24588 | 📌 HamCycle | +| 🇳 389 | ⭕️ 79091480 | 🕗 67.13541 | 📌 HamCycle | +| 🇳 390 | ⭕️ 79701440 | 🕗 67.31185 | 📌 HamCycle | +| 🇳 391 | ⭕️ 80314528 | 🕗 69.93612 | 📌 HamCycle | +| 🇳 392 | ⭕️ 80930752 | 🕗 69.34476 | 📌 HamCycle | +| 🇳 393 | ⭕️ 81550120 | 🕗 66.944214 | 📌 HamCycle | +| 🇳 394 | ⭕️ 82172640 | 🕗 70.18568 | 📌 HamCycle | +| 🇳 395 | ⭕️ 82798320 | 🕗 71.68339 | 📌 HamCycle | +| 🇳 396 | ⭕️ 83427168 | 🕗 73.2425 | 📌 HamCycle | +| 🇳 397 | ⭕️ 84059192 | 🕗 69.610176 | 📌 HamCycle | +| 🇳 398 | ⭕️ 84694400 | 🕗 69.98635 | 📌 HamCycle | +| 🇳 399 | ⭕️ 85332800 | 🕗 72.2449 | 📌 HamCycle | +| 🇳 400 | ⭕️ 85974400 | 🕗 72.69409 | 📌 HamCycle | +| 🇳 401 | ⭕️ 86619208 | 🕗 73.67308 | 📌 HamCycle | +| 🇳 402 | ⭕️ 87267232 | 🕗 75.235016 | 📌 HamCycle | +| 🇳 403 | ⭕️ 87918480 | 🕗 76.24521 | 📌 HamCycle | +| 🇳 404 | ⭕️ 88572960 | 🕗 77.71079 | 📌 HamCycle | +| 🇳 405 | ⭕️ 89230680 | 🕗 78.52725 | 📌 HamCycle | +| 🇳 406 | ⭕️ 89891648 | 🕗 79.81142 | 📌 HamCycle | +| 🇳 407 | ⭕️ 90555872 | 🕗 82.14709 | 📌 HamCycle | +| 🇳 408 | ⭕️ 91223360 | 🕗 82.63461 | 📌 HamCycle | +| 🇳 409 | ⭕️ 91894120 | 🕗 82.46349 | 📌 HamCycle | +| 🇳 410 | ⭕️ 92568160 | 🕗 83.456215 | 📌 HamCycle | +| 🇳 411 | ⭕️ 93245488 | 🕗 82.33432 | 📌 HamCycle | +| 🇳 412 | ⭕️ 93926112 | 🕗 83.184074 | 📌 HamCycle | +| 🇳 413 | ⭕️ 94610040 | 🕗 85.904785 | 📌 HamCycle | +| 🇳 414 | ⭕️ 95297280 | 🕗 86.697586 | 📌 HamCycle | +| 🇳 415 | ⭕️ 95987840 | 🕗 88.355484 | 📌 HamCycle | +| 🇳 416 | ⭕️ 96681728 | 🕗 88.92096 | 📌 HamCycle | +| 🇳 417 | ⭕️ 97378952 | 🕗 89.290726 | 📌 HamCycle | +| 🇳 418 | ⭕️ 98079520 | 🕗 86.5633 | 📌 HamCycle | +| 🇳 419 | ⭕️ 98783440 | 🕗 87.03865 | 📌 HamCycle | +| 🇳 420 | ⭕️ 99490720 | 🕗 88.45821 | 📌 HamCycle | +| 🇳 421 | ⭕️ 100201368 | 🕗 88.91534 | 📌 HamCycle | +| 🇳 422 | ⭕️ 100915392 | 🕗 91.44149 | 📌 HamCycle | +| 🇳 423 | ⭕️ 101632800 | 🕗 91.99331 | 📌 HamCycle | +| 🇳 424 | ⭕️ 102353600 | 🕗 96.852745 | 📌 HamCycle | +| 🇳 425 | ⭕️ 103077800 | 🕗 96.564285 | 📌 HamCycle | +| 🇳 426 | ⭕️ 103805408 | 🕗 97.98374 | 📌 HamCycle | +| 🇳 427 | ⭕️ 104536432 | 🕗 98.195946 | 📌 HamCycle | +| 🇳 428 | ⭕️ 105270880 | 🕗 99.992256 | 📌 HamCycle | +| 🇳 429 | ⭕️ 106008760 | 🕗 99.60366 | 📌 HamCycle | +| 🇳 430 | ⭕️ 106750080 | 🕗 100.23609 | 📌 HamCycle | +| 🇳 431 | ⭕️ 107494848 | 🕗 100.65152 | 📌 HamCycle | +| 🇳 432 | ⭕️ 108243072 | 🕗 101.4156 | 📌 HamCycle | +| 🇳 433 | ⭕️ 108994760 | 🕗 102.30669 | 📌 HamCycle | +| 🇳 434 | ⭕️ 109749920 | 🕗 104.34835 | 📌 HamCycle | +| 🇳 435 | ⭕️ 110508560 | 🕗 103.87709 | 📌 HamCycle | +| 🇳 436 | ⭕️ 111270688 | 🕗 104.1264 | 📌 HamCycle | +| 🇳 437 | ⭕️ 112036312 | 🕗 108.08919 | 📌 HamCycle | +| 🇳 438 | ⭕️ 112805440 | 🕗 110.04934 | 📌 HamCycle | +| 🇳 439 | ⭕️ 113578080 | 🕗 107.81756 | 📌 HamCycle | +| 🇳 440 | ⭕️ 114354240 | 🕗 111.04135 | 📌 HamCycle | +| 🇳 441 | ⭕️ 115133928 | 🕗 111.01937 | 📌 HamCycle | +| 🇳 442 | ⭕️ 115917152 | 🕗 108.93663 | 📌 HamCycle | +| 🇳 443 | ⭕️ 116703920 | 🕗 108.352585 | 📌 HamCycle | +| 🇳 444 | ⭕️ 117494240 | 🕗 113.87007 | 📌 HamCycle | +| 🇳 445 | ⭕️ 118288120 | 🕗 111.6864 | 📌 HamCycle | +| 🇳 446 | ⭕️ 119085568 | 🕗 112.866356 | 📌 HamCycle | +| 🇳 447 | ⭕️ 119886592 | 🕗 116.7792 | 📌 HamCycle | +| 🇳 448 | ⭕️ 120691200 | 🕗 116.68915 | 📌 HamCycle | +| 🇳 449 | ⭕️ 121499400 | 🕗 121.75872 | 📌 HamCycle | +| 🇳 450 | ⭕️ 122311200 | 🕗 121.23746 | 📌 HamCycle | +| 🇳 451 | ⭕️ 123126608 | 🕗 119.86232 | 📌 HamCycle | +| 🇳 452 | ⭕️ 123945632 | 🕗 118.491196 | 📌 HamCycle | +| 🇳 453 | ⭕️ 124768280 | 🕗 122.51934 | 📌 HamCycle | +| 🇳 454 | ⭕️ 125594560 | 🕗 126.35431 | 📌 HamCycle | +| 🇳 455 | ⭕️ 126424480 | 🕗 127.552765 | 📌 HamCycle | +| 🇳 456 | ⭕️ 127258048 | 🕗 126.52483 | 📌 HamCycle | +| 🇳 457 | ⭕️ 128095272 | 🕗 126.70669 | 📌 HamCycle | +| 🇳 458 | ⭕️ 128936160 | 🕗 130.86943 | 📌 HamCycle | +| 🇳 459 | ⭕️ 129780720 | 🕗 130.93456 | 📌 HamCycle | +| 🇳 460 | ⭕️ 130628960 | 🕗 128.67935 | 📌 HamCycle | +| 🇳 461 | ⭕️ 131480888 | 🕗 130.18933 | 📌 HamCycle | +| 🇳 462 | ⭕️ 132336512 | 🕗 133.83102 | 📌 HamCycle | +| 🇳 463 | ⭕️ 133195840 | 🕗 132.44917 | 📌 HamCycle | +| 🇳 464 | ⭕️ 134058880 | 🕗 134.41577 | 📌 HamCycle | +| 🇳 465 | ⭕️ 134925640 | 🕗 139.4746 | 📌 HamCycle | +| 🇳 466 | ⭕️ 135796128 | 🕗 138.30745 | 📌 HamCycle | +| 🇳 467 | ⭕️ 136670352 | 🕗 139.70428 | 📌 HamCycle | +| 🇳 468 | ⭕️ 137548320 | 🕗 139.86159 | 📌 HamCycle | +| 🇳 469 | ⭕️ 138430040 | 🕗 140.14618 | 📌 HamCycle | +| 🇳 470 | ⭕️ 139315520 | 🕗 145.3653 | 📌 HamCycle | +| 🇳 471 | ⭕️ 140204768 | 🕗 145.83453 | 📌 HamCycle | +| 🇳 472 | ⭕️ 141097792 | 🕗 146.75485 | 📌 HamCycle | +| 🇳 473 | ⭕️ 141994600 | 🕗 145.8939 | 📌 HamCycle | +| 🇳 474 | ⭕️ 142895200 | 🕗 149.23375 | 📌 HamCycle | +| 🇳 475 | ⭕️ 143799600 | 🕗 149.4453 | 📌 HamCycle | +| 🇳 476 | ⭕️ 144707808 | 🕗 147.1118 | 📌 HamCycle | +| 🇳 477 | ⭕️ 145619832 | 🕗 149.76862 | 📌 HamCycle | +| 🇳 478 | ⭕️ 146535680 | 🕗 150.46954 | 📌 HamCycle | +| 🇳 479 | ⭕️ 147455360 | 🕗 154.46826 | 📌 HamCycle | +| 🇳 480 | ⭕️ 148378880 | 🕗 157.70502 | 📌 HamCycle | +| 🇳 481 | ⭕️ 149306248 | 🕗 160.11655 | 📌 HamCycle | +| 🇳 482 | ⭕️ 150237472 | 🕗 160.41919 | 📌 HamCycle | +| 🇳 483 | ⭕️ 151172560 | 🕗 161.51451 | 📌 HamCycle | +| 🇳 484 | ⭕️ 152111520 | 🕗 159.73904 | 📌 HamCycle | +| 🇳 485 | ⭕️ 153054360 | 🕗 157.9768 | 📌 HamCycle | +| 🇳 486 | ⭕️ 154001088 | 🕗 160.88005 | 📌 HamCycle | +| 🇳 487 | ⭕️ 154951712 | 🕗 160.48898 | 📌 HamCycle | +| 🇳 488 | ⭕️ 155906240 | 🕗 165.56393 | 📌 HamCycle | +| 🇳 489 | ⭕️ 156864680 | 🕗 166.72247 | 📌 HamCycle | +| 🇳 490 | ⭕️ 157827040 | 🕗 168.896 | 📌 HamCycle | +| 🇳 491 | ⭕️ 158793328 | 🕗 170.08705 | 📌 HamCycle | +| 🇳 492 | ⭕️ 159763552 | 🕗 172.26459 | 📌 HamCycle | +| 🇳 493 | ⭕️ 160737720 | 🕗 176.33698 | 📌 HamCycle | +| 🇳 494 | ⭕️ 161715840 | 🕗 176.98486 | 📌 HamCycle | +| 🇳 495 | ⭕️ 162697920 | 🕗 178.12267 | 📌 HamCycle | +| 🇳 496 | ⭕️ 163683968 | 🕗 179.9136 | 📌 HamCycle | +| 🇳 497 | ⭕️ 164673992 | 🕗 181.50201 | 📌 HamCycle | +| 🇳 498 | ⭕️ 165668000 | 🕗 180.65984 | 📌 HamCycle | +| 🇳 499 | ⭕️ 166666000 | 🕗 185.91138 | 📌 HamCycle | +| 🇳 500 | ⭕️ 167668000 | 🕗 180.13857 | 📌 HamCycle | +| 🇳 501 | ⭕️ 168674008 | 🕗 184.80786 | 📌 HamCycle | +| 🇳 502 | ⭕️ 169684032 | 🕗 189.24567 | 📌 HamCycle | +| 🇳 503 | ⭕️ 170698080 | 🕗 184.8319 | 📌 HamCycle | +| 🇳 504 | ⭕️ 171716160 | 🕗 188.39076 | 📌 HamCycle | +| 🇳 505 | ⭕️ 172738280 | 🕗 193.15251 | 📌 HamCycle | +| 🇳 506 | ⭕️ 173764448 | 🕗 188.31769 | 📌 HamCycle | +| 🇳 507 | ⭕️ 174794672 | 🕗 188.0905 | 📌 HamCycle | +| 🇳 508 | ⭕️ 175828960 | 🕗 195.09679 | 📌 HamCycle | +| 🇳 509 | ⭕️ 176867320 | 🕗 201.87775 | 📌 HamCycle | +| 🇳 510 | ⭕️ 177909760 | 🕗 202.10559 | 📌 HamCycle | +| 🇳 511 | ⭕️ 178956288 | 🕗 195.29196 | 📌 HamCycle | +| 🇳 512 | ⭕️ 180006912 | 🕗 198.45546 | 📌 HamCycle | +| 🇳 513 | ⭕️ 181061640 | 🕗 198.3473 | 📌 HamCycle | +| 🇳 514 | ⭕️ 182120480 | 🕗 199.55894 | 📌 HamCycle | +| 🇳 515 | ⭕️ 183183440 | 🕗 200.94131 | 📌 HamCycle | +| 🇳 516 | ⭕️ 184250528 | 🕗 204.71365 | 📌 HamCycle | +| 🇳 517 | ⭕️ 185321752 | 🕗 204.83247 | 📌 HamCycle | +| 🇳 518 | ⭕️ 186397120 | 🕗 206.04286 | 📌 HamCycle | +| 🇳 519 | ⭕️ 187476640 | 🕗 212.58423 | 📌 HamCycle | +| 🇳 520 | ⭕️ 188560320 | 🕗 213.19406 | 📌 HamCycle | +| 🇳 521 | ⭕️ 189648168 | 🕗 215.09009 | 📌 HamCycle | +| 🇳 522 | ⭕️ 190740192 | 🕗 213.73538 | 📌 HamCycle | +| 🇳 523 | ⭕️ 191836400 | 🕗 223.7679 | 📌 HamCycle | +| 🇳 524 | ⭕️ 192936800 | 🕗 216.17091 | 📌 HamCycle | +| 🇳 525 | ⭕️ 194041400 | 🕗 222.01207 | 📌 HamCycle | +| 🇳 526 | ⭕️ 195150208 | 🕗 222.42264 | 📌 HamCycle | +| 🇳 527 | ⭕️ 196263232 | 🕗 226.24188 | 📌 HamCycle | +| 🇳 528 | ⭕️ 197380480 | 🕗 232.67688 | 📌 HamCycle | +| 🇳 529 | ⭕️ 198501960 | 🕗 235.8923 | 📌 HamCycle | +| 🇳 530 | ⭕️ 199627680 | 🕗 234.01427 | 📌 HamCycle | +| 🇳 531 | ⭕️ 200757648 | 🕗 232.49905 | 📌 HamCycle | +| 🇳 532 | ⭕️ 201891872 | 🕗 236.46259 | 📌 HamCycle | +| 🇳 533 | ⭕️ 203030360 | 🕗 232.61356 | 📌 HamCycle | +| 🇳 534 | ⭕️ 204173120 | 🕗 238.60106 | 📌 HamCycle | +| 🇳 535 | ⭕️ 205320160 | 🕗 235.83269 | 📌 HamCycle | +| 🇳 536 | ⭕️ 206471488 | 🕗 239.52303 | 📌 HamCycle | +| 🇳 537 | ⭕️ 207627112 | 🕗 243.361 | 📌 HamCycle | +| 🇳 538 | ⭕️ 208787040 | 🕗 242.39377 | 📌 HamCycle | +| 🇳 539 | ⭕️ 209951280 | 🕗 246.74837 | 📌 HamCycle | +| 🇳 540 | ⭕️ 211119840 | 🕗 247.12479 | 📌 HamCycle | +| 🇳 541 | ⭕️ 212292728 | 🕗 243.86209 | 📌 HamCycle | +| 🇳 542 | ⭕️ 213469952 | 🕗 256.42505 | 📌 HamCycle | +| 🇳 543 | ⭕️ 214651520 | 🕗 266.68063 | 📌 HamCycle | +| 🇳 544 | ⭕️ 215837440 | 🕗 260.73495 | 📌 HamCycle | +| 🇳 545 | ⭕️ 217027720 | 🕗 267.70337 | 📌 HamCycle | +| 🇳 546 | ⭕️ 218222368 | 🕗 261.0833 | 📌 HamCycle | +| 🇳 547 | ⭕️ 219421392 | 🕗 272.7399 | 📌 HamCycle | +| 🇳 548 | ⭕️ 220624800 | 🕗 274.58136 | 📌 HamCycle | +| 🇳 549 | ⭕️ 221832600 | 🕗 277.08096 | 📌 HamCycle | +| 🇳 550 | ⭕️ 223044800 | 🕗 275.45444 | 📌 HamCycle | +| 🇳 551 | ⭕️ 224261408 | 🕗 282.6327 | 📌 HamCycle | +| 🇳 552 | ⭕️ 225482432 | 🕗 285.79816 | 📌 HamCycle | +| 🇳 553 | ⭕️ 226707880 | 🕗 282.6098 | 📌 HamCycle | +| 🇳 554 | ⭕️ 227937760 | 🕗 288.78473 | 📌 HamCycle | +| 🇳 555 | ⭕️ 229172080 | 🕗 288.35107 | 📌 HamCycle | +| 🇳 556 | ⭕️ 230410848 | 🕗 293.98328 | 📌 HamCycle | +| 🇳 557 | ⭕️ 231654072 | 🕗 290.5512 | 📌 HamCycle | +| 🇳 558 | ⭕️ 232901760 | 🕗 295.20395 | 📌 HamCycle | +| 🇳 559 | ⭕️ 234153920 | 🕗 296.7715 | 📌 HamCycle | +| 🇳 560 | ⭕️ 235410560 | 🕗 299.67874 | 📌 HamCycle | +| 🇳 561 | ⭕️ 236671688 | 🕗 294.1798 | 📌 HamCycle | +| 🇳 562 | ⭕️ 237937312 | 🕗 298.7274 | 📌 HamCycle | +| 🇳 563 | ⭕️ 239207440 | 🕗 305.2032 | 📌 HamCycle | +| 🇳 564 | ⭕️ 240482080 | 🕗 304.91074 | 📌 HamCycle | +| 🇳 565 | ⭕️ 241761240 | 🕗 306.43347 | 📌 HamCycle | +| 🇳 566 | ⭕️ 243044928 | 🕗 310.0805 | 📌 HamCycle | +| 🇳 567 | ⭕️ 244333152 | 🕗 304.86362 | 📌 HamCycle | +| 🇳 568 | ⭕️ 245625920 | 🕗 312.35974 | 📌 HamCycle | +| 🇳 569 | ⭕️ 246923240 | 🕗 305.47516 | 📌 HamCycle | +| 🇳 570 | ⭕️ 248225120 | 🕗 312.8053 | 📌 HamCycle | +| 🇳 571 | ⭕️ 249531568 | 🕗 319.61658 | 📌 HamCycle | +| 🇳 572 | ⭕️ 250842592 | 🕗 316.51083 | 📌 HamCycle | +| 🇳 573 | ⭕️ 252158200 | 🕗 323.52258 | 📌 HamCycle | +| 🇳 574 | ⭕️ 253478400 | 🕗 319.13864 | 📌 HamCycle | +| 🇳 575 | ⭕️ 254803200 | 🕗 322.1029 | 📌 HamCycle | +| 🇳 576 | ⭕️ 256132608 | 🕗 326.68817 | 📌 HamCycle | +| 🇳 577 | ⭕️ 257466632 | 🕗 329.7244 | 📌 HamCycle | +| 🇳 578 | ⭕️ 258805280 | 🕗 333.92834 | 📌 HamCycle | +| 🇳 579 | ⭕️ 260148560 | 🕗 335.83194 | 📌 HamCycle | +| 🇳 580 | ⭕️ 261496480 | 🕗 332.32965 | 📌 HamCycle | +| 🇳 581 | ⭕️ 262849048 | 🕗 341.34454 | 📌 HamCycle | +| 🇳 582 | ⭕️ 264206272 | 🕗 347.64023 | 📌 HamCycle | +| 🇳 583 | ⭕️ 265568160 | 🕗 345.8147 | 📌 HamCycle | +| 🇳 584 | ⭕️ 266934720 | 🕗 346.60184 | 📌 HamCycle | +| 🇳 585 | ⭕️ 268305960 | 🕗 353.47922 | 📌 HamCycle | +| 🇳 586 | ⭕️ 269681888 | 🕗 348.5156 | 📌 HamCycle | +| 🇳 587 | ⭕️ 271062512 | 🕗 354.67804 | 📌 HamCycle | +| 🇳 588 | ⭕️ 272447840 | 🕗 358.5602 | 📌 HamCycle | +| 🇳 589 | ⭕️ 273837880 | 🕗 361.39285 | 📌 HamCycle | +| 🇳 590 | ⭕️ 275232640 | 🕗 358.9996 | 📌 HamCycle | +| 🇳 591 | ⭕️ 276632128 | 🕗 365.16013 | 📌 HamCycle | +| 🇳 592 | ⭕️ 278036352 | 🕗 368.42203 | 📌 HamCycle | +| 🇳 593 | ⭕️ 279445320 | 🕗 384.90805 | 📌 HamCycle | +| 🇳 594 | ⭕️ 280859040 | 🕗 388.30814 | 📌 HamCycle | +| 🇳 595 | ⭕️ 282277520 | 🕗 379.4872 | 📌 HamCycle | +| 🇳 596 | ⭕️ 283700768 | 🕗 386.50583 | 📌 HamCycle | +| 🇳 597 | ⭕️ 285128792 | 🕗 393.26294 | 📌 HamCycle | +| 🇳 598 | ⭕️ 286561600 | 🕗 397.68787 | 📌 HamCycle | +| 🇳 599 | ⭕️ 287999200 | 🕗 391.36526 | 📌 HamCycle | +| 🇳 600 | ⭕️ 289441600 | 🕗 395.29166 | 📌 HamCycle | +| 🇳 601 | ⭕️ 290888808 | 🕗 394.0016 | 📌 HamCycle | +| 🇳 602 | ⭕️ 292340832 | 🕗 398.37943 | 📌 HamCycle | +| 🇳 603 | ⭕️ 293797680 | 🕗 397.2135 | 📌 HamCycle | +| 🇳 604 | ⭕️ 295259360 | 🕗 407.37674 | 📌 HamCycle | +| 🇳 605 | ⭕️ 296725880 | 🕗 399.55322 | 📌 HamCycle | +| 🇳 606 | ⭕️ 298197248 | 🕗 402.8125 | 📌 HamCycle | +| 🇳 607 | ⭕️ 299673472 | 🕗 407.3828 | 📌 HamCycle | +| 🇳 608 | ⭕️ 301154560 | 🕗 411.58286 | 📌 HamCycle | +| 🇳 609 | ⭕️ 302640520 | 🕗 420.60904 | 📌 HamCycle | +| 🇳 610 | ⭕️ 304131360 | 🕗 420.22845 | 📌 HamCycle | +| 🇳 611 | ⭕️ 305627088 | 🕗 417.67224 | 📌 HamCycle | +| 🇳 612 | ⭕️ 307127712 | 🕗 424.1204 | 📌 HamCycle | +| 🇳 613 | ⭕️ 308633240 | 🕗 423.88095 | 📌 HamCycle | +| 🇳 614 | ⭕️ 310143680 | 🕗 420.28613 | 📌 HamCycle | +| 🇳 615 | ⭕️ 311659040 | 🕗 427.30582 | 📌 HamCycle | +| 🇳 616 | ⭕️ 313179328 | 🕗 434.70377 | 📌 HamCycle | +| 🇳 617 | ⭕️ 314704552 | 🕗 432.13037 | 📌 HamCycle | +| 🇳 618 | ⭕️ 316234720 | 🕗 439.56363 | 📌 HamCycle | +| 🇳 619 | ⭕️ 317769840 | 🕗 434.40652 | 📌 HamCycle | +| 🇳 620 | ⭕️ 319309920 | 🕗 434.97903 | 📌 HamCycle | +| 🇳 621 | ⭕️ 320854968 | 🕗 452.95828 | 📌 HamCycle | +| 🇳 622 | ⭕️ 322404992 | 🕗 452.21384 | 📌 HamCycle | +| 🇳 623 | ⭕️ 323960000 | 🕗 452.32138 | 📌 HamCycle | +| 🇳 624 | ⭕️ 325520000 | 🕗 468.56094 | 📌 HamCycle | +| 🇳 625 | ⭕️ 327085000 | 🕗 467.57712 | 📌 HamCycle | +| 🇳 626 | ⭕️ 328655008 | 🕗 469.53217 | 📌 HamCycle | +| 🇳 627 | ⭕️ 330230032 | 🕗 465.26266 | 📌 HamCycle | +| 🇳 628 | ⭕️ 331810080 | 🕗 471.36078 | 📌 HamCycle | +| 🇳 629 | ⭕️ 333395160 | 🕗 470.34805 | 📌 HamCycle | +| 🇳 630 | ⭕️ 334985280 | 🕗 477.12006 | 📌 HamCycle | +| 🇳 631 | ⭕️ 336580448 | 🕗 482.81473 | 📌 HamCycle | +| 🇳 632 | ⭕️ 338180672 | 🕗 486.29355 | 📌 HamCycle | +| 🇳 633 | ⭕️ 339785960 | 🕗 474.5131 | 📌 HamCycle | +| 🇳 634 | ⭕️ 341396320 | 🕗 480.30698 | 📌 HamCycle | +| 🇳 635 | ⭕️ 343011760 | 🕗 479.92386 | 📌 HamCycle | +| 🇳 636 | ⭕️ 344632288 | 🕗 491.80957 | 📌 HamCycle | +| 🇳 637 | ⭕️ 346257912 | 🕗 485.2694 | 📌 HamCycle | +| 🇳 638 | ⭕️ 347888640 | 🕗 491.40918 | 📌 HamCycle | +| 🇳 639 | ⭕️ 349524480 | 🕗 488.1747 | 📌 HamCycle | +| 🇳 640 | ⭕️ 351165440 | 🕗 486.9941 | 📌 HamCycle | +| 🇳 641 | ⭕️ 352811528 | 🕗 502.82367 | 📌 HamCycle | +| 🇳 642 | ⭕️ 354462752 | 🕗 505.23694 | 📌 HamCycle | +| 🇳 643 | ⭕️ 356119120 | 🕗 493.72095 | 📌 HamCycle | +| 🇳 644 | ⭕️ 357780640 | 🕗 506.8765 | 📌 HamCycle | +| 🇳 645 | ⭕️ 359447320 | 🕗 505.48227 | 📌 HamCycle | +| 🇳 646 | ⭕️ 361119168 | 🕗 508.94162 | 📌 HamCycle | +| 🇳 647 | ⭕️ 362796192 | 🕗 529.23035 | 📌 HamCycle | +| 🇳 648 | ⭕️ 364478400 | 🕗 536.2427 | 📌 HamCycle | +| 🇳 649 | ⭕️ 366165800 | 🕗 541.9881 | 📌 HamCycle | +| 🇳 650 | ⭕️ 367858400 | 🕗 542.15656 | 📌 HamCycle | +| 🇳 651 | ⭕️ 369556208 | 🕗 537.8123 | 📌 HamCycle | +| 🇳 652 | ⭕️ 371259232 | 🕗 542.0666 | 📌 HamCycle | +| 🇳 653 | ⭕️ 372967480 | 🕗 550.36206 | 📌 HamCycle | +| 🇳 654 | ⭕️ 374680960 | 🕗 568.1294 | 📌 HamCycle | +| 🇳 655 | ⭕️ 376399680 | 🕗 564.33545 | 📌 HamCycle | +| 🇳 656 | ⭕️ 378123648 | 🕗 556.8233 | 📌 HamCycle | +| 🇳 657 | ⭕️ 379852872 | 🕗 549.9941 | 📌 HamCycle | +| 🇳 658 | ⭕️ 381587360 | 🕗 567.8387 | 📌 HamCycle | +| 🇳 659 | ⭕️ 383327120 | 🕗 560.9873 | 📌 HamCycle | +| 🇳 660 | ⭕️ 385072160 | 🕗 561.5826 | 📌 HamCycle | +| 🇳 661 | ⭕️ 386822488 | 🕗 589.1388 | 📌 HamCycle | +| 🇳 662 | ⭕️ 388578112 | 🕗 587.5338 | 📌 HamCycle | +| 🇳 663 | ⭕️ 390339040 | 🕗 585.85474 | 📌 HamCycle | +| 🇳 664 | ⭕️ 392105280 | 🕗 494.92694 | 📌 HamCycle | +| 🇳 665 | ⭕️ 393876840 | 🕗 484.69604 | 📌 HamCycle | +| 🇳 666 | ⭕️ 395653728 | 🕗 498.51175 | 📌 HamCycle | +| 🇳 667 | ⭕️ 397435952 | 🕗 483.14536 | 📌 HamCycle | +| 🇳 668 | ⭕️ 399223520 | 🕗 481.03534 | 📌 HamCycle | +| 🇳 669 | ⭕️ 401016440 | 🕗 486.0365 | 📌 HamCycle | +| 🇳 670 | ⭕️ 402814720 | 🕗 482.0655 | 📌 HamCycle | +| 🇳 671 | ⭕️ 404618368 | 🕗 491.62445 | 📌 HamCycle | +| 🇳 672 | ⭕️ 406427392 | 🕗 518.8315 | 📌 HamCycle | +| 🇳 673 | ⭕️ 408241800 | 🕗 503.79465 | 📌 HamCycle | +| 🇳 674 | ⭕️ 410061600 | 🕗 509.1825 | 📌 HamCycle | +| 🇳 675 | ⭕️ 411886800 | 🕗 507.5166 | 📌 HamCycle | +| 🇳 676 | ⭕️ 413717408 | 🕗 511.55142 | 📌 HamCycle | +| 🇳 677 | ⭕️ 415553432 | 🕗 518.1366 | 📌 HamCycle | +| 🇳 678 | ⭕️ 417394880 | 🕗 513.89624 | 📌 HamCycle | +| 🇳 679 | ⭕️ 419241760 | 🕗 516.77234 | 📌 HamCycle | +| 🇳 680 | ⭕️ 421094080 | 🕗 519.8378 | 📌 HamCycle | +| 🇳 681 | ⭕️ 422951848 | 🕗 540.3061 | 📌 HamCycle | +| 🇳 682 | ⭕️ 424815072 | 🕗 550.7973 | 📌 HamCycle | +| 🇳 683 | ⭕️ 426683760 | 🕗 549.3181 | 📌 HamCycle | +| 🇳 684 | ⭕️ 428557920 | 🕗 549.1613 | 📌 HamCycle | +| 🇳 685 | ⭕️ 430437560 | 🕗 558.74603 | 📌 HamCycle | +| 🇳 686 | ⭕️ 432322688 | 🕗 559.4322 | 📌 HamCycle | +| 🇳 687 | ⭕️ 434213312 | 🕗 568.04224 | 📌 HamCycle | +| 🇳 688 | ⭕️ 436109440 | 🕗 565.4874 | 📌 HamCycle | +| 🇳 689 | ⭕️ 438011080 | 🕗 573.92334 | 📌 HamCycle | +| 🇳 690 | ⭕️ 439918240 | 🕗 589.643 | 📌 HamCycle | +| 🇳 691 | ⭕️ 441830928 | 🕗 573.4014 | 📌 HamCycle | +| 🇳 692 | ⭕️ 443749152 | 🕗 576.54156 | 📌 HamCycle | +| 🇳 693 | ⭕️ 445672920 | 🕗 588.80273 | 📌 HamCycle | +| 🇳 694 | ⭕️ 447602240 | 🕗 579.348 | 📌 HamCycle | +| 🇳 695 | ⭕️ 449537120 | 🕗 581.2176 | 📌 HamCycle | +| 🇳 696 | ⭕️ 451477568 | 🕗 593.41754 | 📌 HamCycle | +| 🇳 697 | ⭕️ 453423592 | 🕗 591.6911 | 📌 HamCycle | +| 🇳 698 | ⭕️ 455375200 | 🕗 598.3213 | 📌 HamCycle | +| 🇳 699 | ⭕️ 457332400 | 🕗 614.75604 | 📌 HamCycle | +| 🇳 700 | ⭕️ 459295200 | 🕗 618.5227 | 📌 HamCycle | +| 🇳 701 | ⭕️ 461263608 | 🕗 616.6068 | 📌 HamCycle | +| 🇳 702 | ⭕️ 463237632 | 🕗 621.2421 | 📌 HamCycle | +| 🇳 703 | ⭕️ 465217280 | 🕗 626.11523 | 📌 HamCycle | +| 🇳 704 | ⭕️ 467202560 | 🕗 638.3402 | 📌 HamCycle | +| 🇳 705 | ⭕️ 469193480 | 🕗 643.78937 | 📌 HamCycle | +| 🇳 706 | ⭕️ 471190048 | 🕗 641.0614 | 📌 HamCycle | +| 🇳 707 | ⭕️ 473192272 | 🕗 649.15546 | 📌 HamCycle | +| 🇳 708 | ⭕️ 475200160 | 🕗 647.8107 | 📌 HamCycle | +| 🇳 709 | ⭕️ 477213720 | 🕗 642.5492 | 📌 HamCycle | +| 🇳 710 | ⭕️ 479232960 | 🕗 636.0015 | 📌 HamCycle | +| 🇳 711 | ⭕️ 481257888 | 🕗 646.39 | 📌 HamCycle | +| 🇳 712 | ⭕️ 483288512 | 🕗 660.28766 | 📌 HamCycle | +| 🇳 713 | ⭕️ 485324840 | 🕗 643.3258 | 📌 HamCycle | +| 🇳 714 | ⭕️ 487366880 | 🕗 663.9865 | 📌 HamCycle | +| 🇳 715 | ⭕️ 489414640 | 🕗 649.8643 | 📌 HamCycle | +| 🇳 716 | ⭕️ 491468128 | 🕗 652.14044 | 📌 HamCycle | +| 🇳 717 | ⭕️ 493527352 | 🕗 659.4656 | 📌 HamCycle | +| 🇳 718 | ⭕️ 495592320 | 🕗 667.9637 | 📌 HamCycle | +| 🇳 719 | ⭕️ 497663040 | 🕗 689.3182 | 📌 HamCycle | +| 🇳 720 | ⭕️ 499739520 | 🕗 691.4332 | 📌 HamCycle | +| 🇳 721 | ⭕️ 501821768 | 🕗 700.131 | 📌 HamCycle | +| 🇳 722 | ⭕️ 503909792 | 🕗 691.2255 | 📌 HamCycle | +| 🇳 723 | ⭕️ 506003600 | 🕗 694.85944 | 📌 HamCycle | +| 🇳 724 | ⭕️ 508103200 | 🕗 694.552 | 📌 HamCycle | +| 🇳 725 | ⭕️ 510208600 | 🕗 700.2798 | 📌 HamCycle | +| 🇳 726 | ⭕️ 512319808 | 🕗 711.0836 | 📌 HamCycle | +| 🇳 727 | ⭕️ 514436832 | 🕗 709.978 | 📌 HamCycle | +| 🇳 728 | ⭕️ 516559680 | 🕗 708.6386 | 📌 HamCycle | +| 🇳 729 | ⭕️ 518688360 | 🕗 710.59827 | 📌 HamCycle | +| 🇳 730 | ⭕️ 520822880 | 🕗 696.6343 | 📌 HamCycle | +| 🇳 731 | ⭕️ 522963248 | 🕗 706.3575 | 📌 HamCycle | +| 🇳 732 | ⭕️ 525109472 | 🕗 704.51105 | 📌 HamCycle | +| 🇳 733 | ⭕️ 527261560 | 🕗 715.76654 | 📌 HamCycle | +| 🇳 734 | ⭕️ 529419520 | 🕗 716.8163 | 📌 HamCycle | +| 🇳 735 | ⭕️ 531583360 | 🕗 705.41565 | 📌 HamCycle | +| 🇳 736 | ⭕️ 533753088 | 🕗 728.7352 | 📌 HamCycle | +| 🇳 737 | ⭕️ 535928712 | 🕗 727.3157 | 📌 HamCycle | +| 🇳 738 | ⭕️ 538110240 | 🕗 737.16486 | 📌 HamCycle | +| 🇳 739 | ⭕️ 540297680 | 🕗 736.6044 | 📌 HamCycle | +| 🇳 740 | ⭕️ 542491040 | 🕗 743.94226 | 📌 HamCycle | +| 🇳 741 | ⭕️ 544690328 | 🕗 761.84845 | 📌 HamCycle | +| 🇳 742 | ⭕️ 546895552 | 🕗 748.2603 | 📌 HamCycle | +| 🇳 743 | ⭕️ 549106720 | 🕗 753.649 | 📌 HamCycle | +| 🇳 744 | ⭕️ 551323840 | 🕗 766.7317 | 📌 HamCycle | +| 🇳 745 | ⭕️ 553546920 | 🕗 764.153 | 📌 HamCycle | +| 🇳 746 | ⭕️ 555775968 | 🕗 776.7221 | 📌 HamCycle | +| 🇳 747 | ⭕️ 558010992 | 🕗 777.84644 | 📌 HamCycle | +| 🇳 748 | ⭕️ 560252000 | 🕗 779.5181 | 📌 HamCycle | +| 🇳 749 | ⭕️ 562499000 | 🕗 781.3824 | 📌 HamCycle | +| 🇳 750 | ⭕️ 564752000 | 🕗 786.7109 | 📌 HamCycle | +| 🇳 751 | ⭕️ 567011008 | 🕗 781.26154 | 📌 HamCycle | +| 🇳 752 | ⭕️ 569276032 | 🕗 802.06433 | 📌 HamCycle | +| 🇳 753 | ⭕️ 571547080 | 🕗 799.93066 | 📌 HamCycle | +| 🇳 754 | ⭕️ 573824160 | 🕗 808.67163 | 📌 HamCycle | +| 🇳 755 | ⭕️ 576107280 | 🕗 810.8434 | 📌 HamCycle | +| 🇳 756 | ⭕️ 578396448 | 🕗 819.05066 | 📌 HamCycle | +| 🇳 757 | ⭕️ 580691672 | 🕗 814.0104 | 📌 HamCycle | +| 🇳 758 | ⭕️ 582992960 | 🕗 825.8387 | 📌 HamCycle | +| 🇳 759 | ⭕️ 585300320 | 🕗 813.3797 | 📌 HamCycle | +| 🇳 760 | ⭕️ 587613760 | 🕗 814.45306 | 📌 HamCycle | +| 🇳 761 | ⭕️ 589933288 | 🕗 810.06885 | 📌 HamCycle | +| 🇳 762 | ⭕️ 592258912 | 🕗 818.7698 | 📌 HamCycle | +| 🇳 763 | ⭕️ 594590640 | 🕗 830.1747 | 📌 HamCycle | +| 🇳 764 | ⭕️ 596928480 | 🕗 819.3192 | 📌 HamCycle | +| 🇳 765 | ⭕️ 599272440 | 🕗 819.84174 | 📌 HamCycle | +| 🇳 766 | ⭕️ 601622528 | 🕗 825.9119 | 📌 HamCycle | +| 🇳 767 | ⭕️ 603978752 | 🕗 824.95276 | 📌 HamCycle | +| 🇳 768 | ⭕️ 606341120 | 🕗 839.7549 | 📌 HamCycle | +| 🇳 769 | ⭕️ 608709640 | 🕗 839.9701 | 📌 HamCycle | +| 🇳 770 | ⭕️ 611084320 | 🕗 847.5698 | 📌 HamCycle | +| 🇳 771 | ⭕️ 613465168 | 🕗 855.8702 | 📌 HamCycle | +| 🇳 772 | ⭕️ 615852192 | 🕗 884.4243 | 📌 HamCycle | +| 🇳 773 | ⭕️ 618245400 | 🕗 849.62134 | 📌 HamCycle | +| 🇳 774 | ⭕️ 620644800 | 🕗 871.8819 | 📌 HamCycle | +| 🇳 775 | ⭕️ 623050400 | 🕗 901.0242 | 📌 HamCycle | +| 🇳 776 | ⭕️ 625462208 | 🕗 889.9719 | 📌 HamCycle | +| 🇳 777 | ⭕️ 627880232 | 🕗 881.2467 | 📌 HamCycle | +| 🇳 778 | ⭕️ 630304480 | 🕗 881.959 | 📌 HamCycle | +| 🇳 779 | ⭕️ 632734960 | 🕗 904.2326 | 📌 HamCycle | +| 🇳 780 | ⭕️ 635171680 | 🕗 901.1722 | 📌 HamCycle | +| 🇳 781 | ⭕️ 637614648 | 🕗 896.6193 | 📌 HamCycle | +| 🇳 782 | ⭕️ 640063872 | 🕗 896.7516 | 📌 HamCycle | +| 🇳 783 | ⭕️ 642519360 | 🕗 904.9419 | 📌 HamCycle | +| 🇳 784 | ⭕️ 644981120 | 🕗 917.5617 | 📌 HamCycle | +| 🇳 785 | ⭕️ 647449160 | 🕗 902.4568 | 📌 HamCycle | +| 🇳 786 | ⭕️ 649923488 | 🕗 915.41644 | 📌 HamCycle | +| 🇳 787 | ⭕️ 652404112 | 🕗 912.26575 | 📌 HamCycle | +| 🇳 788 | ⭕️ 654891040 | 🕗 946.83716 | 📌 HamCycle | +| 🇳 789 | ⭕️ 657384280 | 🕗 934.7332 | 📌 HamCycle | +| 🇳 790 | ⭕️ 659883840 | 🕗 945.3118 | 📌 HamCycle | +| 🇳 791 | ⭕️ 662389728 | 🕗 940.4451 | 📌 HamCycle | +| 🇳 792 | ⭕️ 664901952 | 🕗 967.11554 | 📌 HamCycle | +| 🇳 793 | ⭕️ 667420520 | 🕗 959.1339 | 📌 HamCycle | +| 🇳 794 | ⭕️ 669945440 | 🕗 968.47614 | 📌 HamCycle | +| 🇳 795 | ⭕️ 672476720 | 🕗 953.41785 | 📌 HamCycle | +| 🇳 796 | ⭕️ 675014368 | 🕗 969.8161 | 📌 HamCycle | +| 🇳 797 | ⭕️ 677558392 | 🕗 985.97925 | 📌 HamCycle | +| 🇳 798 | ⭕️ 680108800 | 🕗 978.6896 | 📌 HamCycle | +| 🇳 799 | ⭕️ 682665600 | 🕗 992.1539 | 📌 HamCycle | +| 🇳 800 | ⭕️ 685228800 | 🕗 998.6654 | 📌 HamCycle | +| 🇳 801 | ⭕️ 687798408 | 🕗 986.23114 | 📌 HamCycle | +| 🇳 802 | ⭕️ 690374432 | 🕗 995.90717 | 📌 HamCycle | +| 🇳 803 | ⭕️ 692956880 | 🕗 1011.37915 | 📌 HamCycle | +| 🇳 804 | ⭕️ 695545760 | 🕗 1015.4425 | 📌 HamCycle | +| 🇳 805 | ⭕️ 698141080 | 🕗 1028.2537 | 📌 HamCycle | +| 🇳 806 | ⭕️ 700742848 | 🕗 1027.4452 | 📌 HamCycle | +| 🇳 807 | ⭕️ 703351072 | 🕗 1019.17346 | 📌 HamCycle | +| 🇳 808 | ⭕️ 705965760 | 🕗 1040.656 | 📌 HamCycle | +| 🇳 809 | ⭕️ 708586920 | 🕗 1036.1797 | 📌 HamCycle | +| 🇳 810 | ⭕️ 711214560 | 🕗 1021.82355 | 📌 HamCycle | +| 🇳 811 | ⭕️ 713848688 | 🕗 1053.1433 | 📌 HamCycle | +| 🇳 812 | ⭕️ 716489312 | 🕗 1053.8279 | 📌 HamCycle | +| 🇳 813 | ⭕️ 719136440 | 🕗 1034.6536 | 📌 HamCycle | +| 🇳 814 | ⭕️ 721790080 | 🕗 1069.9127 | 📌 HamCycle | +| 🇳 815 | ⭕️ 724450240 | 🕗 1070.0461 | 📌 HamCycle | +| 🇳 816 | ⭕️ 727116928 | 🕗 1060.5667 | 📌 HamCycle | +| 🇳 817 | ⭕️ 729790152 | 🕗 1083.5398 | 📌 HamCycle | +| 🇳 818 | ⭕️ 732469920 | 🕗 1075.5547 | 📌 HamCycle | +| 🇳 819 | ⭕️ 735156240 | 🕗 1095.4841 | 📌 HamCycle | +| 🇳 820 | ⭕️ 737849120 | 🕗 1091.9056 | 📌 HamCycle | +| 🇳 821 | ⭕️ 740548568 | 🕗 1086.7192 | 📌 HamCycle | +| 🇳 822 | ⭕️ 743254592 | 🕗 1094.7296 | 📌 HamCycle | +| 🇳 823 | ⭕️ 745967200 | 🕗 1098.8488 | 📌 HamCycle | +| 🇳 824 | ⭕️ 748686400 | 🕗 1106.9021 | 📌 HamCycle | +| 🇳 825 | ⭕️ 751412200 | 🕗 1100.246 | 📌 HamCycle | +| 🇳 826 | ⭕️ 754144608 | 🕗 1126.7186 | 📌 HamCycle | +| 🇳 827 | ⭕️ 756883632 | 🕗 1146.5054 | 📌 HamCycle | +| 🇳 828 | ⭕️ 759629280 | 🕗 1162.1633 | 📌 HamCycle | +| 🇳 829 | ⭕️ 762381560 | 🕗 1174.809 | 📌 HamCycle | +| 🇳 830 | ⭕️ 765140480 | 🕗 1170.0933 | 📌 HamCycle | +| 🇳 831 | ⭕️ 767906048 | 🕗 1188.7399 | 📌 HamCycle | +| 🇳 832 | ⭕️ 770678272 | 🕗 1203.2622 | 📌 HamCycle | +| 🇳 833 | ⭕️ 773457160 | 🕗 1190.826 | 📌 HamCycle | +| 🇳 834 | ⭕️ 776242720 | 🕗 1211.4597 | 📌 HamCycle | +| 🇳 835 | ⭕️ 779034960 | 🕗 1164.9359 | 📌 HamCycle | +| 🇳 836 | ⭕️ 781833888 | 🕗 1182.0198 | 📌 HamCycle | +| 🇳 837 | ⭕️ 784639512 | 🕗 1186.8093 | 📌 HamCycle | +| 🇳 838 | ⭕️ 787451840 | 🕗 1209.8766 | 📌 HamCycle | +| 🇳 839 | ⭕️ 790270880 | 🕗 1205.0645 | 📌 HamCycle | +| 🇳 840 | ⭕️ 793096640 | 🕗 1226.6135 | 📌 HamCycle | +| 🇳 841 | ⭕️ 795929128 | 🕗 1222.5034 | 📌 HamCycle | +| 🇳 842 | ⭕️ 798768352 | 🕗 1237.177 | 📌 HamCycle | +| 🇳 843 | ⭕️ 801614320 | 🕗 1231.9922 | 📌 HamCycle | +| 🇳 844 | ⭕️ 804467040 | 🕗 1234.2844 | 📌 HamCycle | +| 🇳 845 | ⭕️ 807326520 | 🕗 1237.1168 | 📌 HamCycle | +| 🇳 846 | ⭕️ 810192768 | 🕗 1240.3177 | 📌 HamCycle | +| 🇳 847 | ⭕️ 813065792 | 🕗 1248.7838 | 📌 HamCycle | +| 🇳 848 | ⭕️ 815945600 | 🕗 1273.6678 | 📌 HamCycle | +| 🇳 849 | ⭕️ 818832200 | 🕗 1262.9441 | 📌 HamCycle | +| 🇳 850 | ⭕️ 821725600 | 🕗 1262.6003 | 📌 HamCycle | +| 🇳 851 | ⭕️ 824625808 | 🕗 1278.4816 | 📌 HamCycle | +| 🇳 852 | ⭕️ 827532832 | 🕗 1276.0511 | 📌 HamCycle | +| 🇳 853 | ⭕️ 830446680 | 🕗 1260.8254 | 📌 HamCycle | +| 🇳 854 | ⭕️ 833367360 | 🕗 1299.5009 | 📌 HamCycle | +| 🇳 855 | ⭕️ 836294880 | 🕗 1284.1141 | 📌 HamCycle | +| 🇳 856 | ⭕️ 839229248 | 🕗 1281.1891 | 📌 HamCycle | +| 🇳 857 | ⭕️ 842170472 | 🕗 1312.8049 | 📌 HamCycle | +| 🇳 858 | ⭕️ 845118560 | 🕗 1297.0094 | 📌 HamCycle | +| 🇳 859 | ⭕️ 848073520 | 🕗 1311.4869 | 📌 HamCycle | +| 🇳 860 | ⭕️ 851035360 | 🕗 1321.159 | 📌 HamCycle | +| 🇳 861 | ⭕️ 854004088 | 🕗 1328.9614 | 📌 HamCycle | +| 🇳 862 | ⭕️ 856979712 | 🕗 1336.1957 | 📌 HamCycle | +| 🇳 863 | ⭕️ 859962240 | 🕗 1318.6458 | 📌 HamCycle | +| 🇳 864 | ⭕️ 862951680 | 🕗 1345.3757 | 📌 HamCycle | +| 🇳 865 | ⭕️ 865948040 | 🕗 1373.4031 | 📌 HamCycle | +| 🇳 866 | ⭕️ 868951328 | 🕗 1358.4807 | 📌 HamCycle | +| 🇳 867 | ⭕️ 871961552 | 🕗 1373.3682 | 📌 HamCycle | +| 🇳 868 | ⭕️ 874978720 | 🕗 1359.3738 | 📌 HamCycle | +| 🇳 869 | ⭕️ 878002840 | 🕗 1361.6593 | 📌 HamCycle | +| 🇳 870 | ⭕️ 881033920 | 🕗 1406.5709 | 📌 HamCycle | +| 🇳 871 | ⭕️ 884071968 | 🕗 1433.6284 | 📌 HamCycle | +| 🇳 872 | ⭕️ 887116992 | 🕗 1420.4707 | 📌 HamCycle | +| 🇳 873 | ⭕️ 890169000 | 🕗 1413.2761 | 📌 HamCycle | +| 🇳 874 | ⭕️ 893228000 | 🕗 1460.4004 | 📌 HamCycle | +| 🇳 875 | ⭕️ 896294000 | 🕗 1448.5476 | 📌 HamCycle | +| 🇳 876 | ⭕️ 899367008 | 🕗 1446.5065 | 📌 HamCycle | +| 🇳 877 | ⭕️ 902447032 | 🕗 1478.686 | 📌 HamCycle | +| 🇳 878 | ⭕️ 905534080 | 🕗 1476.205 | 📌 HamCycle | +| 🇳 879 | ⭕️ 908628160 | 🕗 1481.538 | 📌 HamCycle | +| 🇳 880 | ⭕️ 911729280 | 🕗 1483.3105 | 📌 HamCycle | +| 🇳 881 | ⭕️ 914837448 | 🕗 1467.383 | 📌 HamCycle | +| 🇳 1000 | ⭕️ 1337336000 | 🕗 2403.4136 | 📌 HamCycle | +| 🇳 1010 | 🕗 MAKE: 0.367315 | ⭕️ 1377817760 | 🕗 SOLVE: 2561.4006 | 📌 HamCycle +| 🇳 1100 | 🕗 MAKE: 0.373897 | ⭕️ 1779509600 | 🕗 SOLVE: 3562.2673 | 📌 HamCycle +| 🇳 1200 | 🕗 MAKE: 0.521218 | ⭕️ 2309763200 | 🕗 SOLVE: 8420.2519 | 📌 HamCycle +| 🇳 1300 | 🕗 MAKE: 0.580622 | ⭕️ 2936096800 | 🕗 SOLVE: 11424.484 | 📌 HamCycle +| 🇳 1310 | 🕗 MAKE: 0.605197 | ⭕️ 3004322560 | 🕗 SOLVE: 11881.937 | 📌 HamCycle ## Licensing: This package is licensed under the MIT license. diff --git a/imgs/8_to_212million.png b/imgs/8_to_212million.png new file mode 100644 index 0000000..22dd132 Binary files /dev/null and b/imgs/8_to_212million.png differ diff --git a/imgs/8_to_68085920.png b/imgs/8_to_68085920.png deleted file mode 100644 index 40666bc..0000000 Binary files a/imgs/8_to_68085920.png and /dev/null differ diff --git a/imgs/hauy.png b/imgs/hauy.png new file mode 100644 index 0000000..90a49e4 Binary files /dev/null and b/imgs/hauy.png differ diff --git a/imgs/hauyCabinett.png b/imgs/hauyCabinett.png index 8214d82..f331808 100644 Binary files a/imgs/hauyCabinett.png and b/imgs/hauyCabinett.png differ diff --git a/imgs/icosian.jpg b/imgs/icosian.jpg new file mode 100644 index 0000000..4113aad Binary files /dev/null and b/imgs/icosian.jpg differ diff --git a/imgs/solution.png b/imgs/solution.png new file mode 100644 index 0000000..9f2a52f Binary files /dev/null and b/imgs/solution.png differ diff --git a/src/graph/defs.rs b/src/graph/defs.rs index e9d0486..80f68db 100644 --- a/src/graph/defs.rs +++ b/src/graph/defs.rs @@ -4,59 +4,80 @@ use std::collections::{HashMap, HashSet, VecDeque}; use super::utils::{check_edge::is_valid_edge, modify::orient}; +pub const DISP_VECTORS: [[[i16; 2]; 2]; 4] = [ + [[-2, 0], [0, -2]], + [[-2, 0], [0, 2]], + [[2, 0], [0, 2]], + [[2, 0], [0, -2]], +]; + pub type Adjacency = HashMap; pub type ZAdjacency = HashMap<[Point; 2], Vec<[Point; 2]>>; pub type Bobbins = Vec; pub type Count = usize; pub type Edge = (Node, Node); pub type Edges = HashSet; -pub type Loom = Vec; -pub type Neighbors = HashSet; -pub type Node = u32; +pub type Loom = Vec>; +pub type LoomSlice = [VecDeque<[i16; 3]>]; +pub type Neighbors = HashSet<[i16; 3]>; +pub type Node = [i16; 3]; pub type Nodes = HashSet; pub type Order = u32; pub type Point = i16; pub type Points = HashSet; pub type Solution = Tour; +pub type Spindle = Vec<[i16; 2]>; pub type Spool = HashMap; +pub type Spun = HashMap<[i16; 2], bool>; pub type Subtours = Vec; -pub type Tour = Vec; -pub type TourSlice<'a> = &'a [Node]; -pub type TourSliceThick<'a> = &'a [[i16; 2]]; +pub type Tour = Vec<[i16; 3]>; +pub type TourSlice<'a> = &'a [[i16; 2]]; pub type YarnEnds = VecDeque; +pub type Var2 = [i16; 2]; pub type Vert = (Point, Point, Point); -pub type Verts = [Vert]; +pub type Verts = [[i16; 3]]; pub type VecVert = Vec; pub type VIMap = HashMap; -pub type Warps = Subtours; +pub type Warps = Vec>; pub type Weights = HashMap; pub type SignedIdx = i32; pub type Yarn = Array2; pub type ZlevelNodesMap = HashMap; pub type ZOrder = Vec<(Point, usize)>; +use serde::Serialize; +use std::error::Error; + +#[derive(Debug, Clone, Copy)] +pub enum XY { + X, + Y, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "PascalCase")] +struct Vector { + x: i16, + y: i16, + z: i16, +} #[derive(Clone, Debug)] -pub struct Weaver<'a> { +pub struct Weaver { pub data: Tour, - verts: &'a Verts, lead: bool, min_xyz: Point, order: u32, } -impl<'a> Weaver<'a> { - pub fn new( - mut data: YarnEnds, - verts: &'a Verts, - lead: bool, - min_xyz: Point, - ) -> Weaver<'a> { +impl Weaver { + pub fn new(mut data: YarnEnds, lead: bool, min_xyz: Point, order: u32) -> Weaver { + let mut preallocated = Vec::with_capacity(order as usize); + preallocated.extend(data.drain(..)); Weaver { - data: data.drain(..).collect(), - verts, + data: preallocated, lead, min_xyz, - order: verts.len() as u32, + order, } } @@ -65,28 +86,19 @@ impl<'a> Weaver<'a> { .iter() .circular_tuple_windows() .map(|(a, b)| orient(*a, *b)) - .filter(|&(m, n)| { - is_valid_edge( - self.verts[m as usize], - self.verts[n as usize], - self.min_xyz, - self.order, - false, - ) - }) + .filter(|&(m, n)| is_valid_edge(m, n, self.min_xyz, self.order, false)) .collect() } - pub fn join(&mut self, edge: Edge, wedge: Edge, warp: &mut Tour) { - self.rotated_to_edge(edge); - Weaver::rotate_to_edge(warp, wedge); - self.data.append(warp); - } - - pub fn rotated_to_edge(&mut self, (lhs, rhs): (u32, u32)) { + pub fn rotated_to_edge(&mut self, (lhs, rhs): ([i16; 3], [i16; 3])) { + // more prudent than using splice() which has preferences for optimality: + // The tail (elements in the vector after range) is empty, + // or replace_with yields fewer or equal elements than range’s length + // or the lower bound of its size_hint() is exact. blah blah blah. + // More steps to fulfill optimality than just doing what's correct. if lhs == self.data[self.data.len() - 1] && rhs == self.data[0] { self.data.reverse(); - } else { + } else if !(lhs == self.data[0] && rhs == self.data[self.data.len() - 1]) { match ( self.data.iter().position(|&x| x == lhs).unwrap(), self.data.iter().position(|&x| x == rhs).unwrap(), @@ -100,19 +112,19 @@ impl<'a> Weaver<'a> { } } - pub fn rotate_to_edge(other: &mut Tour, (lhs, rhs): (u32, u32)) { - if lhs == other[other.len() - 1] && rhs == other[0] { - other.reverse(); - } else { + pub fn rotate_to_edge(cycle: &mut Tour, (lhs, rhs): ([i16; 3], [i16; 3])) { + if lhs == cycle[cycle.len() - 1] && rhs == cycle[0] { + cycle.reverse(); + } else if !(lhs == cycle[0] && rhs == cycle[cycle.len() - 1]) { match ( - other.iter().position(|&x| x == lhs).unwrap(), - other.iter().position(|&x| x == rhs).unwrap(), + cycle.iter().position(|&x| x == lhs).unwrap(), + cycle.iter().position(|&x| x == rhs).unwrap(), ) { (idx_lhs, idx_rhs) if idx_lhs < idx_rhs => { - other.rotate_left(idx_rhs); - other.reverse() + cycle.rotate_left(idx_rhs); + cycle.reverse() } - (idx_lhs, _) => other.rotate_left(idx_lhs), + (idx_lhs, _) => cycle.rotate_left(idx_lhs), } } } @@ -122,27 +134,43 @@ impl<'a> Weaver<'a> { .iter() .circular_tuple_windows() .map(|(a, b)| orient(*a, *b)) - .filter(|&(m, n)| { - is_valid_edge( - self.verts[m as usize], - self.verts[n as usize], - self.min_xyz, - self.order, - self.lead, - ) - }) + .filter(|&(m, n)| is_valid_edge(m, n, self.min_xyz, self.order, self.lead)) .collect() } - pub fn get_nodes(&self) -> Solution { + pub fn get_weave(&self) -> Solution { self.data.to_vec() } - pub fn get_vectors(&self) -> VecVert { - self.data - .to_vec() - .iter() - .map(|node| self.verts[*node as usize]) - .collect() + /// Python script using plotly and pandas to display the solution from the .csv file produced by the function below: + ///``` + /// import pandas as pd + /// import plotly.express as px + /// + /// def create_3d_line_plot(file_path): + /// df = pd.read_csv(file_path) + /// fig = px.line_3d(df, x='X', y='Y', z='Z') + /// fig.show() + /// + ///``` + /// Save solution to file_path as a csv file where each axis X, Y, Z is a separate column. + /// Structured for easy read and plotting using python and plotly (see above). + pub fn save_to_csv(&self, file_path: &str) -> Result<(), Box> { + let file = std::fs::File::create(file_path)?; + let mut writer = csv::Writer::from_writer(file); + self.data.iter().for_each(|[x, y, z]| { + writer + .serialize(Vector { + x: *x, + y: *y, + z: *z, + }) + .ok(); + }); + // Add first value to last to form a loop: + let [x, y, z] = self.data[0]; + writer.serialize(Vector { x, y, z })?; + writer.flush()?; + Ok(()) } } diff --git a/src/graph/utils.rs b/src/graph/utils.rs index 73cdef7..3410675 100644 --- a/src/graph/utils.rs +++ b/src/graph/utils.rs @@ -2,157 +2,134 @@ use itertools; use itertools::Itertools; use ndarray::{arr2, Array2}; use rayon; -use std::fmt; +use std; use super::defs::{ - Adjacency, Edge, Edges, Neighbors, Node, Nodes, Point, Points, SignedIdx, Solution, VIMap, - VecVert, Vert, Verts, ZAdjacency, ZOrder, ZlevelNodesMap, + Adjacency, Edge, Edges, Neighbors, Point, SignedIdx, Solution, Vert, Verts, ZAdjacency, ZOrder, }; pub mod make { use super::{ arr2, - info::{absumv, get_max_xyz, get_order_from_n}, + info::{absumv, absumv2dc, get_max_xyz, get_order_from_n}, itertools::{iproduct, Itertools}, - modify::shift_xyz, + modify::{shift_xy, shift_xyz}, rayon::prelude::*, - shrink::shrink_adjacency, - Adjacency, Neighbors, Node, Point, VIMap, VecVert, Verts, ZAdjacency, ZOrder, + std::iter::zip, + Adjacency, Neighbors, Point, Verts, ZAdjacency, ZOrder, }; - pub fn make_graph(n: u32) -> (u32, u32, VecVert, VIMap, Adjacency, ZAdjacency, ZOrder, i16) { + pub fn make_z_graph(n: u32) -> (u32, u32, ZAdjacency, ZOrder, i16) { let order = get_order_from_n(n); let max_xyz = get_max_xyz(order) as i16; - let verts: VecVert = vertices(max_xyz); - let vi_map: VIMap = vi_map(&verts); - let adj: Adjacency = adjacency_map(&verts, max_xyz + 2, &vi_map); - let (z_adj, z_order) = shrink_adjacency(&verts, &adj); - (n, order, verts, vi_map, adj, z_adj, z_order, max_xyz - 4) + let (z_adj, z_order) = make_xs_adjacency(n as usize, max_xyz); + (n, order, z_adj, z_order, max_xyz - 4) } - pub fn vertices(max_xyz: Point) -> VecVert { - let max_xyz_plus_4 = max_xyz + 4; - iproduct!( - (-max_xyz..=max_xyz).step_by(2), - (-max_xyz..=max_xyz).step_by(2), - (-max_xyz..=max_xyz).step_by(2) - ) - .filter(|&vert| absumv(vert) < max_xyz_plus_4) - .sorted_by_key(|&vert| (absumv(vert), vert.0, vert.1)) - .collect::() + pub fn make_xs_graph(n: u32) -> (u32, u32, ZOrder, i16) { + let order = get_order_from_n(n); + let max_xyz = get_max_xyz(order) as i16; + let z_order = get_zlevel_order(n as usize); + (n, order, z_order, max_xyz - 4) } - fn vi_map(verts: &Verts) -> VIMap { - verts - .par_iter() - .enumerate() - .map(|(idx, vert)| (*vert, idx as Node)) - .collect() + fn make_xs_adjacency(n: usize, max_xyz: i16) -> (ZAdjacency, ZOrder) { + let adj = make_z_adjacency_map(max_xyz); + (adj, get_zlevel_order(n)) } - fn adjacency_map(verts: &Verts, max_xyz_plus_2: Point, vi_map: &VIMap) -> Adjacency { + pub fn make_z_adjacency_map(max_xyz: Point) -> ZAdjacency { + let max_xyz_plus_1 = max_xyz + 1; + let verts = vertices_for_z_adjacency(max_xyz); verts .par_iter() - .enumerate() - .map(|(idx, (x, y, z))| { - let ix = idx as Node; + .map(|vert| { ( - ix, - shift_xyz(arr2(&[[*x, *y, *z]])) + *vert, + shift_xy(arr2(&[*vert])) .into_iter() - .filter_map(|new_neighbor_vert| match vi_map.get(&new_neighbor_vert) { - Some(&node) - if node != ix && absumv(new_neighbor_vert) <= max_xyz_plus_2 => - { - Some(node) - } - _ => None, - }) - .collect::(), + .filter(|neigh| *neigh != *vert && absumv2dc(*neigh) <= max_xyz_plus_1) + .collect_vec(), ) }) .collect() } -} -pub mod shrink { - use crate::graph::defs::ZAdjacency; + fn vertices_for_z_adjacency(max_xyz: Point) -> Vec<[i16; 2]> { + let max_xyz_plus_1 = max_xyz + 1; + iproduct!( + (-max_xyz..=max_xyz).step_by(2), + (-max_xyz..=max_xyz).step_by(2) + ) + .filter(|&(x, y)| absumv2dc([x, y]) <= max_xyz_plus_1) + .sorted_by_key(|&(x, y)| (absumv2dc([x, y]), x, y)) + .map(|(x, y)| [x, y]) + .collect::>() + } + + fn get_zlevel_order(n: usize) -> Vec<(i16, usize)> { + zip( + (-((n * 2 - 1) as i16)..=-1).step_by(2), + (1..=n).map(|_n| 2 * _n * (_n + 1)), + ) + .collect() + } - use super::{Adjacency, Itertools, Nodes, Point, Points, Verts, ZOrder, ZlevelNodesMap}; + pub fn make_adjacency(n: u32) -> Adjacency { + let order = get_order_from_n(n); + let max_xyz = get_max_xyz(order) as i16; + let verts: Vec<[i16; 3]> = vertices(max_xyz); + adjacency_map(&verts, max_xyz + 2) + } - pub fn shrink_adjacency(verts: &Verts, adj: &Adjacency) -> (ZAdjacency, ZOrder) { - let stratified: ZlevelNodesMap = stratify_nodes(verts); - ( - filter_adjacency(adj, verts, stratified[&(-1 as Point)].clone()), - get_zlevel_order(&stratified), + fn vertices(max_xyz: Point) -> Vec<[i16; 3]> { + let max_xyz_plus_4 = max_xyz + 4; + iproduct!( + (-max_xyz..=max_xyz).step_by(2), + (-max_xyz..=max_xyz).step_by(2), + (-max_xyz..=max_xyz).step_by(2) ) + .filter_map(|(x, y, z)| { + if absumv([x, y, z]) < max_xyz_plus_4 { + Some([x, y, z]) + } else { + None + } + }) + .sorted_by_key(|&vert| (absumv(vert), vert[0], vert[1])) + .collect::>() } - fn stratify_nodes(verts: &Verts) -> ZlevelNodesMap { + fn adjacency_map(verts: &Verts, max_xyz_plus_2: Point) -> Adjacency { verts - .iter() - .filter_map(|&(_, _, z)| match z < 0 { - true => Some(z), - false => None, - }) - .collect::() - .into_iter() - .map(|z| { + .par_iter() + .map(|vert| { ( - z, - verts - .iter() - .enumerate() - .filter_map(|(i, v)| match v.2 as Point == z { - true => Some(i as u32), - false => None, + *vert, + shift_xyz(arr2(&[*vert])) + .into_iter() + .filter(|new_neighbor_vert| { + *vert != *new_neighbor_vert + && absumv(*new_neighbor_vert) <= max_xyz_plus_2 }) - .collect::(), + .collect::(), ) }) .collect() } - - fn filter_adjacency(adj: &Adjacency, verts: &Verts, nodes: Nodes) -> ZAdjacency { - adj.iter() - .filter_map(|(k, v)| match nodes.contains(k) { - true => Some(( - { - let (x, y, _) = verts[*k as usize]; - [x, y] - }, - v.intersection(&nodes) - .map(|node| { - let (x, y, _) = verts[*node as usize]; - [x, y] - }) - .collect(), - )), - false => None, - }) - .collect() - } - - fn get_zlevel_order(stratified: &ZlevelNodesMap) -> ZOrder { - stratified - .iter() - .map(|(&level, nodes)| (level, nodes.len())) - .sorted_by_key(|&(level, _)| level) - .collect() - } } pub mod modify { - use super::{arr2, Array2, Point, VecVert}; + use super::{arr2, Array2, Point}; - pub fn orient(m: u32, n: u32) -> (u32, u32) { + pub fn orient(m: [i16; 3], n: [i16; 3]) -> ([i16; 3], [i16; 3]) { match m < n { true => (m, n), false => (n, m), } } - pub fn shift_xyz(vert: Array2) -> VecVert { + pub fn shift_xyz(vert: Array2) -> Vec<[i16; 3]> { (vert + arr2(&[ [2, 0, 0], @@ -163,21 +140,40 @@ pub mod modify { [0, 0, -2], ])) .outer_iter() - .map(|point| (point[0], point[1], point[2])) + .map(|point| [point[0], point[1], point[2]]) .collect() } + + pub fn shift_xy(vert: Array2) -> Vec<[i16; 2]> { + (vert + arr2(&[[2, 0], [-2, 0], [0, 2], [0, -2]])) + .outer_iter() + .map(|point| [point[0], point[1]]) + .collect() + } + + pub fn add_points2d([x, y]: [i16; 2], [a, b]: [i16; 2]) -> [i16; 2] { + [x + a, y + b] + } } pub mod info { + use ndarray::Array1; + use super::{Point, SignedIdx, Vert}; + pub fn are_adj([a, b, c]: [i16; 3], [x, y, z]: [i16; 3]) -> bool { + let n = a - x + b - y + c - z; + let mask = n >> 15; + (n + mask) ^ mask == 2 + } + pub fn axis2d((x, y, _): &Vert, (a, b, _): &Vert) -> usize { (0..2) .find(|&i| [x, y][i] != [a, b][i]) .expect("Something's wrong, the same verts are being compared.") } - pub fn absumv2d((x, y, _): Vert) -> i16 { + pub fn absumv2dx((x, y, _): Vert) -> i16 { let abs_sum = [x, y].iter().fold(0, |acc, x| { let mask = x >> 15; acc + (x ^ mask) - mask @@ -186,28 +182,73 @@ pub mod info { (abs_sum ^ sign_bit) - sign_bit } - pub fn absumv2dc(vert: [i16; 2]) -> i16 { - let abs_sum = vert.iter().fold(0, |acc, x| { - let mask = x >> 15; - acc + (x ^ mask) - mask - }); - let sign_bit = abs_sum >> 15; - (abs_sum ^ sign_bit) - sign_bit + pub fn absumv2d((x, y, _): Vert) -> i16 { + [x, y] + .iter() + .map(|v| { + let mask = v >> 15; + (v ^ mask) - mask + }) + .sum() } - pub fn absumv((x, y, z): Vert) -> Point { - let abs_sum = [x, y, z].iter().fold(0, |acc, x| { + pub fn absumv3d((x, y, z): Vert) -> i16 { + [x, y, z] + .iter() + .map(|v| { + let mask = v >> 15; + (v ^ mask) - mask + }) + .sum() + } + + pub fn absumv2dc([x, y]: [i16; 2]) -> i16 { + ((x ^ (x >> 15)) - (x >> 15)) + ((y ^ (y >> 15)) - (y >> 15)) + } + + /// mask = v >> 15, r = (v ^ mask) - mask; + pub fn absumv2dc2(vert: [i16; 2]) -> i16 { + vert.iter() + .map(|v| { + let mask = v >> 15; + (v ^ mask) - mask + }) + .sum() + } + + pub fn absumv2dc6(vert: [i16; 2]) -> i16 { + vert.iter().fold(0, |acc, x| { let mask = x >> 15; acc + (x ^ mask) - mask - }); - let sign_bit = abs_sum >> 15; - (abs_sum ^ sign_bit) - sign_bit + }) + } + + pub fn absumvar(vect: &Array1) -> i16 { + vect.iter() + .map(|v| { + let mask = v >> 15; + (v ^ mask) - mask + }) + .sum() + } + + pub fn absumv(vert: [i16; 3]) -> Point { + vert.iter() + .map(|v| { + let mask = v >> 15; + (v ^ mask) - mask + }) + .sum() } pub fn get_max_xyz(order: u32) -> SignedIdx { (get_n_from_order(order) * 2 - 1) as i32 } + pub fn get_max_xyz_from_n(n: u32) -> SignedIdx { + (n * 2 - 1) as i32 + } + pub fn get_order_from_n(n: u32) -> u32 { ((4.0 / 3.0) * ((n + 2) * (n + 1) * n) as f64).round() as u32 } @@ -215,6 +256,14 @@ pub mod info { pub fn get_n_from_order(order: u32) -> u32 { (((3.0 / 4.0) * order as f64).powf(1.0 / 3.0) - 2.0 / 3.0).round() as u32 } + + pub fn get_color_index(z: i16) -> u32 { + (z % 4 + 4).try_into().unwrap() + } + + pub fn get_zlen(n: usize) -> usize { + 2 * n * (n + 1) + } } pub mod iters { @@ -235,9 +284,15 @@ pub mod iters { } pub mod check_edge { - use super::{Point, Vert}; - - pub fn is_valid_edge(v1: Vert, v2: Vert, min_xyz: Point, order: u32, lead: bool) -> bool { + use super::Point; + + pub fn is_valid_edge( + v1: [i16; 3], + v2: [i16; 3], + min_xyz: Point, + order: u32, + lead: bool, + ) -> bool { if order < 160 { return valid_edge(v1, v2); } @@ -247,11 +302,11 @@ pub mod check_edge { } } - pub fn valid_edge((x1, y1, _): Vert, (x2, y2, _): Vert) -> bool { + pub fn valid_edge([x1, y1, _]: [i16; 3], [x2, y2, _]: [i16; 3]) -> bool { matches!(x1 + y1 + x2 + y2, 4..=10) } - pub fn valid_main_edge((x, y, z): Vert, (x2, y2, z2): Vert, min_xyz: Point) -> bool { + pub fn valid_main_edge([x, y, z]: [i16; 3], [x2, y2, z2]: [i16; 3], min_xyz: Point) -> bool { if z.abs() == min_xyz && min_xyz == z2.abs() { (x == 1 || x == 3) && y == y2 && y2 == 1 && (x2 == 1 || x2 == 3) } else { @@ -259,7 +314,7 @@ pub mod check_edge { } } - pub fn valid_other_edge((x, y, z): Vert, (x2, y2, z2): Vert, min_xyz: Point) -> bool { + pub fn valid_other_edge([x, y, z]: [i16; 3], [x2, y2, z2]: [i16; 3], min_xyz: Point) -> bool { if z.abs() == min_xyz && min_xyz == z2.abs() { (x == 1 || x == 3) && y == y2 && y2 == 3 && (x2 == 1 || x2 == 3) } else { @@ -269,10 +324,10 @@ pub mod check_edge { } pub mod make_edges_eadjs { - use super::{Edge, Edges, VIMap, Vert}; + use super::{Edge, Edges}; use rayon::prelude::*; - pub fn make_eadjs((a, b, c): Vert, (x, y, z): Vert, min_xyz: i16, vi_map: &VIMap) -> Edges { + pub fn make_eadjs([a, b, c]: [i16; 3], [x, y, z]: [i16; 3], min_xyz: i16) -> Edges { match (a != x, b != y, c != z) { (true, false, false) => [[0, 2, 0], [0, -2, 0], [0, 0, 2], [0, 0, -2]], (false, true, false) => [[2, 0, 0], [-2, 0, 0], [0, 0, 2], [0, 0, -2]], @@ -281,17 +336,12 @@ pub mod make_edges_eadjs { } .par_iter() .filter_map(|[i, j, k]| { - get_valid_eadj( - (a + i, b + j, c + k), - (x + i, y + j, z + k), - min_xyz, - vi_map, - ) + get_valid_eadj([a + i, b + j, c + k], [x + i, y + j, z + k], min_xyz) }) .collect() } - pub fn make_edges((a, b, c): Vert, (x, y, z): Vert, min_xyz: i16, vi_map: &VIMap) -> Edges { + pub fn make_edges([a, b, c]: [i16; 3], [x, y, z]: [i16; 3], min_xyz: i16) -> Edges { match (a != x, b != y, c != z) { (true, false, false) => [[0, 2, 0], [0, -2, 0], [0, 0, 2], [0, 0, -2]], (false, true, false) => [[2, 0, 0], [-2, 0, 0], [0, 0, 2], [0, 0, -2]], @@ -300,22 +350,12 @@ pub mod make_edges_eadjs { } .par_iter() .filter_map(|[i, j, k]| { - get_valid_edge( - (a + i, b + j, c + k), - (x + i, y + j, z + k), - min_xyz, - vi_map, - ) + get_valid_edge([a + i, b + j, c + k], [x + i, y + j, z + k], min_xyz) }) .collect() } - pub fn get_valid_edge( - (x, y, z): Vert, - (a, b, c): Vert, - min_xyz: i16, - vi_map: &VIMap, - ) -> Option { + pub fn get_valid_edge([x, y, z]: [i16; 3], [a, b, c]: [i16; 3], min_xyz: i16) -> Option { match z.abs() == min_xyz && min_xyz == c.abs() && (x == 1 || x == 3) @@ -324,17 +364,12 @@ pub mod make_edges_eadjs { && (a == 1 || a == 3) || x == a && a == 1 && y == b && b == 1 { - true => Some((vi_map[&(x, y, z)], vi_map[&(a, b, c)])), + true => Some(([x, y, z], [a, b, c])), false => None, } } - pub fn get_valid_eadj( - (x, y, z): Vert, - (a, b, c): Vert, - min_xyz: i16, - vi_map: &VIMap, - ) -> Option { + pub fn get_valid_eadj([x, y, z]: [i16; 3], [a, b, c]: [i16; 3], min_xyz: i16) -> Option { match z.abs() == min_xyz && min_xyz == c.abs() && (x == 1 || x == 3) @@ -343,14 +378,16 @@ pub mod make_edges_eadjs { && (a == 1 || a == 3) || x == a && a == 3 && y == b && b == 1 { - true => Some((vi_map[&(x, y, z)], vi_map[&(a, b, c)])), + true => Some(([x, y, z], [a, b, c])), false => None, } } } pub mod certify { - use super::{fmt, Adjacency, Itertools, Solution}; + use itertools::all; + + use super::{info::absumv, std::fmt, Adjacency, Itertools, Solution}; #[derive(Debug, PartialEq)] pub enum SequenceID { @@ -382,28 +419,76 @@ pub mod certify { false => SequenceID::Broken, } } + + pub fn is_hamiltonian_circuit(seq: &Solution, order: usize, max_xyz_plus_4: i16) -> SequenceID { + if seq.iter().duplicates().count() > 0 + || seq.len() != order + || !all(seq.iter(), |[x, y, z]| (x & 1) + (y & 1) + (z & 1) == 3) + || !all(seq.iter(), |vert| absumv(*vert) < max_xyz_plus_4) + || seq + .iter() + .fold((0, 0, 0), |acc: (i16, i16, i16), &[x, y, z]| { + (acc.0 + x, acc.1 + y, acc.2 + z) + }) + != (0, 0, 0) + { + return SequenceID::Broken; + } + SequenceID::HamCycle + } } -pub mod translate { - use super::{Adjacency, Verts, ZAdjacency}; +pub mod csv_out { + use serde::Serialize; + use std::error::Error; - pub fn adj_to_adjvc(adj: &Adjacency, verts: &Verts) -> ZAdjacency { - // turn every key and every value in value into a [Point;2] - adj.iter() - .map(|(k, val)| { - ( - { - let (x, y, _) = verts[*k as usize]; - [x, y] - }, - val.iter() - .map(|node| { - let (x, y, _) = verts[*node as usize]; - [x, y] - }) - .collect::>(), - ) - }) - .collect() + #[derive(Debug, Serialize, serde::Deserialize)] + #[serde(rename_all = "PascalCase")] + struct Vector { + x: i16, + y: i16, + z: i16, + } + + pub fn vector_to_csv(data: Vec<[i16; 3]>, file_path: &str) -> Result<(), Box> { + let file = std::fs::File::create(file_path)?; + let mut writer = csv::Writer::from_writer(file); + data.iter().for_each(|[x, y, z]| { + writer + .serialize(Vector { + x: *x, + y: *y, + z: *z, + }) + .ok(); + }); + writer.flush()?; + Ok(()) + } +} + +pub mod debug { + use chrono::{Datelike, Local, Timelike}; + use std::fmt; + + struct DateTimeString(String); + + impl fmt::Display for DateTimeString { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } + } + + pub fn get_current_date_time() -> String { + let now = Local::now(); + format!( + "📅 {:02}/{:02}/{:02} ⌚ {:02}:{:02}:{:02}", + now.day(), + now.month(), + now.year() % 100, + now.hour(), + now.minute(), + now.second() + ) } } diff --git a/src/graph/weave.rs b/src/graph/weave.rs index afabd4f..5beb3c0 100644 --- a/src/graph/weave.rs +++ b/src/graph/weave.rs @@ -1,30 +1,25 @@ -use std::collections::{HashMap, VecDeque}; - use itertools::Itertools; -use ndarray::{arr2, Array2}; +use ndarray::{arr2, array, s, Array2, Axis, Slice}; use rayon::prelude::*; +use std::{collections::HashMap, iter::once}; use super::{ defs::{ - Adjacency, Bobbins, Count, Loom, Point, Solution, Spool, Subtours, Tour, TourSliceThick, - VIMap, Vert, Verts, Warps, Weaver, Yarn, ZAdjacency, ZOrder, + Bobbins, Count, Loom, LoomSlice, Point, Solution, Spindle, Spool, Spun, Tour, Var2, Warps, + Weaver, Yarn, YarnEnds, ZOrder, DISP_VECTORS, XY, }, utils::{ - info::absumv2dc, + info::{absumv2dc, are_adj, get_color_index, get_zlen}, + make::make_z_adjacency_map, make_edges_eadjs::{make_eadjs, make_edges}, + modify::add_points2d, }, }; -pub fn weave( - adj: &Adjacency, - vi_map: VIMap, - verts: &Verts, - z_adj: ZAdjacency, - z_order: ZOrder, - min_xyz: Point, -) -> Solution { - let mut loom = wrap_and_reflect_loom(&vi_map, verts, z_adj, z_order); - let mut weaver: Weaver = Weaver::new(loom[0].split_off(0), verts, true, min_xyz); +pub fn weave(n: usize, z_order: ZOrder, min_xyz: Point, order: u32) -> Solution { + let max_xyz = min_xyz + 4; + let mut loom = wrap_and_reflect_loom(n, max_xyz, z_order); + let mut weaver: Weaver = Weaver::new(loom[0].split_off(0), true, min_xyz, order); let mut loom = loom .split_off(1) .into_iter() @@ -35,121 +30,180 @@ pub fn weave( if let Some((m, n)) = (&weaver.edges() & &warp_edges .iter() - .flat_map(|(m, n)| { - make_edges(verts[*m as usize], verts[*n as usize], min_xyz, &vi_map) - }) + .flat_map(|(m, n)| make_edges(*m, *n, min_xyz)) .collect()) .into_iter() .next() { - if let Some((o, p)) = - (&make_eadjs(verts[m as usize], verts[n as usize], min_xyz, &vi_map) & &warp_edges) - .into_iter() - .next() + if let Some((j, k)) = (&make_eadjs(m, n, min_xyz) & &warp_edges) + .into_iter() + .next() { - weaver.join((m, n), if adj[&n].contains(&o){(o, p)} else {(p, o)}, warp); + weaver.rotated_to_edge((m, n)); + Weaver::rotate_to_edge( + warp, + match are_adj(n, j) { + true => (j, k), + false => (k, j), + }, + ); + weaver.data.append(warp); } } }); - weaver.get_nodes() + weaver.get_weave() } -fn wrap_and_reflect_loom(vi_map: &VIMap, verts: &Verts, z_adj: ZAdjacency, z_order: ZOrder) -> Loom { - let spool: Spool = spin_and_color_yarn(z_adj); - let mut bobbins: Bobbins = Vec::new(); - let mut loom: Loom = Loom::new(); +fn wrap_and_reflect_loom(n: usize, max_xyz: i16, z_order: ZOrder) -> Loom { + let zlen = get_zlen(n); + // let spool: Spool = spin_and_color_yarn_a(n, max_xyz, zlen); + let spool: Spool = spin_and_color_yarn_s(n, max_xyz, zlen); + // let spool: Spool = spin_and_color_yarn_n(n, max_xyz, zlen); + let mut bobbins: Bobbins = Bobbins::with_capacity(n); + let mut loom: Loom = Loom::with_capacity((n / 2) + 1); for (z, length) in z_order { - wrap_warps_onto_loom(get_warps(z, length, &bobbins, &spool, vi_map), &mut loom); + wrap_warps_onto_loom(get_warps(z, length, &bobbins, &spool), &mut loom); if z != -1 { - bobbins = pin_ends(&mut loom, verts, vi_map); + bobbins = pin_ends(&mut loom); } } + // MIRROR OTHER HALF loom.par_iter_mut().for_each(|thread| { thread.extend( thread .iter() .rev() - .map(|&node| { - let (x, y, z) = verts[node as usize]; - vi_map[&(x, y, -z)] - }) + .map(|&[x, y, z]| [x, y, -z]) .collect::(), ) }); loom } -fn spin_and_color_yarn(z_adj: ZAdjacency) -> Spool { - let order_z = z_adj.len(); - let spindle: &mut Vec<[i16; 2]> = &mut Vec::with_capacity(order_z); - let start: [i16; 2] = *z_adj.keys().max().unwrap(); - let mut visited: HashMap<[i16; 2], bool> = HashMap::with_capacity(order_z); - visited.insert(start, true); +pub fn spin_and_color_yarn_a(_n: usize, max_xyz: i16, zlen: usize) -> Spool { + let z_adj = make_z_adjacency_map(max_xyz); + let spindle: &mut Spindle = &mut Spindle::with_capacity(zlen); + let start: Var2 = *z_adj.keys().max().unwrap(); + let mut spun: Spun = Spun::with_capacity(zlen); spindle.push(start); - let tail = order_z - 5; - (1..order_z).for_each(|idx| { - let next_fiber = get_unspun(spindle, &z_adj, idx, tail, &mut visited); - spindle.push(next_fiber); - visited.insert(next_fiber, true); + spun.insert(start, true); + let tail = zlen - 5; + (1..zlen).for_each(|ix| { + let [x, y] = *spindle.last().unwrap(); + let unspun = *z_adj[&[x, y]] + .iter() + .filter_map(|node| match (spun.get(node), *node) { + (Some(true), _) => None, + (None, fiber) + if ix < tail || (spindle[spindle.len() - 2][0] == x) != (x == fiber[0]) => + { + Some((node, absumv2dc(fiber))) + } + _ => None, + }) + .max_by_key(|&(_, absumv)| absumv) + .unwrap() + .0; + spindle.push(unspun); + spun.insert(unspun, true); }); - let natur: Yarn = Array2::from(spindle.drain(..).collect::>()); - let color: Yarn = natur.dot(&arr2(&[[-1, 0], [0, -1]])) + arr2(&[[0, 2]]); - Spool::from([(3, natur), (1, color)]) + let blue: Yarn = Yarn::from(spindle.drain(..).collect::>()); + let red: Yarn = blue.dot(&arr2(&[[-1, 0], [0, -1]])) + arr2(&[[0, 2]]); + Spool::from([(3, blue), (1, red)]) } -fn get_unspun( - spindle: TourSliceThick, - z_adj: &ZAdjacency, - idx: usize, - tail: usize, - visited: &mut HashMap<[i16; 2], bool>, -) -> [i16; 2] { - let [x, y] = *spindle.last().unwrap(); - *z_adj[&[x, y]] - .iter() - .filter_map(|node| match (visited.get(node), *node) { - (Some(true), _) => None, - (None, [m, n]) if idx < tail || (spindle[spindle.len() - 2][0] == x) != (x == m) => { - Some((node, absumv2dc([m, n]))) - } - _ => None, +/// Newer version of spin creates the path as a zigzag and then rotates it according to its index position +/// like taking a long strip of paper and folding it 90 degrees inwards to form a square that turns inward. +/// probably more aptly named fold zigzag than spin bit folding in is a kind of spinning abeit a bit angular, like having square wheels. +pub fn spin_and_color_yarn_n(n: usize, max_xyz: i16, zlen: usize) -> Spool { + let bv: Vec<_> = vec![array![0, -2], array![-2, 0]]; + let mut cycled_bv = bv.iter().cycle(); + let mut blue: Array2 = Array2::from_shape_vec( + (zlen, 2), + once(array![max_xyz, 1]) + .chain((0..zlen - 1).scan(array![max_xyz, 1], |state, _| { + *state += cycled_bv.next().unwrap(); + Some(state.clone()) + })) + .flatten() + .collect(), + ) + .unwrap(); + let mut xyxy = [XY::X, XY::Y].iter().cycle(); + for idx in (-(n as i64 * 2)..=-2) + .step_by(2) + .flat_map(|cut| [-cut as usize, -cut as usize]) + .scan(0, |state, n| { + *state += n; + Some(*state - 1) }) - .max_by_key(|&(_, absumv)| absumv) - .unwrap() - .0 + .collect::>() + { + let rotation_point = blue.row(idx as usize).to_owned(); + let mut slice_points = blue.slice_mut(s![idx as usize.., ..]); + let mut points = slice_points.view_mut(); + points.assign( + &((points.to_owned() - &rotation_point).dot(&match *xyxy.next().unwrap() { + XY::X => arr2(&[[1, 0], [0, -1]]), + XY::Y => arr2(&[[-1, 0], [0, 1]]), + }) + &rotation_point), + ); + } + let red: Yarn = blue.dot(&arr2(&[[-1, 0], [0, -1]])) + arr2(&[[0, 2]]); + Spool::from([(3, blue), (1, red)]) +} + +/// older new spin function doesn't use adjacency. unfortunately still slower... +/// next refactoring involves using matrix operations to manipulate an already formed sequence, if it's any faster. (see above) +pub fn spin_and_color_yarn_s(_n: usize, max_xyz: i16, zlen: usize) -> Spool { + let max_absumv: i16 = max_xyz + 1; + let mut visited: HashMap<[i16; 2], bool> = HashMap::with_capacity(zlen); + let mut disp_cycler = DISP_VECTORS.iter().cycle(); + let y_x: [usize; 2] = [1, 0]; + let mut yxyx = y_x.iter().cycle(); + let mut spindle: Vec<[i16; 2]> = vec![[0, 0]; zlen]; + let start = [max_xyz, 1]; + spindle[0] = start; + visited.insert(start, true); + let mut inside = false; + let mut curr_disp = disp_cycler.next().unwrap(); + (0..zlen - 1).for_each(|i| { + let [x, y] = spindle[i]; + let yx = *yxyx.next().unwrap(); + let mut new_vect = add_points2d([x, y], curr_disp[yx]); + let is_visited = visited.get(&new_vect).is_some(); + inside = !inside && is_visited; + if is_visited || !inside && absumv2dc(new_vect) > max_absumv { + curr_disp = disp_cycler.next().unwrap(); + new_vect = add_points2d([x, y], curr_disp[yx]); + } + spindle[i + 1] = new_vect; + visited.insert(new_vect, true); + }); + let blue: Yarn = Yarn::from(spindle.drain(..).collect::>()); + let red: Yarn = blue.dot(&arr2(&[[-1, 0], [0, -1]])) + arr2(&[[0, 2]]); + Spool::from([(3, blue), (1, red)]) } -fn get_warps( - zlevel: Point, - length: Count, - bobbins: &Bobbins, - spool: &Spool, - vi_map: &VIMap, -) -> Warps { - let mut yarn = spool[&(zlevel % 4 + 4).try_into().unwrap()].clone(); - yarn.slice_axis_inplace( - ndarray::Axis(0), - ndarray::Slice::new( - (yarn.len_of(ndarray::Axis(0)) - length).try_into().unwrap(), - None, - 1, - ), - ); +fn get_warps(z: i16, length: Count, bobbins: &Tour, spool: &Spool) -> Warps { + let mut yarn = spool[&get_color_index(z)].clone(); + let start_pos: isize = (yarn.len_of(ndarray::Axis(0)) - length).try_into().unwrap(); + yarn.slice_axis_inplace(Axis(0), Slice::new(start_pos, None, 1)); match yarn .outer_iter() - .map(|row| vi_map[&(row[0], row[1], zlevel)]) - .collect() + .map(|row| [row[0], row[1], z]) + .collect::>() { - node_yarn if bobbins.is_empty() => vec![node_yarn], - node_yarn => cut_yarn(node_yarn, bobbins), + _yarn if bobbins.is_empty() => vec![_yarn], + _yarn => cut_yarn(_yarn, bobbins), } } -fn cut_yarn(yarn: Tour, cuts: &Bobbins) -> Subtours { - let mut subtours: Subtours = Vec::new(); +fn cut_yarn(yarn: Tour, cuts: &Tour) -> Warps { + let mut subtours: Warps = Vec::with_capacity(cuts.len() + 1); let last_ix: usize = yarn.len() - 1; let last_idx: usize = cuts.len() - 1; - let mut prev: i32 = -1_i32; + let mut prev = -1_i32; for (e, idx) in cuts .iter() .filter_map(|node| yarn.iter().position(|&x| x == *node)) @@ -175,52 +229,42 @@ fn cut_yarn(yarn: Tour, cuts: &Bobbins) -> Subtours { }); } } - } else { - if let Some(first_slice) = yarn.get(prev as usize + 1..=idx) { - if !first_slice.is_empty() { - subtours.push(if cuts.contains(&first_slice[0]) { - first_slice.to_vec() - } else { - first_slice.iter().rev().cloned().collect() - }); - } + } else if let Some(first_slice) = yarn.get(prev as usize + 1..=idx) { + if !first_slice.is_empty() { + subtours.push(if cuts.contains(&first_slice[0]) { + first_slice.to_vec() + } else { + first_slice.iter().rev().cloned().collect() + }); } - prev = idx as i32; } + prev = idx as i32; } subtours } -fn pin_ends(loom: &mut Loom, verts: &Verts, vi_map: &VIMap) -> Bobbins { +fn pin_ends(loom: &mut LoomSlice) -> Bobbins { loom.iter_mut() .flat_map(|thread| { - let (left, right) = get_upper_pins( - verts[thread[0] as usize], - verts[thread[thread.len() - 1] as usize], - vi_map, - ); - thread.push_front(left); - thread.push_back(right); - [left, right] + let [x, y, z] = thread[0]; + let [i, j, k] = thread[thread.len() - 1]; + let lhs = [x, y, z + 2]; + let rhs = [i, j, k + 2]; + thread.push_front(lhs); + thread.push_back(rhs); + [lhs, rhs] }) .collect() } -fn get_upper_pins((x, y, z): Vert, (x1, y1, z1): Vert, vi_map: &VIMap) -> (u32, u32) { - (vi_map[&(x, y, z + 2)], vi_map[&(x1, y1, z1 + 2)]) -} - fn wrap_warps_onto_loom(mut warps: Warps, loom: &mut Loom) { for thread in &mut *loom { for warp in warps.iter_mut().filter(|w| !w.is_empty()) { match (thread.front(), thread.back()) { - (Some(front), _) if *front == warp[0] => { - *thread = warp - .drain(..) - .rev() - .chain(std::mem::take(thread).drain(1..)) - .collect(); - } + (Some(front), _) if *front == warp[0] => warp + .drain(..) + .skip(1) + .for_each(|node| thread.push_front(node)), (_, Some(back)) if *back == warp[0] => { thread.extend(warp.drain(..).skip(1)); } @@ -229,6 +273,6 @@ fn wrap_warps_onto_loom(mut warps: Warps, loom: &mut Loom) { } } warps.iter_mut().filter(|s| !s.is_empty()).for_each(|seq| { - loom.append(&mut vec![seq.drain(..).collect::>()]); + loom.append(&mut vec![seq.drain(..).collect::()]); }); } diff --git a/src/main.rs b/src/main.rs index 0de1575..a88fde3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,10 @@ /// see n_order.txt for a list of n and the corresponding order: /// n: 100 = 1_373_600 vertices /// ``` -/// cargo run --release [N] [N_UPPER_INCLUSIVE] -/// cargo run --release 1 100 +/// cargo run --release [N] [N_UPPER_INCLUSIVE] [STEPS] +/// cargo run --release 1 100 2 +/// cargo run --release [N] [N_UPPER_INCLUSIVE] [STEPS] +/// cargo run --release 1 100 2 /// ``` /// builds binary under hamcycle/target/release/hamcycle /// runs binary: ./hamcycle/target/release/hamcycle @@ -10,83 +12,61 @@ /// creates the graph for that order and solves it, /// continues to the next orders up to the 100th which is an order with 1,373,600 vertices, /// makes graph, solves it -/// 1 (start with order 8 end at order 1,373,600) 100 +/// 1 (start with order 8 end at order 1,373,600) 100 in steps of two: [1, 3, 5, 7...] ///////////////////////////////////////////////////////////////////////////// +extern crate chrono; extern crate rayon; -use std::{env, time::Instant}; - pub mod graph; use graph::{ defs::*, - utils::certify::{self, SequenceID}, - utils::make::make_graph, + utils::certify::{is_hamiltonian_circuit, SequenceID}, + utils::make::make_xs_graph, weave, }; +use std::{env, time::Instant}; pub fn main() -> Result<(), &'static str> { let args: Vec = env::args().collect(); - let n_start: u32 = match args.get(1) { - Some(arg) => match arg.parse::() { - Ok(parsed) => { - if parsed == 0 { - 1 - } else { - parsed - } - } - Err(_) => 100, - }, - None => 100, - }; - let n_end: u32 = match args.get(2) { - Some(arg) => match arg.parse::() { - Ok(parsed) => { - if parsed < n_start { - n_start - } else { - parsed - } - } - Err(_) => n_start, - }, - None => n_start, - }; - for level in n_start..=n_end { + let n_start = args + .get(1) + .and_then(|arg| arg.parse().ok()) + .filter(|&parsed| parsed > 0) + .unwrap_or(100); + let n_end = args + .get(2) + .and_then(|arg| arg.parse().ok()) + .filter(|&parsed| parsed >= n_start) + .unwrap_or(n_start); + let steps = args.get(3).and_then(|arg| arg.parse().ok()).unwrap_or(1); + for level in (n_start..=n_end).step_by(steps) { find_solution(level, false)?; } Ok(()) } -pub fn find_solution(level: u32, certify: bool) -> Result { - println!("👷 MAKE GRAPH ➤ 🔀 SOLVE GRAPH ➤ 🔎 CERTIFY SOLUTION"); - - println!("🛠️ MAKING GRAPH...."); +pub fn find_solution(level: u32, _certify: bool) -> Result { let mut start: Instant = Instant::now(); - let (n, order, verts, vi_map, adj, z_adj, z_order, min_xyz) = make_graph(level); + let (n, order, z_order, min_xyz) = make_xs_graph(level); let dur_make = Instant::now() - start; - println!("MADE GRAPH: 🕗 {dur_make:?}. 🔀 SOLVING GRAPH ⭕️ {order}"); start = Instant::now(); - let solution = weave::weave(&adj, vi_map, &verts, z_adj, z_order, min_xyz); + let solution = weave::weave(n as usize, z_order, min_xyz, order); let dur_solve = Instant::now() - start; println!( - "| 🇳 {n:>4} | ⭕️ {order:>10} | 🕗 SOLVE: {} |", - dur_solve.as_secs_f32() + "| 🇳 {n:>4} | 🕗 MAKE: {} | ⭕️ {order:>10} | 🕗 SOLVE: {} | 📌 HamCycle", + dur_make.as_secs_f32(), + dur_solve.as_secs_f32(), ); - - if certify { - println!("🇳 {n:>4} FINISHED WEAVING. 🔎 CERTIFYING SOLUTION..."); - start = Instant::now(); - let seq_id = certify::id_seq(&solution, &adj); - let dur_certify = Instant::now() - start; - println!( + start = Instant::now(); + let seq_id = is_hamiltonian_circuit(&solution, order as usize, min_xyz + 8); + let dur_certify = Instant::now() - start; + println!( "| 🇳 {n:>4} | 🕗 MAKE: {} | ⭕️ {order:>10} | 🕗 SOLVE: {} | 📌 {seq_id:?} | 🕗 CERTIFY: {}", dur_make.as_secs_f32(), dur_solve.as_secs_f32(), dur_certify.as_secs_f32() - ); - assert_eq!(seq_id, SequenceID::HamCycle); - } + ); + assert_eq!(seq_id, SequenceID::HamCycle); Ok(solution) }