当 Knuth 说“让输入由字符串 a^mb^n 表示”时,他的意思是输入应该采用 m 数量 as 和 n 数量 b 的形式s。所以输入f((m,n)),其中m = 3 和n = 2 将由字符串aaabb 表示。
花点时间回顾一下他在该章中的方程式 3,它代表Markov algorithm。 (下)
f((σ,j)) = (σ,a_j) if θ_j does not occur in σ
f((σ,j)) = (αφ_jω,b_j) if α is the shortest string for which σ = αθ_jω
f((σ,N)) = (σ,N)
所以想法是为每个变量j, θ_j, φ_j, a_j & b_j定义序列。这样,使用上述马尔可夫算法,您可以指定输入字符串会发生什么,具体取决于j 的值。
现在,进入您的主要问题;
我的问题是如何将这与练习中给出的方向联系起来,以使用书中给出的算法 E,并将原始 r(余数)替换为 |m-n|并且 n 被 min(m,n) 替换。
本质上,Knuth 在这里所说的是,您不能使用上述马尔可夫算法进行除法。那么最接近除法的东西是什么?好吧,基本上我们可以从较大的数字中减去较小的数字,直到剩下余数。例如;
10 % 4 = 2 和下面做的一样;
10 - 4 = 6 Can we remove another 4? Yes. Do it again.
6 - 4 = 2 Can we remove another 4? No. We have our remainder.
现在我们有剩下的了。这基本上就是他希望你对我们的输入字符串执行的操作,例如aaabb。
如果您通读 Knuth 在书后的建议答案并通过几个示例进行操作,您会发现这基本上就是他正在做的事情,即删除 ab 对,然后添加 c 直到没有更多对 ab 存在。以我在顶部使用的示例为例,我们得到了被操纵的字符串aaabb, aab, caab, ca, cca, ccb, aab (then start again)
与r = m % n, m = n, n = r (then start again) 相同。不同之处当然是在上面我们使用了取模运算符和除法,但在上面的示例中我们只使用了减法。
我希望这会有所帮助。我实际上在我的博客上wrote a more in-depth analysis of Knuth's variation on a Markov algorithm。因此,如果您仍然觉得有点卡住,请阅读该系列。