<p>Performing operations on with recurrence functions requires integrating a call algebra in addition to integrating the machines. Often this is handled by consider the machines being composed to be subroutines, and the outer controller than explicitly calls them. The call algebra can then be dynamic depending on the input. Calls can be skipped due to being inside conditionals, or performed an arbitrary number of times in loops. Though simple control structures that are static are more math like, and are more likely to be more effected by optimizations (simplifications).</p>
+<h2>A pole and zero cancellation</h2>
- <h3>Multiplication of synchronized difference vectors</h3>
- <p>
- Because the forward difference operator is linear, adding or subtracting two polynomials is achieved by the elementwise addition or subtraction of their initial difference vectors. Multiplication, however, requires a discrete convolution of the two vectors.
- </p>
<p>
- Suppose a programmer has two initial difference vectors, <RT·math>A_0</RT·math> representing function <RT·math>f(t)</RT·math> with an extent of <RT·math>\omega_a</RT·math>, and <RT·math>B_0</RT·math> representing function <RT·math>g(t)</RT·math> with an extent of <RT·math>\omega_b</RT·math>. The goal is to compute the initial difference vector <RT·math>C_0</RT·math> for the product function <RT·math>h(t) = f(t)g(t)</RT·math>.
+ To construct the <RT·math>D_0</RT·math> vector for the quotient <RT·math>H(t) = f(t) / g(t)</RT·math>, where <RT·math>f(t) = 2^t - 32</RT·math> and <RT·math>g(t) = 3t - 15</RT·math>, the machine evaluates the standard combinatorial recurrence for the <RT·math>n</RT·math>th forward difference:
</p>
- <p>
- Multiplying two polynomials of degrees <RT·math>\omega_a</RT·math> and <RT·math>\omega_b</RT·math> yields a polynomial of degree <RT·math>\omega_a + \omega_b</RT·math>. Therefore, the resulting vector <RT·math>C_0</RT·math> will strictly have an extent of <RT·math>\omega_c = \omega_a + \omega_b</RT·math>, requiring a tape component count of <RT·math>\omega_a + \omega_b + 1</RT·math>.
- </p>
-
- <p>
- To determine the components of <RT·math>C_0</RT·math> directly from <RT·math>A_0</RT·math> and <RT·math>B_0</RT·math> without evaluating the functions, we rely on the multiplication of their basis elements. In the calculus of finite differences, polynomials are expanded using binomial coefficients. The product of two binomial coefficients expands into a linear combination of higher binomial coefficients according to a known combinatorial identity:
- </p>
+ <RT·math>
+ H_n = \sum_{k=0}^n (-1)^{n-k} \binom{n}{k} \frac{f(k)}{g(k)}
+ </RT·math>
<p>
- <RT·math>\binom{t}{i} \binom{t}{j} = \sum_{k=\max(i,j)}^{i+j} \binom{k}{i} \binom{i}{k-j} \binom{t}{k}</RT·math>
+ The generator machine successfully computes the first several entries. However, testing the structural integrity of this sequence generation reveals a hard mechanical fault at step 5. When the generator attempts to evaluate <RT·math>H_5</RT·math>, the summation requires evaluating the term at <RT·math>k=5</RT·math>. The denominator evaluates to <RT·math>g(5) = 3(5) - 15 = 0</RT·math>. The numerator evaluates to <RT·math>f(5) = 2^5 - 32 = 0</RT·math>.
</p>
<p>
- By applying this identity across the summations of both input functions, the component <RT·math>k</RT·math> of the resulting vector <RT·math>C_0</RT·math> can be computed algebraically. Each component <RT·math>C_{0, k}</RT·math> is the sum of the cross products of the input components, weighted by combinations of their indices:
+ If this were executing strictly in the first order, the arithmetic logic unit would blindly attempt the operation and crash, yielding a strict hardware fault: <RT·code>(divide 0 0)</RT·code>. Because this execution occurs in the second order, the structural logic of the functions is preserved. The machine intercepts the fault before reduction, trapping the unresolved expression as <RT·code>(divide f(k)|k=5 g(k)|k=5)</RT·code>. This trapped expression is routed to a specialized limit analyzer, acting as a L'Hôpital evaluator, to resolve the indeterminate form.
</p>
<p>
- <RT·math>C_{0, k} = \sum_{i=0}^{\omega_a} \sum_{j=0}^{\omega_b} A_{0, i} B_{0, j} \binom{k}{i} \binom{i}{k-j}</RT·math>
+ To see how this operates dynamically, a person can observe the vectors directly. The row 0 vector for the function <RT·math>g(u) = u - 15</RT·math> is:
</p>
+
+ <RT·math>
+ [-15, 1]
+ </RT·math>
<p>
- Thus, while a Turing Machine extending the function only requires a simple accumulator, a machine tasked with multiplying two initial tapes must perform a combinatorial cross multiplication to generate the expanded tape before the extension sequence can begin.
- </p>
-
- <h2>Division and the Reciprocal Difference Vector</h2>
-
- <p>
- If the multiplication of two polynomials in the finite difference domain is a discrete convolution, then division is a discrete deconvolution. By finding the reciprocal of a difference vector, a programmer can perform division using the same combinatorial architecture.
+ The row 0 vector for <RT·math>f(t) = 2^t - 32</RT·math> is:
</p>
- <p>
- Let <RT·math>A_0</RT·math> be the initial difference vector for a polynomial <RT·math>f(t)</RT·math>. We seek the reciprocal difference vector <RT·math>C_0</RT·math>, which represents the function <RT·math>h(t) = 1/f(t)</RT·math>. Because the reciprocal of a polynomial is a rational function, its forward differences will never reduce to zero. Thus, <RT·math>C_0</RT·math> is an infinite vector.
- </p>
+ <RT·math>
+ [-31, 1, 1, 1, \ldots]
+ </RT·math>
<p>
- Following the lazy evaluation strategy, <RT·math>C_0</RT·math> is not written to a static tape. It is implemented as a generator machine. The main evaluator queries this generator for its values up to the required extent <RT·math>\omega</RT·math> only as they are demanded.
+ We will place these functions into a single system, so we need to synchronize them. Let us assume that <RT·math>[-15, 1]</RT·math> will be called 3 times each time that <RT·math>[-31, 1, 1, 1, \ldots]</RT·math> is called once. Then it becomes:
</p>
- <p>
- By definition, <RT·math>f(t)h(t) = 1</RT·math>. In the difference domain, this means the convolution of <RT·math>A_0</RT·math> and <RT·math>C_0</RT·math> must equal the identity vector <RT·math>I_0</RT·math>, where <RT·math>I_{0, 0} = 1</RT·math> and all subsequent components are exactly zero.
- </p>
+ <RT·math>
+ [-15, 3]
+ </RT·math>
<p>
- Recall the convolution formula for component <RT·math>k</RT·math> of the product:
+ It still starts in the same place, but every 3 steps it jumps by 3 rather than the 1 it jumps per step. Consider the quotient:
</p>
+
+ <RT·math>
+ [-31, 1, 1, 1, \ldots] / [-15, 3]
+ </RT·math>
<p>
- <RT·math>I_{0, k} = \sum_{i=0}^{k} \sum_{j=0}^{k} A_{0, i} C_{0, j} \binom{k}{i} \binom{i}{k-j}</RT·math>
+ The two synchronized machines that are called against this quotient can be simplified to a rational generator machine. This machine runs the two initial difference vectors in parallel and evaluates their ratio dynamically at each step, rather than attempting to compute a static deconvolution vector upfront.
</p>
<p>
- To perform the deconvolution, we isolate the unknown component <RT·math>C_{0, k}</RT·math>. This term occurs in the summation strictly when <RT·math>j = k</RT·math>. When <RT·math>j = k</RT·math>, the term <RT·math>k-j</RT·math> equals 0, making the binomial coefficient <RT·math>\binom{i}{0} = 1</RT·math>. Factoring <RT·math>C_{0, k}</RT·math> out of the sum yields:
+ By applying the discrete Leibniz rule, a person can simplify the heavy combinatorial deconvolution into a highly optimized linear recurrence relation. Let <RT·math>F_{0,k}</RT·math> be the component of the numerator and <RT·math>D_{0,k}</RT·math> be the component of the quotient. The relation to find the next quotient component reduces cleanly to:
</p>
- <p>
- <RT·math>C_{0, k} \sum_{i=0}^{k} A_{0, i} \binom{k}{i}</RT·math>
- </p>
+ <RT·math>
+ D_{0,k} = \frac{F_{0,k} - 3k D_{0,k-1}}{3k - 15}
+ </RT·math>
<p>
- A person familiar with Newton's forward difference formula will recognize that the summation <RT·math>\sum_{i=0}^{k} A_{0, i} \binom{k}{i}</RT·math> is exactly the evaluation of the original function at step <RT·math>k</RT·math>, or <RT·math>f(k)</RT·math>.
+ Using this recurrence, the machine successfully generates quotient values, but on call 5 it encounters the exact same singularity.
</p>
- <p>
- We can now solve for <RT·math>C_{0, k}</RT·math> recursively. For the base case <RT·math>k = 0</RT·math>, where <RT·math>I_{0, 0} = 1</RT·math>:
- </p>
+ <RT·math>
+ [31/15, 13/30, 8/45, 1/10, 1/15, \text{(divide 0 0)}]
+ </RT·math>
<p>
- <RT·math>C_{0, 0} = \frac{1}{A_{0, 0}}</RT·math>
+ By shifting from the difference vector to the direct function values over time, the behavior around the singularity becomes clear:
</p>
- <p>
- For all subsequent components where <RT·math>k > 0</RT·math> and <RT·math>I_{0, k} = 0</RT·math>, we subtract the previously known terms of the convolution and divide by <RT·math>f(k)</RT·math>:
- </p>
+ <table>
+ <thead>
+ <tr>
+ <th>Count (<RT·math>t</RT·math>)</th>
+ <th>Quotient (<RT·math>f(t)/g(t)</RT·math>)</th>
+ <th>1st Diff Ratio (<RT·math>\Delta^1 f(t) / \Delta^1 g(t)</RT·math>)</th>
+ <th>2nd Diff Ratio (<RT·math>\Delta^2 f(t) / \Delta^2 g(t)</RT·math>)</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>0</td>
+ <td>31/15</td>
+ <td>1/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>1</td>
+ <td>30/12</td>
+ <td>2/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td>28/9</td>
+ <td>4/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td>24/6</td>
+ <td>8/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td>16/3</td>
+ <td>16/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>5</td>
+ <td><RT·code>(divide f(5) g(5))</RT·code></td>
+ <td>32/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>6</td>
+ <td>32/3</td>
+ <td>64/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>7</td>
+ <td>96/6</td>
+ <td>128/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>8</td>
+ <td>224/9</td>
+ <td>256/3</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>9</td>
+ <td>480/12</td>
+ <td>512/3</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
<p>
- <RT·math>C_{0, k} = \frac{-1}{f(k)} \sum_{i=0}^{k} \sum_{j=0}^{k-1} A_{0, i} C_{0, j} \binom{k}{i} \binom{i}{k-j}</RT·math>
+ Observing the execution table reveals a profound structural alignment. Exactly at the singularity <RT·math>t=5</RT·math>, the continuous trajectory of the quotient aligns perfectly with the ratio of the first differences, <RT·math>\Delta^1 f(t) / \Delta^1 g(t)</RT·math>, taking the value <RT·math>32/3</RT·math>. The L'Hôpital evaluator utilizes this discrete geometry to bridge the gap. This specific physical property is highly suggestive of L'Hôpital's rule from continuous calculus. In a later chapter concerning non standard analysis, we will formally define how this exact difference quotient mechanism maps seamlessly into continuous limits when stepping across infinitesimal bounds.
</p>
- <p>
- This reveals a strict recurrent structure. To generate component <RT·math>k</RT·math> of the reciprocal vector, the generator machine relies entirely on the static components of the input polynomial <RT·math>A_0</RT·math> and the previously computed components of the reciprocal <RT·math>C_{0, 0}</RT·math> through <RT·math>C_{0, k-1}</RT·math>. By encapsulating this recurrence within a generator, a programmer can perform exact division while maintaining finite memory bounds, extending the reciprocal vector only when the execution demands it. Note, this is a reciprocal of a function, rather than that of a value.
- </p>
-<h2>A pole and zero cancellation</h2>
+ <h2>A pole and zero cancellation</h2>
<p>The row 0 vector for the function <RT·math>g(u) = u - 15</RT·math> is:</p>
[31/15, 13/30, 8/45, 1/10, 1/15, (divide 0 0)]
</RT·math>
- <p>------</p>
-
<table>
<thead>
<tr>
<td>0</td>
<td>31/15</td>
<td>1/3</td>
- <td><RT·code>(divide 1 0)</RT·code></td>
</tr>
<tr>
<td>1</td>
<td>30/12</td>
<td>2/3</td>
- <td><RT·code>(divide 2 0)</RT·code></td>
</tr>
<tr>
<td>2</td>
<td>28/9</td>
<td>4/3</td>
- <td><RT·code>(divide 4 0)</RT·code></td>
</tr>
<tr>
<td>3</td>
<td>24/6</td>
<td>8/3</td>
- <td><RT·code>(divide 8 0)</RT·code></td>
</tr>
<tr>
<td>4</td>
<td>16/3</td>
<td>16/3</td>
- <td><RT·code>(divide 16 0)</RT·code></td>
</tr>
<tr>
<td>5</td>
<td><RT·code>(divide 0 0)</RT·code></td>
<td>32/3</td>
- <td><RT·code>(divide 32 0)</RT·code></td>
</tr>
<tr>
<td>6</td>
<td>32/3</td>
<td>64/3</td>
- <td><RT·code>(divide 64 0)</RT·code></td>
</tr>
<tr>
<td>7</td>
<td>96/6</td>
<td>128/3</td>
- <td><RT·code>(divide 128 0)</RT·code></td>
</tr>
<tr>
<td>8</td>
<td>224/9</td>
<td>256/3</td>
- <td><RT·code>(divide 256 0)</RT·code></td>
</tr>
<tr>
<td>9</td>
<td>480/12</td>
<td>512/3</td>
- <td><RT·code>(divide 512 0)</RT·code></td>
</tr>
</tbody>
</table>
+ <RT·chapter>Address</RT·chapter>
+
<h2>Unary Representation address</h2>
</body>
</html>
+<!----
+ more appendix mateial ...
+
+ <h3>Multiplication of synchronized difference vectors</h3>
+
+ <p>
+ Because the forward difference operator is linear, adding or subtracting two polynomials is achieved by the elementwise addition or subtraction of their initial difference vectors. Multiplication, however, requires a discrete convolution of the two vectors.
+ </p>
+
+ <p>
+ Suppose a programmer has two initial difference vectors, <RT·math>A_0</RT·math> representing function <RT·math>f(t)</RT·math> with an extent of <RT·math>\omega_a</RT·math>, and <RT·math>B_0</RT·math> representing function <RT·math>g(t)</RT·math> with an extent of <RT·math>\omega_b</RT·math>. The goal is to compute the initial difference vector <RT·math>C_0</RT·math> for the product function <RT·math>h(t) = f(t)g(t)</RT·math>.
+ </p>
+
+ <p>
+ Multiplying two polynomials of degrees <RT·math>\omega_a</RT·math> and <RT·math>\omega_b</RT·math> yields a polynomial of degree <RT·math>\omega_a + \omega_b</RT·math>. Therefore, the resulting vector <RT·math>C_0</RT·math> will strictly have an extent of <RT·math>\omega_c = \omega_a + \omega_b</RT·math>, requiring a tape component count of <RT·math>\omega_a + \omega_b + 1</RT·math>.
+ </p>
+
+ <p>
+ To determine the components of <RT·math>C_0</RT·math> directly from <RT·math>A_0</RT·math> and <RT·math>B_0</RT·math> without evaluating the functions, we rely on the multiplication of their basis elements. In the calculus of finite differences, polynomials are expanded using binomial coefficients. The product of two binomial coefficients expands into a linear combination of higher binomial coefficients according to a known combinatorial identity:
+ </p>
+
+ <p>
+ <RT·math>\binom{t}{i} \binom{t}{j} = \sum_{k=\max(i,j)}^{i+j} \binom{k}{i} \binom{i}{k-j} \binom{t}{k}</RT·math>
+ </p>
+
+ <p>
+ By applying this identity across the summations of both input functions, the component <RT·math>k</RT·math> of the resulting vector <RT·math>C_0</RT·math> can be computed algebraically. Each component <RT·math>C_{0, k}</RT·math> is the sum of the cross products of the input components, weighted by combinations of their indices:
+ </p>
+
+ <p>
+ <RT·math>C_{0, k} = \sum_{i=0}^{\omega_a} \sum_{j=0}^{\omega_b} A_{0, i} B_{0, j} \binom{k}{i} \binom{i}{k-j}</RT·math>
+ </p>
+
+ <p>
+ Thus, while a Turing Machine extending the function only requires a simple accumulator, a machine tasked with multiplying two initial tapes must perform a combinatorial cross multiplication to generate the expanded tape before the extension sequence can begin.
+ </p>
+
+ <h2>Division and the Reciprocal Difference Vector</h2>
+
+ <p>
+ If the multiplication of two polynomials in the finite difference domain is a discrete convolution, then division is a discrete deconvolution. By finding the reciprocal of a difference vector, a programmer can perform division using the same combinatorial architecture.
+ </p>
+
+ <p>
+ Let <RT·math>A_0</RT·math> be the initial difference vector for a polynomial <RT·math>f(t)</RT·math>. We seek the reciprocal difference vector <RT·math>C_0</RT·math>, which represents the function <RT·math>h(t) = 1/f(t)</RT·math>. Because the reciprocal of a polynomial is a rational function, its forward differences will never reduce to zero. Thus, <RT·math>C_0</RT·math> is an infinite vector.
+ </p>
+
+ <p>
+ Following the lazy evaluation strategy, <RT·math>C_0</RT·math> is not written to a static tape. It is implemented as a generator machine. The main evaluator queries this generator for its values up to the required extent <RT·math>\omega</RT·math> only as they are demanded.
+ </p>
+
+ <p>
+ By definition, <RT·math>f(t)h(t) = 1</RT·math>. In the difference domain, this means the convolution of <RT·math>A_0</RT·math> and <RT·math>C_0</RT·math> must equal the identity vector <RT·math>I_0</RT·math>, where <RT·math>I_{0, 0} = 1</RT·math> and all subsequent components are exactly zero.
+ </p>
+
+ <p>
+ Recall the convolution formula for component <RT·math>k</RT·math> of the product:
+ </p>
+
+ <p>
+ <RT·math>I_{0, k} = \sum_{i=0}^{k} \sum_{j=0}^{k} A_{0, i} C_{0, j} \binom{k}{i} \binom{i}{k-j}</RT·math>
+ </p>
+
+ <p>
+ To perform the deconvolution, we isolate the unknown component <RT·math>C_{0, k}</RT·math>. This term occurs in the summation strictly when <RT·math>j = k</RT·math>. When <RT·math>j = k</RT·math>, the term <RT·math>k-j</RT·math> equals 0, making the binomial coefficient <RT·math>\binom{i}{0} = 1</RT·math>. Factoring <RT·math>C_{0, k}</RT·math> out of the sum yields:
+ </p>
+
+ <p>
+ <RT·math>C_{0, k} \sum_{i=0}^{k} A_{0, i} \binom{k}{i}</RT·math>
+ </p>
+
+ <p>
+ A person familiar with Newton's forward difference formula will recognize that the summation <RT·math>\sum_{i=0}^{k} A_{0, i} \binom{k}{i}</RT·math> is exactly the evaluation of the original function at step <RT·math>k</RT·math>, or <RT·math>f(k)</RT·math>.
+ </p>
+
+ <p>
+ We can now solve for <RT·math>C_{0, k}</RT·math> recursively. For the base case <RT·math>k = 0</RT·math>, where <RT·math>I_{0, 0} = 1</RT·math>:
+ </p>
+
+ <p>
+ <RT·math>C_{0, 0} = \frac{1}{A_{0, 0}}</RT·math>
+ </p>
+
+ <p>
+ For all subsequent components where <RT·math>k > 0</RT·math> and <RT·math>I_{0, k} = 0</RT·math>, we subtract the previously known terms of the convolution and divide by <RT·math>f(k)</RT·math>:
+ </p>
+
+ <p>
+ <RT·math>C_{0, k} = \frac{-1}{f(k)} \sum_{i=0}^{k} \sum_{j=0}^{k-1} A_{0, i} C_{0, j} \binom{k}{i} \binom{i}{k-j}</RT·math>
+ </p>
+
+ <p>
+ This reveals a strict recurrent structure. To generate component <RT·math>k</RT·math> of the reciprocal vector, the generator machine relies entirely on the static components of the input polynomial <RT·math>A_0</RT·math> and the previously computed components of the reciprocal <RT·math>C_{0, 0}</RT·math> through <RT·math>C_{0, k-1}</RT·math>. By encapsulating this recurrence within a generator, a programmer can perform exact division while maintaining finite memory bounds, extending the reciprocal vector only when the execution demands it. Note, this is a reciprocal of a function, rather than that of a value.
+ </p>
+-->