见证数学软件


11

与许多人一样,我是Mathematica和Maple等数学软件的热衷用户。但是,对于这样的软件在没有警告的情况下给您错误答案的许多情况,我感到越来越沮丧。在执行许多其他示例中的从简单总和优化的各种操作时,可能会发生这种情况。

我一直在想如何解决这个严重的问题。所需要的是允许用户验证给出的答案的正确性的某种方式,以使他们对被告知的内容具有一定的信心。如果您想从数学同事那里获得解决方案,她/他可能会坐下来向您展示他们的工作。但是,这在大多数情况下对于计算机而言是不可行的。相反,计算机能否为您提供一个简单且易于检查的见证人,以证明他们答案的正确性?检查可能必须由计算机完成,但是希望检查检查算法比首先检查产生证人的检查算法容易得多。什么时候可行,如何将其正式化?

总而言之,我的问题如下。

至少在理论上,数学软件是否可以提供简短的可检验证据以及您所要求的答案?

我们可以立即执行此操作的一个简单案例是将整数当然分解或分解为许多经典的NP完全问题(例如哈密顿回路等)。


您能否举一个例子,说明所产生的答案是错误的?当然可以生成可验证的计算正确性证明,但是这种证明不必手动检查就可以了,仅因为该软件通常使用高度非平凡的算法,比最直观的算法更有效。
Mahdi Cheraghchi 2013年

我在问题中给出了两个示例,但是链接颜色可能不容易看到。单击“总和”或“优化”。

1
Manuel Blum和Sampath Kannan在dl.acm.org/citation.cfm?id=200880中做了什么
Andrej Bauer


是的,太多的符号软件系统被视为“黑匣子”,这也是保护商业秘密的公司策略。(1)尝试开源替代方案(2)考虑软件工程的“最佳实践”的“单元测试”。简而言之,想法是创建结果的“合理性检查”,例如通过将已知值,其他操作,反函数等代入构造良好的测试中,公式和测试都不太可能以某种方式失败一个“假阳性”。
vzn

Answers:


5
  1. “证人”或“可检查证明”的概念并不是全新的:如评论中所述,寻找“证书”的概念。我想到了三个例子,还有更多(在评论中和其他地方):

    • 库特·梅尔霍恩(Kurt Mehlhorn)在1999年描述了计算几何算法中的一个类似问题(例如,坐标中的微小错误可能会导致某些算法的结果产生较大错误),并通过坚持要求每种算法都产生一个“证书”,在Leda库中以类似的方式解决。除了答案本身之外。

    • Demaine,Lopez-Ortiz和Munro在2000年使用证书的概念(它们称为“证明”)来显示有序集的并集和交集(和差异,但这一点微不足道)的自适应下界。不要排除他们的工作,因为他们没有使用证书来防止计算错误:他们表明,即使在最坏的情况下证书的大小可以是线性的,它也通常较短,因此可以“检查”在次线性时间内(以排序数组或B树的形式随机访问输入),尤其是时间少于计算此类证书所需的时间。

    • 自从看到Ian Munro在Alenex 2001上介绍了证书的实现以来,我一直在使用证书的概念,尤其是对于排列(对于无耻插件的道歉,即将到来),证书在最佳情况下会更短比最坏情况或平均情况下的情况要好,这会产生用于排列的压缩数据结构。同样,检查证书(即订单)最多需要线性时间,而不是计算(即排序)时间。

  2. 这个概念并不总是对错误检查有用:存在一些问题,即检查证书需要花费与生成证书(或仅生成结果)一样多的时间。我想到了两个例子,一个琐碎而又一个复杂,布鲁姆和坎南(在评论中提到)给了其他例子。

    • ññ
    • 如果按随机顺序给出点,则二维和凸面凸包的证书将花费与比较相比要编码的位数,从而计算出[FOCS 2009](其他无耻塞子)。

Leda库(我知道)是使确定性证书生成算法成为实践中最普遍的工作(我知道)。我看到Blum和Kannan的论文是使它成为理论上的规范的最大努力,但它们确实显示了这种方法的局限性。

希望能帮助到你...


谢谢,这很有趣。关于你的观点2.我认为我在谈论一些不同的东西。问题不是代码中的错误,而是我们知道的算法可能给出错误的答案。而且,在平凡的水平上,我什至不知道对许多数学函数有用的证书会是什么样。例如,对于无穷大的总和,或者说函数的最小化。

要稍微清楚一点。似乎很难为许多数学问题设计出可证明正确的算法。但是,由于实际原因,我们所使用的算法可能会犯错误而不会警告我们(实际上证明是错误的)。希望不难为同一组问题设计可证明的正确性检查器。

我的专业知识与我相去甚远,但我认为计算错误通常是由基本操作(乘法,除法等)的具有中间结果的舍入错误(在激发Leda的示例中很明显)引起的,而不是错误。在算法中。我会以为像Maple和Matlab这样的代数系统会避免这些问题:(
Jeremy

这是一个有趣的问题,也许这里的人肯定知道。。但是,我所说的许多错误答案都不是用于数值计算的,因此至少从表面上看,这些问题比您描述的要多。我不知道计算极限/无穷大等的复杂性,但我认为一般来说,在最坏的情况下它们是棘手的,因此有时需要/有用的试探法会给出错误的答案。 mathematica.stackexchange.com/questions/tagged/bugs并不能使您对出错的地方有所了解。

理论CS具有自我测试的概念,适用于线性代数中的许多问题。基本思想之一是,对于许多问题,解决方案的检查(可能仅带有少量额外信息)比计算起来更容易。参见例如https://doi.org/10.1016/0022-0000(93)90044-W
Neal Young
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.