计算机科学

为学生,研究人员和计算机科学从业者提供的问答

1
希尔伯特(Hilbert)的第十个问题和柴廷(Chaitin)的丢番图方程“计算机”?
在Chaitin的Meta Math中!在《寻找欧米茄》中,他简短地谈到了希尔伯特的第十个问题。然后他说,任何Diophantine方程都可以变成两个正整数系数相等的多项式:p = 0p = 0p=0p=0。p = 0⟺p1个= p2p=0⟺p1=p2p=0 \iff p_1 = p_2 然后他说我们可以将这些等式想像成“计算机”: 不定方程计算机: 程序:ķ,输出:Ñ,时间:X ,ÿ ,ž ,。。。L (k ,n ,x ,y,ž,。。。)= R (k ,n ,x ,y,ž,。。。)L(k,n,x,y,z,...)=R(k,n,x,y,z,...)L(k,n,x,y,z,...)=R(k,n,x,y,z,...) ķkk ñnn X ,ÿ,ž,。。。x,y,z,...x,y,z,... 与左侧,右侧ř。他说k是这台计算机的程序,输出n。他还说,未知数是一个多维时间变量。大号LL[RRRķkkñnn 令我感到困惑的是,他然后说希尔伯特的第十个问题从这种角度来看显然无法解决。他基本上说“由于图灵的停顿问题”。但是我看不到这种联系(我才刚刚开始学习理论)。我希望有人能更清楚地解释柴廷的观点。 我知道,图灵的暂停问题基本上表明您无法在程序实际停止之前(给定的时间)预测何时停止。使用柴廷(Chaitin)提出的符号,对希尔伯特(Hilbert)的第十个问题有什么应用?

1
端到端原则可以形式化吗?
在1990年代后期,当我还在读研究生时, JH Saltzer;DP芦苇; DD Clark:系统设计中的端到端参数。ACM Trans。计算 Syst。2(4):277-288,1984.DOI = 10.1145 / 357401.357402 在每所大学的每个操作系统课程中,几乎都需要阅读该书,而且它似乎仍然是互联网设计的主要指导原则之一。(例如:参见J Kempf,R Austein编辑)和IAB,“ 中间的兴起和端对端的未来:对Internet体系结构演进的思考 ”,RFC 3724,2004年3月。 ) 端到端原理说明(Saltzer等人,1984): [如果]仅在站在通信系统端点的应用程序的知识和帮助下,才能完全正确地实现所讨论的功能,...,前提是所质疑的功能不是通信系统本身的功能可能。[尽管]有时,通信系统提供的功能的不完整版本可能有助于提高性能。 或更简单地(摘自摘要): 端到端的论点表明,与以较低级别提供功能相比,放置在系统较低级别上的功能可能是多余的或价值很小。 但是以我自己的经验(在计算机体系结构中,而不是在互联网体系结构中)应用端到端原理并没有取得什么成功。由于该原则被说成是“诗”(即,英语散文中有许多数学上没有定义的术语),因此很容易自欺欺人地认为:“所讨论的功能只有通过以下方式才能完全正确地实现:应用程序的知识和帮助。” 但是什么是“所讨论的功能”,更不用说应用程序的“知识和帮助”了? 示例:片上网络(与Internet不同)不允许丢弃数据包,但是缓冲非常有限,因此您需要采取某种措施来避免死锁或从死锁中恢复。另一方面,应用程序也需要使其自身无死锁,对吗?因此,我可能会以为我应该使常见情况(无死锁)变快,并在应用程序上避免死锁。实际上,这就是我们在Alewife和Fugu上尝试过的方法(Mackenzie等人,“ 利用两箱式邮件传递以进行快速保护的消息传递”,《国际Symp高性能复合拱门》(HPCA-4):231-242, 1998年。或约翰·库比亚托维奇(John Kubiatowicz)的论文。“它”有效“(通过在缓冲区已满时使互连中断处理器,并通过软件缓冲使OS扩展),但我在学术界或行业中都没有见过任何人(包括我们中的任何人) HPCA论文)竞相尝试复制该想法。因此,显然,避免网络中的死锁与避免应用程序级死锁是不同的“问题功能”,否则端到端原理是错误的。 可以将端到端原理从“诗”转变为定理吗?或者至少可以用计算机架构师可以理解的术语来表述?

9
表示实数而不会丢失精度
当前浮点(ANSI C浮点数,双精度)允许表示实数的近似值。 有没有办法表示实数而没有错误? 这是我的一个主意,绝非完美。 例如,1/3是0.33333333 ...(以10为底)或o.01010101 ...(以2为底),也是0.1(以3为底) 是实现这个“结构”的好主意: base, mantissa, exponent 所以1/3可能是3 ^ -1 {[11] = base 3, [1.0] mantissa, [-1] exponent} 还有其他想法吗?

3
为什么在复杂性理论中使用语言
我刚刚开始涉足计算理论,该理论研究可计算的内容,速度,使用多少内存以及使用哪种计算模型。 我有一个非常基本的问题,但我确实希望你们中的一些人可以帮助我理解其背后的概念: 为什么一切都围绕语言的概念和定义(即常规语言和上下文无关语言)进行?以及它们如何关联和描述算法的复杂性以及解决这些问题的可能的计算模型? 我阅读了以下相关问题: /cstheory/14811/what-is-the-enlightenment-im-supposed-to-attain-after-studying-有限自动机 /cstheory/8539/how-practical-is-automata-theory 但是我仍然无法回答我的疑问,因为它们为它们为什么重要(我确实理解)提供了实际的辩护,但并不能帮助我理解为什么复杂性理论基于它们。


3
为什么用米勒-拉宾代替费马素数检验?
从Miller-Rabin证明中,如果一个数字通过了Fermat素数检验,则它还必须通过具有相同底数(证明中的变量)的Miller-Rabin检验。而且计算复杂度是相同的。aaa 以下是来自Fermat素数测试的信息: 尽管Carmichael数比素数少得多,但其中1足够多,因此上述形式中经常不使用Fermat的素数检验。取而代之的是,更常使用Fermat测试的其他更强大的扩展,例如Baillie-PSW,Miller-Rabin和Solovay-Strassen。 米勒-拉宾(Miller-Rabin)有什么好处,为什么据说它比费马素数检验更强大?

2
我们能否从NP问题之间的Cook缩减中构造Karp缩减?
关于Cook和Karp约简的关系,我们有几个问题。显然,Cook约简(多项式时间Turing约简)与通常使用的Karp约简(多项式时间多一归约)没有定义相同的NP完整性概念。特别是,即使P NP ,Cook还原也无法将NP与co-NP分开。因此,我们不应该在典型的归约证明中使用Cook归约法。≠≠\neq 现在,学生们发现了一个经过同行评审的作品[1],该作品使用Cook归约法来表明问题是NP难题。我没有给他们从那里得到的减少的满分,但是我想知道。 因为库克还原法确实定义了与Karp还原法相似的硬度概念,所以我认为它们应该能够将N从NPC中分离出来。共同NPC,假设P NP。特别地,(类似)以下应为真:≠≠\neq L1∈NP,L2∈NPCKarp,L2≤CookL1⟹L1∈NPCKarpL1∈NP,L2∈NPCKarp,L2≤CookL1⟹L1∈NPCKarp\qquad\displaystyle L_1 \in \mathrm{NP}, L_2 \in \mathrm{NPC}_{\mathrm{Karp}}, L_2 \leq_{\mathrm{Cook}} L_1 \implies L_1 \in \mathrm{NPC}_{\mathrm{Karp}}。 重要的点是要避免上述不敏感的L1∈NPL1∈NPL_1 \in \mathrm{NP}。现在,根据NPC的定义,我们“知道” L2≤KarpL1L2≤KarpL1L_2 \leq_{\mathrm{Karp}} L_1。 正如Vor所指出的那样,这并不是那么容易(适应符号): 假设L1∈NPCCookL1∈NPCCookL_1 \in \mathrm{NPC}_{\mathrm{Cook}},然后根据定义,所有语言L2∈NPCKarp⊆NPL2∈NPCKarp⊆NPL_2 \in \mathrm{NPC}_{\mathrm{Karp}} \subseteq \mathrm{NP}我们有L2≤CookL1L2≤CookL1L_2 \leq_{\mathrm{Cook}} L_1;如果上述含义正确,则L1∈NPCKarpL1∈NPCKarpL_1 \in \mathrm{NPC}_{\mathrm{Karp}},因此NPCKarp=NPCCookNPCKarp=NPCCook\mathrm{NPC}_{\mathrm{Karp}} = \mathrm{NPC}_{\mathrm{Cook}}仍然是一个悬而未决的问题。 两个NPC之间可能存在其他差异,但共同NP。 如果没有,是否有任何已知的(非平凡的)判据可用于进行库克归约时隐含Karp-NP硬度,即我们是否知道谓词具有PPP L2∈NPCKarp,L2≤CookL1,P(L1,L2)⟹L1∈NPCKarpL2∈NPCKarp,L2≤CookL1,P(L1,L2)⟹L1∈NPCKarp\qquad\displaystyle L_2 \in \mathrm{NPC}_{\mathrm{Karp}}, L_2 \leq_{\mathrm{Cook}} L_1, P(L_1,L_2) …

1
线性规划的强对偶定理的简短证明
考虑线性程序 Primal:Ax⃗ ≤b⃗ maxc⃗ Tx⃗ Primal:Ax→≤b→maxc→Tx→\begin{array}{|ccc|} \hline Primal: & A\vec{x} \leq \vec{b} \hspace{.5cm} & \max \vec{c}^T\vec{x} \\ \hline \end{array} Dual:c⃗ ≤y⃗ TAminy⃗ Tb⃗ Dual:c→≤y→TAminy→Tb→\begin{array}{|ccc|} \hline Dual: & \vec{c} \leq \vec{y}^TA \hspace{.5cm} & \min \vec{y}^T\vec{b} \\ \hline \end{array} 弱对偶定理指出,如果x⃗ x→\vec{x}和y⃗ y→\vec{y}满足约束,则 c⃗ Tx⃗ ≤y⃗ Tb⃗ c→Tx→≤y→Tb→\vec{c}^T\vec{x} \leq \vec{y}^T\vec{b}。它具有使用线性代数的简短证明: c⃗ Tx⃗ ≤y⃗ …

2
如何讨论big-O表示法的系数
big-O表示法使用什么表示法来讨论函数系数? 我有两个功能: F(x )= 7 x2+ 4 x + 2f(x)=7x2+4x+2f(x) = 7x^2 + 4x +2 G(x )= 3 x2+ 5 x + 4g(x)=3x2+5x+4g(x) = 3x^2 + 5x +4 显然,这两个函数都是,实际上是Θ (x 2),但这不允许进行进一步的比较。我如何讨论系数7和3。将系数减小到3不会改变渐近复杂度,但仍然对运行时/内存使用产生重大影响。Ø (X2)O(x2)O(x^2)Θ (x2)Θ(x2)\Theta(x^2) 是不是错说是Ø (7 X 2)和G ^是Ø (3 X 2)?是否还有其他考虑系数的符号?或讨论此事的最佳方法是什么?FffO (7 x2)O(7x2)O(7x^2)GggO (3 x2)O(3x2)O(3x^2)

2
仅使用Hindley-Milner类型系统定义列表
我正在开发一个小型lambda演算编译器,该编译器具有运行正常的Hindley-Milner类型推断系统,并且现在还支持递归let(不在链接代码中),据我所知应该足以使Turing完成。 现在的问题是我不知道如何使它成为支持列表,或者它是否已经支持它们,我只需要找到一种编码它们的方法。我希望能够定义它们,而不必向类型系统中添加新规则。 我想到的一个列表的最简单方法x是将其作为null(或为空列表),或同时包含x和的列表对x。但是要做到这一点,我需要能够定义对和或,我相信它们是乘积和总和类型。 看来我可以这样定义对: pair = λabf.fab first = λp.p(λab.a) second = λp.p(λab.b) 因为pair将具有类型a -> (b -> ((a -> (b -> x)) -> x)),所以在传递一个int和一个后string,它会产生一个带有类型的东西(int -> (string -> x)) -> x,这将是一对intand 的表示string。这里令我困扰的是,如果那个代表一对,那为什么在逻辑上不等同于或暗示这个命题int and string呢?但是,等效于(((int and string) -> x) -> x),好像我只能将产品类型作为函数的参数一样。这个答案似乎解决了这个问题,但我不知道他使用的符号是什么意思。另外,如果这不能真正对产品类型进行编码,那么我对上面的对的定义无法做到的产品类型(考虑到我也可以用相同的方式定义n元组)做任何事情?如果不是,这是否与仅使用蕴涵就不能表达(AFAIK)连词的事实相矛盾? 另外,总和类型呢?我可以仅使用函数类型以某种方式对其进行编码吗?如果是这样,是否足以定义列表?否则,是否有其他方法可以定义列表而不必扩展我的类型系统?如果不是这样,如果我想使其尽可能简单,我需要进行哪些更改? 请记住,我是计算机程序员,但不是计算机科学家或数学家,并且在阅读数学符号方面相当不擅长。 编辑: 我不确定到目前为止实现的技术名称是什么,但是我所拥有的基本上只是上面链接的代码,这是一种约束生成算法,使用应用程序规则,抽象规则和变量先从Hinley-Milner算法开始,然后是获得主体类型的统一算法。例如,该表达式\a.a将产生type a -> a,并且该表达式\a.(a a)将引发一个发生检查错误。最重要的是,这里没有一个确切的let规则,但是一个函数似乎具有与您定义递归全局函数(如此伪代码)相同的作用: GetTypeOfGlobalFunction(term, globalScope, nameOfFunction) …

3
接线长度最小化
我的问题是这样的: 我有一个物理布局,以图形表示。节点表示导线可以锚固的钩子/管道,而“边缘”是导线可以通过的两个节点之间的可能连接。 有一些特殊的节点,称为分离器,从中可以将单根导线拆分为2根或更多至k根。目前可以将k取为常数,但是每个节点的k都不同。并非所有节点都是拆分器。 有一种电源可以从中伸出电线。它是源。电线必须连接到n个接收器。 一条边可以沿任意方向穿过任意数量的导线。 总导线长度必须最小化。 图形,平面或欧几里得的性质未知。 示例:下面是一个示例网络。节点以数字命名,并且边的权重等于1。源是Node1,接收器是Node5,Node9和Node13。在情况1中,Node6是Splitter节点。在情况2中,Node6和Node4是拆分器节点。分离器节点的k = 3,即,它可以接一根线并将其分成三根线。 案例1。仅一个拆分器节点。在Node6上拆分很有意义。 情况2。两个分离器节点。在Node4而不是Node6上拆分很有意义。 我正在寻找不同的策略来找到针对此问题的通用解决方案。与手头的问题相比,此处呈现的图的比例较小。该图是静态的,不能更改(我的意思是解决方案不应建议任何新的边缘或建议新的拆分器位置)。也欢迎任何引用有关此类问题的研究论文的参考。 案例3。两个分离器节点。在Node4和Node14处拆分很有意义。请注意,这种情况下边缘8-12、6-10和10-11的边缘权重已更改。在这种情况下,重要的是从Node14分离后重新布线。


4
在任何实际输入中,低阶项主导运行时间的算法示例?
大O表示法隐藏了常数因子,因此存在一些算法,这些算法对于任何合理的输入大小都不可行,因为项的系数非常大。O(n)Ø(ñ)O(n)nñn 是否存在任何已知的算法,其运行时间为但具有一些低阶项,其数量如此之大,以至于在合理的输入大小下,它完全主导了运行时间?我想在算法课程中使用像这样的算法作为示例,因为它提供了为什么不能使用big-O表示法的充分理由。O(f(n))Ø(F(ñ))O(f(n))o(f(n))Ø(F(ñ))o(f(n)) 谢谢!

2
清晰,完整的语言证明图灵竞争了吗?
我看到过一些网站声称“证明” HTML5 + CSS已经完成。 我见过一些网站声称“证明” SQL已经完成。 我已经看到了许多网站,它们声称“解释” Turing Complete的含义。 足够! 我在哪里可以找到一本书(由可计算性理论的专家撰写)或经过同行评审的文章(在著名的期刊中)显示以下证明:“这种语言XYZ能够描述具有相同计算能力的计算机作为图灵机”?

1
递归关系的渐近逼近(Akra-Bazzi似乎不适用)
假设算法具有运行时重复关系: T(n)={g(n)+T(n−1)+T(⌊δn⌋)f(n):n≥n0:n&lt;n0T(n)={g(n)+T(n−1)+T(⌊δn⌋):n≥n0f(n):n&lt;n0 T(n) = \left\{ \begin{array}{lr} g(n)+T(n-1) + T(\lfloor\delta n\rfloor ) & : n \ge n_0\\ f(n) & : n < n_0 \end{array} \right. 对于一些常数。假设是多项式,也许是二次的。最有可能在为指数。g n f n0&lt;δ&lt;10&lt;δ&lt;10 < \delta < 1gggnnnfffnnn 如何分析运行时(很好)?主定理和更一般的Akra-Bazzi方法似乎并不适用。ΘΘ\Theta

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.