什么是暂停状态未知的超短程序?


32

Binary Lambda微积分中的这个579位程序的暂停状态未知:

01001001000100010001000101100111101111001110010101000001110011101000000111001110
10010000011100111010000001110011101000000111001110100000000111000011100111110100
00101011000000000010111011100101011111000000111001011111101101011010000000100000
10000001011100000000001110010101010101010111100000011100101010110000000001110000
00000111100000000011110000000001100001010101100000001110000000110000000100000001
00000000010010111110111100000010101111110000001100000011100111110000101101101110
00110000101100010111001011111011110000001110010111111000011110011110011110101000
0010110101000011010

即,不知道该程序是否终止。为了确定它,您必须求解Collat​​z猜想 -或至少求解所有2≤256的数字。在此存储库中,有关于如何获取此程序的完整说明。

是否有(很多)较短的BLC程序也具有未知的停止状态?


6
非常相关的问题。请社区投票:重复吗?
拉斐尔

9
尽可能少地表达这样一个程序的任务似乎是Code Golf的问题,而计算机科学则是如此。
拉斐尔

2
我认为Ricky对5态TM的回答比对原始问题的回答要好。如果将这个作为假人关闭,答案是否可以移动?
David Richerby


6
您缺少一个关键的细节:您没有指定程序必须使用的语言。您的示例使用二进制Lambda演算-您是否对唯一的语言感兴趣?我们可以看到,简单地将算法主体直接嵌入到语言本身中,开发具有未知停止状态的1位程序是微不足道的。这是一个漏洞,但是在寻求高尔夫解决方案时您必须注意一个漏洞。他们喜欢他们的漏洞!Kolmogov的复杂性可能是此处探讨的重要主题。
Cort Ammon-恢复莫妮卡

Answers:


30

是。这页说,有98 5态图灵机,其停止状态是未知的。令人讨厌的是,它没有提供此类机器的任何示例,但是这个长达26年的页面提供了2台五态图灵机,当时它们的暂停状态显然是未知的。(搜索“简单计数器”将使您在这2个之间正确。)我在这里复制了它们,以防链接断开:

Input Bit   Transition on State     Steps            Comment
             A   B   C   D   E

    0       B1L C1R D0R A1L H1L   > 2*(10^9)       ``chaotic''
    1       B1R E0L A0L D0R C0L

    0       B1L A0R C0R E1L B0L       ?        complex ``counter''
    1       A1R C0L D1L A0R H1L

页面底部显示:$ Date:2007/11/03,那么26岁了吗?
Falaque

1
@Falaque页面顶部指出“此页面是作者对1990年2月……的HTML重写”。文字有26岁,到HTML的表示法是从(或最近更新)于2007
。– IMSoP 2016年

5

Collat​​z猜想:

以下程序始终停止:

void function( ArbitraryInteger input){
     while( input > 1){
            if(input % 2 == 0)
                input /= 2;
            else
                input = (input*3) + 1;
     }

     // Halt here
}

轻微变化(仍然是一个推测,因为它基于Collat​​z的结果):

对于某些输入,以下程序将永远不会两次进入相同的状态(该状态由“输入”所保存的值确定):

void function( ArbitraryInteger input){
     while( input >= 1){ // notice the "="
            if(input % 2 == 0)
                input /= 2;
            else
                input = (input*3) + 1;
     }
}

请注意,无论第一个程序是否停止,第二个程序都不会停止。

可以相信第一个程序总是会因任何输入而终止,但是,我们没有证明,并且可能仍然存在一些该程序不停止的整数(证明它的奖金为100美元) 。

第二个程序也很有趣:它指出该程序永远不会为某些输入两次进入相同的状态,这基本上要求第一个程序具有已知的发散序列,而无需重复。除了明显的1,4,2,1循环之外,它不仅要求Collat​​z猜想为假,而且还要求其为假且没有循环

  • 如果Collat​​z仅具有循环反例,则猜想的变化为假

  • 如果Collat​​z为false且没有循环,则猜想的变化为true

  • 如果Collat​​z为true,则变化为false

  • 如果Collat​​z为假,这既是因为它有循环,又是因为它有一个与之相背离的数字,那么猜想的变化是正确的(它只需要一个它有一个对分的数字而无需进入循环)。

我认为该变化更加有趣(不仅因为我偶然发现了它,而且感谢@LieuweVinkhuijzen注意到了它),还因为它实际上需要真实的证明。通过强行强制,我们也许可以找到一天或另一天的循环(这将是一个循环,循环长度超过70个数字:目前的最新状态是无限循环不能短于68个左右),并且可以通过蛮力强迫并不有趣:它只是数字运算。但是,我们不能强行强制一个无限的发散序列,我们不知道如果没有真实的证明,它是否真的会结束。

编辑:抱歉,我跳过了有关Collat​​z猜想的部分,我用几年前读到的算法真正地回答了我,我没想到已经提到过。

EDIT2:一条评论使我注意到我写了一个错误的算法,但是,这个错误的确使我的答案不同于Collat​​z猜想(但它是它的直接变体)。


1
input > 1input >= 11个421个

您是对的,我想输入一个>,但是只要我们没有暂停的证明,>就不能确定是否会到达1 -> 4 -> 2 -> 1循环(例如,如果循环不终止,>则不会) t到达>=
GameDeveloper

1
> =14211421> =>

2
ñ<1个ñ=1个ñ4ñ>1个ñ1个1个

1
没错:)您是对的,我应该在第一条评论中添加“如果Collat​​z猜想是真的”。我看到您的编辑,非常好。您不需要第二个程序,因为猜想“此程序永远不会进入相同的状态两次”也无法在第一个程序中解决:有可能存在一个不会发散到无穷大的数,而是卡在了一个很大的循环。
Lieuwe Vinkhuijzen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.