Sturmian word: Difference between revisions
imported>CosmiaNebula No edit summary |
imported>CosmiaNebula (Continued fraction convergents) |
||
Line 11: | Line 11: | ||
* Given a positive rational number <math>\frac mn</math>, specified by two positive integers <math>m, n</math>, output its entire Sturmian word. |
* Given a positive rational number <math>\frac mn</math>, specified by two positive integers <math>m, n</math>, output its entire Sturmian word. |
||
* Given a quadratic real number <math>\frac{\sqrt{a} + m}{n}</math>, specified by |
* Given a quadratic real number <math>\frac{b\sqrt{a} + m}{n} > 0</math>, specified by integers <math>a, b, m, n </math>, where <math>a</math> is not a perfect square, output the first <math>k</math> letters of Sturmian words when given a positive number <math>k</math>. |
||
(If the programming language can represent infinite data structures, then that works too.) |
(If the programming language can represent infinite data structures, then that works too.) |
||
Line 19: | Line 19: | ||
The key difficulty is accurately calculating <math>floor(k\sqrt a) </math> for large <math>k</math>. Floating point arithmetic would lose precision. One can either do this simply by directly searching for some integer <math>a'</math> such that <math>a'^2 \leq k^2a < (a'+1)^2</math>, or by more trickly methods, such as the continued fraction approach. |
The key difficulty is accurately calculating <math>floor(k\sqrt a) </math> for large <math>k</math>. Floating point arithmetic would lose precision. One can either do this simply by directly searching for some integer <math>a'</math> such that <math>a'^2 \leq k^2a < (a'+1)^2</math>, or by more trickly methods, such as the continued fraction approach. |
||
First calculate the continued fraction |
First calculate the [[continued fraction convergents]] to <math>\sqrt a</math>. Let <math>\frac mn </math> be a convergent to <math>\sqrt a</math>, such that <math>n \geq k</math>, then since the convergent sequence is the '''best rational approximant''' for denominators up to that point, we know for sure that, if we write out <math>\frac{0}{k}, \frac{1}{k}, \dots</math>, the sequence would stride right across the gap <math>(m/n, 2x - m/n)</math>. Thus, we can take the largest <math>l</math> such that <math>l/k \leq m/n</math>, and we would know for sure that <math>l = floor(k\sqrt a)</math>. |
||
In summary,<math display="block">floor(k\sqrt a) = floor(mk/n)</math>where <math>m/n</math> is the first continued fraction approximant to <math>\sqrt a</math> with a denominator <math>n \geq k</math> |
In summary,<math display="block">floor(k\sqrt a) = floor(mk/n)</math>where <math>m/n</math> is the first continued fraction approximant to <math>\sqrt a</math> with a denominator <math>n \geq k</math> |
||
where <math>m/n</math> is the first continued fraction approximant to <math>\sqrt a</math> with a denominator <math>n \geq k</math> |
Revision as of 23:27, 31 January 2024
You are encouraged to solve this task according to the task description, using any language you may know.
A Sturmian word is a binary sequence, finite or infinite, that makes up the cutting sequence for a positive real number x, as shown in the picture.
The Sturmian word can be computed thus as an algorithm:
- If , then it is the inverse of the Sturmian word for . So we have reduced to the case of .
- Iterate over
- If is an integer, then the program terminates. Else, if , then the program outputs 0, else, it outputs 10.
The problem:
- Given a positive rational number , specified by two positive integers , output its entire Sturmian word.
- Given a quadratic real number , specified by integers , where is not a perfect square, output the first letters of Sturmian words when given a positive number .
(If the programming language can represent infinite data structures, then that works too.)
Stretch goal: calculate the Sturmian word for other kinds of definable real numbers, such as cubic roots.
The key difficulty is accurately calculating for large . Floating point arithmetic would lose precision. One can either do this simply by directly searching for some integer such that , or by more trickly methods, such as the continued fraction approach.
First calculate the continued fraction convergents to . Let be a convergent to , such that , then since the convergent sequence is the best rational approximant for denominators up to that point, we know for sure that, if we write out , the sequence would stride right across the gap . Thus, we can take the largest such that , and we would know for sure that .
In summary,
where is the first continued fraction approximant to with a denominator