1 ^ 3 ^ n代表n> = 1图灵机

时间:2017-11-05 10:17:30

标签: computation-theory turing-machines computation automata-theory turing

我想制作一台图灵机,它接受1长度为1的字符串.111,1111111111,1111111111111111111111111111,等等。但我无法为此制定算法。到目前为止,我能够制作接受3的倍数长度的机器。请帮助我

2 个答案:

答案 0 :(得分:0)

检查输入的长度(111,11111111,...)是否说明了strLen。 检查log(strLen)到base 3的结果是否等于整数。

即代码:

bool is_integer(float k) { return std::floor(k) == k; }

if(is_integer(log(strLen)/log(3))){ //Then accept the string as it's length is a power of 3. }

答案 1 :(得分:0)

与任何编程任务一样,您的目标是将任务分解为可以解决的小问题,解决这些问题,并将各个部分放在一起以回答更难的问题。通常,有很多方法可以做到这一点,你只需找到一个对你有意义的方法。然后,只有这样,你是否应该担心获得一个“更好”,“更快”的计划。

什么使得数字成为三的幂?

  1. 第一个是3的幂(3 ^ 0)
  2. 如果数字是3的幂,则该数字的三倍是3的幂(x = 3 ^ k => 3x = 3 ^(k + 1))。
  3. 我们可以“反转”上面2的方向,给出一个递归的,而不是归纳的定义:如果数字可以被3整除,则数字是3的幂,除以3的数字是3的幂: (3 | x&& x / 3 = 3 ^ k => x = 3 ^(k + 1))。

    这表明图灵机的工作原理如下:

    1. 检查磁带是否只有一个。如果是这样,停止接受。
    2. 否则,除以3,将磁带头重置为开头,然后重新开始。
    3. 我们如何除以三?好吧,我们可以算一个,然后擦掉两个;如果我们最终删除的数量是我们计算数量的两倍,那么我们将只有原始数量的三分之一。但是,如果我们用完了要擦除的数字,我们知道这个数字不能被3整除,我们可以停止拒绝。

      这是我们的设计。现在是实施的时候了。我们将分为两个阶段:第一阶段将检查单个阶段的情况;另一相将除以三并重置磁带头。当我们分开时,我们将通过引入一个新的磁带符号B来擦除它,我们可以将它与空白单元格#区分开来。这很重要,因此我们可以记住输入的开始和结束位置。

      Q    T    |    Q'    T'    D
      ----------+-----------------
      // phase one: check for 3^0
      ----------+-----------------
      q0   #    |    h_r   #     S    // empty tape, not a power of three
      q0   1    |    q1    1     R    // see the required one
      q0   B    |    h_r   B     S    // unreachable configuration; invalid tape
      q1   #    |    h_a   #     L    // saw a single one; 1 = 3^0, accept
      q1   1    |    q2    1     L    // saw another one; must divide by 3
      q1   B    |    q1    B     R    // ignore previously erased ones
      ----------+-----------------
      // prepare for phase two
      ----------+-----------------
      q2   #    |    q3    #     R    // reached beginning of tape
      q2   1    |    q2    1     L    // ignore tape and move left
      q2   B    |    q2    B     L    // ignore tape and move left
      ----------------------------
      // phase two: divide by 3
      ----------------------------
      q3   #    |    q6    #     L    // dividing completed successfully
      q3   1    |    q4    1     R    // see the 1st one
      q3   B    |    q3    B     R    // ignore previously erased ones
      q4   #    |    h_r   #     S    // dividing fails; missing 2nd one
      q4   1    |    q5    B     R    // see the 2nd one
      q4   B    |    q4    B     R    // ignore previously erased ones
      q5   #    |    h_r   #     S    // dividing fails; missing 3rd one
      q5   1    |    q3    B     R    // see the 3rd one
      q5   B    |    q5    B     R    // ignore previously erased one
      ----------+-----------------
      // prepare for phase one
      ----------+-----------------
      q6   #    |    q0    #     R    // reached beginning of tape
      q6   1    |    q6    1     L    // ignore tape and move left
      q6   B    |    q6    B     L    // ignore tape and move left
      

      可能存在一些错误,但我认为这个想法基本上应该是合理的。