给出一个文法,生成所有被3整除的正整数的二进 制串并给出证明。
时间: 2023-04-03 17:03:22 浏览: 92
我可以回答这个问题。以下是文法:
S → 0 | 1S0 | 1S1 | 2S2
这个文法可以生成所有被3整除的正整数的二进制串。证明如下:
设一个二进制串表示的数为N,它的位权从右到左依次为a0, a1, a2, …, an-1。则N可以表示为:
N = a0 * 2^0 + a1 * 2^1 + a2 * 2^2 + … + an-1 * 2^(n-1)
我们知道,如果一个数能被3整除,那么它的各位数字之和也能被3整除。所以,N能被3整除的充要条件是:
a0 - a1 + a2 - a3 + … + (-1)^(n-1) * an-1 ≡ 0 (mod 3)
我们可以将这个式子改写为:
(a0 + a2 + …) - (a1 + a3 + …) ≡ 0 (mod 3)
也就是说,N能被3整除的充要条件是,N的偶数位数字之和减去N的奇数位数字之和能被3整除。
现在我们来证明,对于任意一个被3整除的正整数N,都可以用上面的文法生成一个二进制串。
我们可以将N表示为:
N = 3k = (3k-1 + 1) * 2^0 + (3k-2 + 1) * 2^1 + (3k-3 + 1) * 2^2 + … + (3 + 1) * 2^(k-1)
其中,k是一个正整数。我们可以将上式中的每一项拆开,得到:
N = 3k-1 * 2^0 + 2^0 + 3k-2 * 2^1 + 2^1 + 3k-3 * 2^2 + 2^2 + … + 3 * 2^(k-1) + 2^(k-1)
我们发现,每一项都可以用文法S → 0 | 1S0 | 1S1 | 2S2生成。具体来说:
- 3k-1 * 2^0可以用2S2生成,其中S可以生成空串。
- 2^0可以用1S1生成,其中S可以生成空串。
- 3k-2 * 2^1可以用2S2生成,其中S可以生成1或空串。
- 2^1可以用1S0生成,其中S可以生成空串。
- 3k-3 * 2^2可以用2S2生成,其中S可以生成10、11或空串。
- 2^2可以用1S0生成,其中S可以生成11或空串。
- …
- 3 * 2^(k-1)可以用2S2生成,其中S可以生成10^(k-2)、10^(k-2)1或空串。
- 2^(k-1)可以用1S0生成,其中S可以生成10^(k-1)1或空串。
因此,我们可以用上面的文法生成一个二进制串,它表示的数是N。由于N是任意一个被3整除的正整数,所以这个文法可以生成所有被3整除的正整数的二进制串。