我有一个家庭作业问题要求我描述一个接受L = {a^n: n is prime}
的非确定性图灵机的程序。我不知道如何解决这个问题。我知道吗?我使用a
作为一元数字并计算它们吗?我可以忽略字符串,只测试n的主要部分吗?或者是已知的主要值,因此只有那些单元格位置是接受状态,我可以像正常一样读取数据吗?
我应该怎么做?
答案 0 :(得分:5)
首先你可以在某处使用一个内存位置来标记字符串是否已被发现是否为长度,然后或多或少地做出Ness所建议的内容(尽管我并不完全理解他的答案)
使用Eratosthenes的Sieve。从长度为2的辅助字符串开始,并在输入字符串和辅助字符串中向右移动一个,当您点击辅助字符串的结束字符时返回辅助字符串的开头,直到您点击输入的结束字符串。通过这种方式,您可以看到辅助字符串是否划分输入字符串。然后转到长度为3的辅助字符串并执行相同操作,依此类推。只有当没有辅助字符串长度除以输入字符串长度时,才输入字符串长度为prime。如果一个辅助字符串长度除以输入字符串长度,请使用标记内存插槽来显示。并让算法检查标志内存插槽,如果标记,则中止所有处理,以便可以拒绝该字符串。
现在,在迭代输入时的任何时候都允许从内循环中跳出非确定性,这样机器就可以开始测试下一个长度的辅助字符串。这样,从某种意义上说,所有长度的辅助字符串都将被同时测试,但是当你的标记槽被标记时,它们都会停止处理并拒绝字符串。
最后一个问题。字符串可能会在之前被接受(尽管时间在这里是一种非概念),但它们被发现是非素数的。如果你能解决这个问题,那么你就领先于我。
P.S。 Drineas是邪恶的
答案 1 :(得分:2)
您可以在磁带上将实际无限的Eratosthenes筛子放在原点的左侧。
非确定性允许您为每个州提供多个转换规则。因此,当以n
为增量向左移动时,您可以在每个点 a。继续向左移动并标记磁带,增量为{{1}};或 b。从原点开始,使用下一个n
。
然后让你的起始状态有两个规则(也许在检查你所有的磁带上只有n
s而没有别的): a。开始标记2的倍数,并且 b。(现在假设筛子已经到位)计算您的a
并使用原点左侧标记的素数来决定是否接受。
因此,您的初始磁带a
最终会变成........aaaaaaa.........
(.c.ccccc.ccc.c.ccc.c.ccc[p]cpcpp.OaaaaaaaA...x.y.z...
标记磁带上的最终磁头位置)。