“ n是否可以除以23?”的可判定性

时间:2018-07-07 19:11:34

标签: algorithm computer-science turing-machines decidable

我有以下问题:

  

让n为自然数,n> 10 ^ 100。 n被23整除吗?

这个问题是半确定的还是可确定的?

可以创建一种算法来找到答案,使其始终停止。关于半可决定性和可决定性之间的区别,我感到很困惑。据我了解,如果我可以构建一个图灵机(算法)来接受问题的解决方案,否则将拒绝该问题,那么这个问题是可以确定的。但是,如果在输入不是解决方案的情况下机器永远不会停止运行,则意味着该问题是半确定的。

所以,我想说上述问题是可以确定的,但是我不知道我说的话是否正确。您能帮我找出答案吗,为什么?谢谢。

3 个答案:

答案 0 :(得分:3)

<xsl:template match="Root">
  <xsl:copy>
    <xsl:copy-of select="Record[emp/empInfo/class = 'G']"/>
  </xsl:copy>
</xsl:template>

这不算作算法吗?对我来说似乎是可以决定的。

请参见answer by Hermann Döppes,您不希望承担模数的可计算性。

答案 1 :(得分:2)

是的,这是可以决定的。要给出比Lakshay Garg更基本的论点:

  • 您可以列举所有数字k = 0、1、2、3、4、5…
  • 您可以将它们依次乘以23。
  • 现在采取了有趣的步骤:
    • 如果23 * k小于n,请尝试下一个k。
    • 如果23 * k = n,则n可被23整除。
    • 如果23 * k大于n,我们可以停止,因为再加上k,我们只会超过n。如果到那时我们没有找到k = n / 23,则说明没有k = n / 23,n被 not 整除。

由于23 * n大于n,因此最晚在k = n时到达最后一步,这意味着该过程终止。

答案 2 :(得分:2)

您是正确的。问题是可判定,如果您可以编写一种算法,对于任何输入,该算法最终都会总是做出决定。对于“ n是否可被23整除的问题”,请考虑以下(错误的)算法:从i = 1开始,并检查23 * i是否小于,大于或等于到n

  • 如果小于n,请增加i
  • 如果等于n,请返回true
  • 如果它大于n,请返回false

无论n有多大,该算法最终总是会吐出一个答案,因为在i大于{{之前,您只能将23 * i递增有限的次数。 1}}。这可能会花费大量时间,但是出于可判定性的目的,我们不在乎。因此,该算法始终会做出决定;因此,问题是可以确定的。

将此问题与半确定问题进行对比。这些问题在于,如果存在正确的答案,就会有算法始终会回答n,但是如果正确的答案是true ,则可能会永远运行。

最著名的半确定性问题是暂停问题:给定程序,请确定该程序是否曾经停止运行。假设您尝试通过编写执行其输入的程序来解决此问题。如果该执行终止,则可以返回false:您知道程序终止了,因为您只是看着它终止了。但是,如果您已经等待了一段时间,并且它还没有终止,那么只要让它运行更长的时间,就无法确定它是否不会终止,因此您只需要等待即可。因此,如果输入程序没有终止,则您的程序也不会终止。

因此,有一个关于暂停问题的算法,如果实际答案为true,则始终返回true,但是如果实际答案为false,则该算法将永远运行。因此,暂停问题是半确定的。