一个mod B功能图灵机

时间:2017-09-25 15:55:57

标签: turing-machines

我想知道如何计算函数 A mod B ,其中A> B和A,B是一元数字,带有单个磁带的确定性图灵机。

由于

1 个答案:

答案 0 :(得分:0)

给定类似B111 ... 10111 ... 1BBB ...的输入,其中第一个1s的字符串是a的一元编码(即1 ^ a),第二个1s的字符串是一元编码b(即1 ^ b),我们可以设计一个单磁带确定性图灵机来计算一个mod b(通过在磁带上留下mod b的一元表示后输入halt-accept)。

首先注意一个mod b< a,所以我们可以通过从一元表示中删除一些1来恢复mod b的一元表示,并从b的一元表示中删除所有1。观察到mod b =(a-b)mod b,至少当a>> = b时;当a< b,则mod b = a。这个观察结果表明我们可以从一元表示中删除b 1s,直到剩下少于b 1,此时我们从b的表示中删除1并停止接受。

伪代码:

move right until you find a blank.
move one step to the left.
you are now looking at the last 1 in b's representation.
mark this as Y and move left until you find 0.
move left until you find a 1 or blank.
you are now looking at the last 1 in a's representation, or blank.
if 1, mark this as X and move right until you find Y.
if blank, a < b; change all Xs to 1s and all 0s, 1s and YBs to blanks. halt-accept.
move one step to the left.
you are now looking at the last 1 in b's representation, or 0.
if 1, continue as above.
if 0, b < a; change all Xs to 0s, all Ys to 1s, and restart from the beginning

示例:10 mod 3

B11111111110111BBB...
^

B11111111110111BBB...
               ^        move right until you find a blank

B11111111110111BBB...
              ^         move one step to the left. looking at last 1 in b

B1111111111011YBBB...
           ^            mark as Y and move left to 0

B1111111111011YBBB...
          ^             move one step to the left. looking at last 1 in a.

B111111111X011YBBB...
              ^         mark as X and move right to Y

B111111111X011YBBB...
             ^          move one step to the left. looking at last 1 in b.

B111111111X01YYBBB...
           ^            mark as Y and move left to 0

B111111111X01YYBBB...
         ^              move left to 1

B11111111XX01YYBBB...
             ^          mark as X and move right to Y

B11111111XX01YYBBB...
            ^           move one step to the left. looking at last 1 in b

B11111111XX0YYYBBB...
           ^            mark as Y and move left to 0

B11111111XX0YYYBBB...
        ^               move left to 1

B1111111XXX0YYYBBB...   mark as X and move right to Y
            ^

B1111111XXX0YYYBBB...   move one step left. looking at 0; b < a
           ^

B11111110000111BBB...
^                       change Xs to 0s and Ys to 1s; start over.

(above process repeats two more times)

B10000000000111BBB...
^                       erased 3x 1s from a 3x times

B10000000000111BBB...
               ^        move right to blank

B10000000000111BBB...
              ^         move one step left. looking at last 1 in b

B1000000000011YBBB...
           ^            mark as Y and move left to 0.

B1000000000011YBBB...
 ^                      move left to 1

BX000000000011YBBB...
              ^         mark as X and move right to Y

BX000000000011YBBB...
             ^          move one step left. looking at last 1 in b.

BX00000000001YYBBB...
           ^            mark as Y and move left to 0

BX00000000001YYBBB...
^                       move left to blank. a < b.

B1BBBBBBBBBBBBBBBB...
^                       change Xs to 1s and 0s, 1s, Ys to blank. halt-accept