Kolmogorov-复杂度定义的等价


20

定义Kolmogorov复杂度的方法有很多,通常,所有这些定义在加法常数之前都是等效的。也就是说,如果和是kolmogorov复杂度函数(通过不同的语言或模型定义),则存在常数使得对于每个字符串,。我相信这是因为对于每个Kolmogorov复杂度函数以及对于每个它都认为,对于某些常数。K1K2cx|K1(x)K2(x)|<cKxK(x)|x|+cc

我对以下基于图灵机的定义感兴趣K

  1. 状态数:将定义为最小数,以使具有个状态的TM 在空字符串上输出。K1(x)qqx
  2. 程序长度:将定义为输出的最短“程序” 。即,修复一种将TM编码为二进制字符串的方法;对于机器其(二进制)编码表示为。 其中最小值在空输入上输出x的所有M上。K2(x)xMMK2(x)=min|M|Mx

K1K2等同?它们之间是什么关系,如果它们不相等,哪一个可以更好地理解Kolmogorov复杂性的概念。

令我特别困扰的xK2K的增加率,它似乎不是超线性的(或者至少在常数C> 1的情况下是线性的,使得K_2 <C | x |而不是| x | + c)。考虑输出x的最简单的TM- 仅将x编码为其状态和转移函数的一部分的TM 。立即看到 K_1(x)\ le | x | +1。但是,同一台机器的编码要大得多,而我得到的琐碎边界是K_2(x)\ le | x | \ log | x | xC>1K2<C|x||x|+cxxK1(x)|x|+1K2(x)|x|log|x|


超过2n2机器具有n个状态,并且它们的平均大小至少为n2,因此这些机器仅相差一个加法常数不太可能。
卡夫

1
有一个众所周知的界,即对于一些不依赖固定。这是因为我们可以编码成只是加倍的每一位无前缀语言,然后用结束。这需要位代表。因此,因为是根据通用无前缀机器定义的,用于固定。通过使用更智能的方式将编码为无前缀语言,可以对此进行一些改进。K2(x)c+2|x|cxxx012|x|+2xK2K2(x)2|x|+2+ccx
卡尔·默默特

我看不出来 似乎是作为编码的一部分给出的(作为原始数据),或者您必须由状态机构造。第一个选项似乎在作弊,我看不出它可以与第二个选项相提并论(这意味着)xxK1
Ran G.

@Ran G .:关键是在en.wikipedia.org/wiki/Invariance_theorem中描述的不变性定理。如果我能描述增长率为有效系统,那么通用图灵机(如您对描述)将在加法常数内满足此要求。通用机器是输入的机器,如果暂停,则返回的输出。2|x|K2MMM
卡尔·默默特

Answers:


6

谨此向您道歉,因为我放弃了太多的细节,但我将要与其他人矛盾。

K(x)K(x)+c

通常来自描述语言#2 的解释器到描述语言#1 的事实,而不是来自#2程序到#1程序的翻译。K1(x)K2(x)+c

例如,,您可以这样简单地得到不等式:KC(x)KPython(x)+cpy2c

void py_run(char * s) {
    // code of your Python interpreter
}

int main(void) {
    py_run("Put here your Python program of size Kpython(x)");
}

然后您的常数将类似于,其中是此代码的位数,而位是使用C语言编写的官方Python解释器的大小。当然,您只需要解释可能的内容使用Python的描述语言,因此您可以做得比69 MB好:-)cpy2c528+490240688528490240688

重要的是您可以在C代码中线性编写Python程序。例如,一种需要在每个字符之间放置“ BANANA”的语言不是一个很好的描述程序,因此该属性为false。(但是,如果描述语言授权您将数据写入单独的文件或块中,则此问题将消失)

为什么您的有缺陷K1(x)=q

与你的定义问题是,你可能需要超过位来描述一个图灵机与状态,因为你需要编码转换。K1qq

因此,没有和可能不是等效的,但这主要是的错误。我认为我们可以证明对于所有都有一个,使得。当然,任何都足以证明不是有效函数这一事实,因为这意味着我们可以将长度为所有可能的字符串编码成位。K1K2K1a>0caK1(x)a|x|+caa<1K12nnan+ca

但是,在构建图灵机时,尺寸是一个难以置信的紧密边界。这个想法是,在个状态的块中,有种方法来查找每个状态的跃迁,这比填充位的通常种方法要好。然后,您可以在每个块中存储位信息。(不是因为您必须以一种或另一种方式进入和退出块)bb2b2bblog2b2log2b

所以,是的。。。如果块的大小为,则可以证明。但是我已经写了太多关于为什么状态数不是有效的Kolmogorov复杂度函数的方法。如果您想让我详细说明,我会的。21/aK1(x)a|x|+ca

现在关于K2

天真的描述语言大致对应于(即,每个下一个状态的以及有关写入和终止的详细信息)。K2(x)=q2(log2q+2)log2q

就像您看起来的那样,我深信,一种更好的/更骗人的方法是授权将“数据”编码到Turing机器中,也许是通过在描述语言中添加一个二进制标记来说明状态是否为数据状态(只是写了一点,然后转到下一个状态),或者是否执行了其他操作。这样,您可以用一种描述性语言来存储。x

但是,如果保持相同的,则可以使用我在上一部分中使用的相同技术来节省一些位,但是我似乎陷入了(对于任何)..可能小于,即使,但获得似乎很困难。(而且我希望它应该是,甚至不应该是。)K2K2(x)a|x|log|x|+ca>0log|x|O(|x|)|x|O(|x|)


您是否声称不是kolmogorov复杂度函数?这对我来说非常令人惊讶,因为实际上是我曾经参加过的可计算性课程的某种归纳法(不是说它的正确性)。K1K1
Ran G.

那么,的事实非常令人不安。考虑一下:有位的可能字,您可以使用位对它们进行编码吗?这意味着(您的编码必须是单射的)K1(x)12|x|+c2nn12n+c2n=O(212n)
jmad 2012年

如果python程序具有C保留的字符怎么办?
PyRulez
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.