a^mb^n
表示”时,他的意思是输入应该采用m
个a
和n
个b
的形式。因此,当m = 3
且n = 2
时,输入f((m,n))
将由字符串aaabb
表示。 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
的值发生的输入字符串的情况。
现在,进入您的主要问题;
我的问题是如何将其与练习中给出的使用原始r(余数)替换为|m-n|和n替换为min(m,n)的E算法相连接。
基本上,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 (然后重新开始)
。这与r = m%n,m = n,n = r(然后重新开始)
相同。当然,以上我们使用了模运算符和除法,但在上面的示例中,我们仅使用了减法。希望这可以帮助您。我实际上在我的博客上撰写了关于Knuth变异Markov算法的更深入分析。因此,如果您仍然感到有些困惑,请阅读该系列文章。1. a^m b^n -> a^(m-n) b^n, if m-n > 0;
2. a^0 b^n -> a^0 b^n, the algorithm ends and n is the answer;
3. a^m b^n -> a^n b^m, if n > m
f(a^13 b^3, 0) = (a^10 b^3, 1)
f(a^10 b^3, 1) = (a^7 b^3, 1)
... keep applying rule 1 until:
f(a^1 b^3, 1) = (a^3 b^1, 3)
f(a^3 b^1, 3) = (a^2 b^1, 1)
... keep applying rule 1 until:
f(a^0 b^1, 1) = (a^0 b^1, 2), 1 is the answer. ∎