Add some more to the generalization sections.
This commit is contained in:
@@ -277,37 +277,136 @@ factor with 9; 3, 6, 9, 12, and so on. However, those can't all serve as cycle l
|
||||
cycles can't get longer than 9. This leaves us with 3, 6, and 9 as _possible_ cycle lengths,
|
||||
none of which are divisible by 4. We've eliminated the possibility of spirals!
|
||||
|
||||
{{< todo >}}
|
||||
This doesn't get to the bottom of it all.
|
||||
{{< /todo >}}
|
||||
|
||||
### Generalizing to Arbitrary Divisors
|
||||
The trick was easily executable on paper because there's an easy way to compute the remainder of a number
|
||||
when dividing by 9 (adding up the digits). However, we have a computer, and we don't need to fall back on such
|
||||
cool-but-complicated techniques. To replicate our original behavior, we can just write:
|
||||
|
||||
```
|
||||
```Ruby
|
||||
def sum_digits(n)
|
||||
x = n % 9
|
||||
x == 0 ? 9 : x
|
||||
end
|
||||
```
|
||||
|
||||
But now, we can change the `9` to something else. Any number we pick, so long as it isn't
|
||||
{{< sidenote "right" "div-4-note" "divisible by 4," >}}
|
||||
"Wait", you might be thinking, "I thought you said that 4 can't have a common factor with the divisor,
|
||||
and that means any even numbers are out, too."<br>
|
||||
<br>
|
||||
Good observation. Although the path-not-divisible-by-four condition is certainly sufficient, it is not
|
||||
<em>necessary</em>. There seems to be another, less restrictive, condition at play here: even numbers work fine. I haven't
|
||||
figured out what it is, but we might as well make use of it.
|
||||
{{< /sidenote >}} will work. I'll pick primes for good measure. Here are a few good ones from using 13
|
||||
But now, we can change the `9` to something else. There are some numbers we'd like to avoid - specifically,
|
||||
we want to avoid those numbers that would allow for cycles of length 4 (or of a length divisible by 4).
|
||||
If we didn't avoid them, we might run into infinite loops, where our pencil might end up moving
|
||||
further and further from the center.
|
||||
|
||||
Actually, let's revisit that. When we were playing with paths of length \\(k\\) while dividing by 9,
|
||||
we noted that the only _possible_ values of \\(k\\) are those that share a common factor with 9,
|
||||
specifically 3, 6 and 9. But that's not quite as strong as it could be: try as you might, but
|
||||
you will not find a cycle of length 6 when dividing by 9. The same is true if we pick 6 instead of 9,
|
||||
and try to find a cycle of length 4. Even though 4 _does_ have a common factor with 6, and thus
|
||||
is not ruled out as a valid cycle by our previous condition, we don't find any cycles of length 4.
|
||||
|
||||
So what is it that _really_ determines if there can be cycles or not?
|
||||
|
||||
Let's do some more playing around. What _are_ the actual cycle lengths when we divide by 9?
|
||||
For all but two numbers, the cycle lengths are 9. The two special numbers are 6 and 3, and they end up
|
||||
with a cycle length of 3. From this, we can say that the cycle length seems to depend on whether or
|
||||
nor our \\(n\\) has any common factors with the divisor.
|
||||
|
||||
Let's explore this some more with a different divisor, say 12. We fill find that 8 has a cycle length
|
||||
of 3, 7 has a cycle length of 12, 9 has a cycle length of 4. What's
|
||||
happening here? To see, let's divide 12 __by these cycle lengths__. For 8, we get (12/3) = 4.
|
||||
For 7, this works out to 1. For 9, it works out to 3. These new numbers, 4, 1, and 3, are actually
|
||||
the __greatest common factors__ of 8, 3, and 7 with 12, respectively. The greatest common factor
|
||||
of two numbers is the largest number that divides them both. We thus write down our guess
|
||||
for the length of a cycle:
|
||||
|
||||
{{< latex >}}
|
||||
k = \frac{d}{\text{gcd}(d,n)}
|
||||
{{< /latex >}}
|
||||
|
||||
Where \\(d\\) is our divisor, which has been 9 until just recently. Indeed, this equation is in agreement
|
||||
with our experiment for \\(d = 9\\), too. Why might this be? Let's start once again with
|
||||
our equation for paths of length \\(k\\):
|
||||
|
||||
{{< latex >}}
|
||||
kn \equiv 0\ (\text{mod}\ d)
|
||||
{{< /latex >}}
|
||||
|
||||
Here we've replaced 9 with \\(d\\), since we're trying to make it work for _any_ divisor, not just 9.
|
||||
Now, suppose the greatest common divisor of \\(n\\) and \\(d\\) is some number \\(f\\). Then,
|
||||
since this number divides \\(n\\) and \\(d\\), we can write \\(n=fm\\) for some \\(m\\), and
|
||||
\\(d=fg\\) for some \\(g\\). We can rewrite our equation as follows:
|
||||
|
||||
{{< latex >}}
|
||||
kfm \equiv 0\ (\text{mod}\ fg)
|
||||
{{< /latex >}}
|
||||
|
||||
We can simplify this a little bit. Recall that what this equation _really_ means is that the
|
||||
difference of \\(kfm\\) and \\(0\\), which is just \\(kfm\\) is divisible by \\(fg\\):
|
||||
|
||||
{{< latex >}}
|
||||
fg|kfm
|
||||
{{< /latex >}}
|
||||
|
||||
But if \\(fg\\) divides \\(kfm\\), it must be that \\(g\\) divides \\(km\\)! This, in turn, means
|
||||
we can write:
|
||||
|
||||
{{< latex >}}
|
||||
g|km
|
||||
{{< /latex >}}
|
||||
|
||||
We also know that \\(g\\) and \\(m\\) have no common factors -- they were all divided out from \\(d\\)
|
||||
and \\(n\\) when we divided by \\(f\\)! We can thus further simplify our claim:
|
||||
|
||||
{{< latex >}}
|
||||
g|k
|
||||
{{< /latex >}}
|
||||
|
||||
This says that \\(k\\) must be divisible by \\(g\\). Recall that we got \\(g\\) by dividing
|
||||
\\(d\\) by \\(f\\), which is our largest common factor -- aka \\(\\text{gcd}(d,n)\\). We can thus
|
||||
write:
|
||||
|
||||
{{< latex >}}
|
||||
\frac{d}{\text{gcd}(d,n)}|k
|
||||
{{< /latex >}}
|
||||
|
||||
All that's left is to pick the smallest \\(k\\) that fits this description (that would be the first
|
||||
point at which our sequence of multiples of \\(n\\) will loop). Zero is divisible by anything, but
|
||||
alas, our sequence numbers start at 1 -- zero's out. The next best thing is \\(d/\\text{gcd}(d,n)\\).
|
||||
And there we have it: the first point at which our sequence loops, just like we guessed.
|
||||
|
||||
Lastly, recall that a cycle occurs whenever a \\(k\\) is a multiple of 4. Now that we know what
|
||||
\\(k\\) is, we can restate this as "\\(d/\\text{gcd}(d,n)\\) is divisible by 4". But if we pick
|
||||
\\(n=d-1\\), the
|
||||
{{< sidenote "right" "coprime-note" "greatest common factor has to be \(1\)," >}}
|
||||
Wait, why is <em>this</em> true? Well, suppose some number \(f\) divides both \(d\) and \(d-1\).
|
||||
In that case, we can write \(d=af\), and \((d-1)=bf\). Subtracting one equation from the other:
|
||||
{{< latex >}}
|
||||
1 = (a-b)f
|
||||
{{< /latex >}}
|
||||
But this means that 1 is divisible by \(f\)! That's only possible if \(f=1\). Thus, the only
|
||||
number that divides \(x\) and \(x-1\) is 1; that's our greatest common factor.
|
||||
{{< /sidenote >}} which means that our condition further simplifies to
|
||||
"\\(d\\) is divisible by 4".
|
||||
Thus, we can state simply that any divisor divisible by 4 is off-limits, as it will induce loops.
|
||||
For example, pick \\(d=4\\). Running our algorithm for \\(n=d-1=3\\), we indeed find an infinite
|
||||
spiral:
|
||||
|
||||
{{< figure src="pattern_3_4.svg" caption="Spiral generated by the number 3 with divisor 4." class="tiny" alt="Spiral generated by the number 3 by summing digits." >}}
|
||||
|
||||
Let's try again. Pick \\(d=8\\); then, for \\(n=d-1=7\\), we also get a spiral:
|
||||
|
||||
{{< figure src="pattern_7_8.svg" caption="Spiral generated by the number 7 with divisor 8." class="tiny" alt="Spiral generated by the number 7 by summing digits." >}}
|
||||
|
||||
A poem comes to mind:
|
||||
> Turning and turning in the wydening gyre
|
||||
>
|
||||
> The falcon cannot hear the falconner;
|
||||
|
||||
Fortunately, there are plenty of numbers that are not divisible by four, and we can pick
|
||||
any of them! I'll pick primes for good measure. Here are a few good ones from using 13
|
||||
(which corresponds to summing digits of base-14 numbers):
|
||||
|
||||
{{< figure src="pattern_8_13.svg" caption="Pattern generated by the number 8 in base 14." class="tiny" alt="Pattern generated by the number 8 by summing digits." >}}
|
||||
{{< figure src="pattern_4_13.svg" caption="Pattern generated by the number 4 in base 14." class="tiny" alt="Pattern generated by the number 4 by summing digits." >}}
|
||||
|
||||
Here are a few from dividing by 17 (base-18 numbers).
|
||||
Here's one from dividing by 17 (base-18 numbers).
|
||||
|
||||
{{< figure src="pattern_5_17.svg" caption="Pattern generated by the number 5 in base 18." class="tiny" alt="Pattern generated by the number 5 by summing digits." >}}
|
||||
|
||||
@@ -316,3 +415,86 @@ Finally, base-30:
|
||||
{{< figure src="pattern_2_29.svg" caption="Pattern generated by the number 2 in base 30." class="tiny" alt="Pattern generated by the number 2 by summing digits." >}}
|
||||
|
||||
{{< figure src="pattern_6_29.svg" caption="Pattern generated by the number 6 in base 30." class="tiny" alt="Pattern generated by the number 6 by summing digits." >}}
|
||||
|
||||
### Generalizing to Arbitrary Numbers of Directions
|
||||
What if we didn't turn 90 degrees each time? What, if, instead, we turned 120 degrees (so that
|
||||
turning 3 times, not 4, would leave you facing the same direction you started)? We can pretty easily
|
||||
do that, too. Let's call this number of turns \\(c\\). Up until now, we had \\(c=4\\).
|
||||
|
||||
First, let's update our condition. Before, we had "\\(d\\) cannot be divisible by 4". Now,
|
||||
we aren't constraining ourselves to only 4, but rather using a generic variable \\(c\\).
|
||||
We then end up with "\\(d\\) cannot be divisible by \\(c\\)". For instance, suppose we kept
|
||||
our divisor as 9 for the time being, but started turning 3 times instead of 4. This
|
||||
violates are divisibility condtion, and we once again end up with a spiral:
|
||||
|
||||
{{< figure src="pattern_8_9_t3.svg" caption="Pattern generated by the number 8 in base 10 while turning 3 times." class="tiny" alt="Pattern generated by the number 3 by summing digits and turning 120 degrees." >}}
|
||||
|
||||
If, on the other hand, we pick \\(d=8\\) and \\(c=3\\), we get patterns for all numbers just like we hoped.
|
||||
Here's one such pattern:
|
||||
|
||||
{{< figure src="pattern_7_8_t3.svg" caption="Pattern generated by the number 7 in base 9 while turning 3 times." class="tiny" alt="Pattern generated by the number 7 by summing digits in base 9 and turning 120 degrees." >}}
|
||||
|
||||
Hold on a moment; it's actully not so obvious why our condition _still_ works. When we just turned
|
||||
on a grid, things were simple. As long as we didn't end up facing the same way we started, we will
|
||||
eventually perform the exact same motions in reverse. The same is not true when turning 120 degrees, like
|
||||
we suggested. Here's a circle with the turn angles labeled:
|
||||
|
||||
{{< figure src="turn_3_1.png" caption="Orientations when turning 120 degrees" class="small" alt="Possible orientations when turning 120 degrees." >}}
|
||||
|
||||
We never quite do the exact _opposite_ of any one of our movements. So then, will we come back to the
|
||||
origin anyway? Well, let's start simple. Suppose we always turn by exactly one 120-degree increment
|
||||
(we might end up turning more or less, just like we may end up turning left, right, or back in the
|
||||
90 degree case). Now,
|
||||
|
||||
1. Suppose that having performed one complete cycle, we end up away from the center
|
||||
by \\(dx\\) on the \\(x\\)-axis, and \\(dy\\) on the \\(y\\)-axis (we do this without loss
|
||||
of generality).
|
||||
2. We are now turned around by 120 degrees, so once we perform the cycle again, we end up offset
|
||||
by \\(dx(\\cos 120)-dy(\\sin 120)\\) on the \\(x\\)-axis, and \\(dx(\\sin 120)+dy(\\cos 120)\\) on
|
||||
the \\(y\\)-axis (I got this from the [rotation matrx](https://en.wikipedia.org/wiki/Rotation_matrix)
|
||||
page on Wikipedia).
|
||||
3. After one more step, we end up with having rotated a total of 240 degrees. As we perform the cycle
|
||||
again, we end up having moved by an additional \\(dx(\\cos 240)-dy(\\sin 240)\\) and \\(dx(\\sin 240)+dy(\\cos 240)\\).
|
||||
|
||||
Summing up all of these changes, we get:
|
||||
|
||||
{{< latex >}}
|
||||
dx(\cos0+\cos120+\cos240) + dy(\sin0+\sin120+\sin240)
|
||||
{{< /latex >}}
|
||||
|
||||
Why don't we start trying to write this in terms of variables already? For some number of turns
|
||||
\\(c\\), a single turn is \\(360/c\\) degrees. We start having turned 0 degrees, then progress
|
||||
to having turned \\(360/c\\) degrees, then \\(2\times360/c\\), and so on until \\((c-1)360/c\\).
|
||||
We can write this using _summation notation_ (and radians instead of degrees) as follows:
|
||||
|
||||
{{< latex >}}
|
||||
\begin{aligned}
|
||||
x &= dx\left[\sum_{i=0}^{c-1} \cos\left(i\frac{2\pi}{c}\right)\right] -
|
||||
dy\left[\sum_{i=0}^{c-1} \sin\left(i\frac{2\pi}{c}\right)\right] \\
|
||||
y &= dx\left[\sum_{i=0}^{c-1} \sin\left(i\frac{2\pi}{c}\right)\right] +
|
||||
dy\left[\sum_{i=0}^{c-1} \cos\left(i\frac{2\pi}{c}\right)\right] \\
|
||||
\end{aligned}
|
||||
{{< /latex >}}
|
||||
|
||||
For reasons beyond the scope of this article, sums like those between the square brackets
|
||||
in the above equations _always_ equal zero. This means that after all the turns have been made,
|
||||
we get \\(x=0\\) and \\(y=0\\) -- back at the origin, where we started!
|
||||
|
||||
{{< todo >}}Maybe we can prove the sin/cos thing? {{< /todo >}}
|
||||
|
||||
What if we turn by 240 degrees at a time: 2 turns instead of 1? Even though we first turn
|
||||
a whole 240 degrees, the second time we turn we "overshoot" our initial bearing, and end up at 120 degrees
|
||||
compared to it. As soon as we turn 240 more degrees (turning the third time), we end up back at 0.
|
||||
In short, even though we "visited" each bearing in a different order, we visited them all.
|
||||
|
||||
{{< figure src="turn_3_2.png" caption="Orientations when turning 120 degrees, twice at a time" class="small" alt="Possible orientations when turning 120 degrees, twice at a time." >}}
|
||||
|
||||
Let's try put some mathematical backing to this "visited them all" idea.
|
||||
|
||||
{{< todo >}}Remainders, visited them all, etc.{{< /todo >}}
|
||||
|
||||
But let's not be so boring. We can branch out some, of course.
|
||||
|
||||
{{< figure src="pattern_1_7_t5.svg" caption="Pattern generated by the number 1 in base 8 while turning 5 times." class="tiny" alt="Pattern generated by the number 1 by summing digits in base 8 and turning 72 degrees." >}}
|
||||
|
||||
{{< figure src="pattern_3_11_t6.svg" caption="Pattern generated by the number 3 in base 12 while turning 6 times." class="tiny" alt="Pattern generated by the number 3 by summing digits in base 12 and turning 60 degrees." >}}
|
||||
|
||||
Reference in New Issue
Block a user