【问题标题】:How would you write ∀ y ∈ R+, ∃ z ∈ R, e^z = y in pseudocode?你会如何用伪代码写出 ∀ y ∈ R+, ∃ z ∈ R, e^z = y?
【发布时间】:2017-05-16 19:22:13
【问题描述】:

我正在阅读有关证明的内容,目前正在阅读 Eric Lehman 和 Tom Leighton 的《计算机科学数学》,他们在一个示例命题中说明了“当 z 的范围超过实数时,e^z 在至少一次”。我无法完全理解这个命题。

我试图以程序员的身份来解决这个问题,并想一想如果我要看看它是否为真,它在伪代码中会是什么样子。

pr = [ all real positive numbers ]
r  = [ all real numbers ]

for y in pr:
    for z in r:

        e = pow(y, z)
        if e != y:
            goto outer

        print "this is true";

    outer

这是他们的提议吗?

【问题讨论】:

  • 这实际上是一个很棒的问题。很高兴在 stackoverflow 上看到更多算法和数学的东西。
  • "pr = [ all real positive numbers ] r = [ all real numbers ]" 这些已经是一个问题,因为它们不仅无限多,而且大多数甚至不可计算。
  • @G.Bach 我已经在下面提到了。问题不是创建一个实际的程序,而是看看它在伪代码算法中的样子。
  • 您似乎在以一种有趣的方式使用e。在数学中,e 是一个常数——它不能被赋值。你可能想要x = pow(e, z)x = exp(z) 之类的东西。
  • @anatolyg 这是很好的上下文,我对 e 是什么感到困惑。

标签: algorithm math computer-science proof


【解决方案1】:

∀ y ∈ R+, ∃ z ∈ R, e^z = y

是说对于正实数集中的所有y,在实数集中存在一个z,这样exp(z) = y

您无法真正创建一个程序来验证这是否属实。主要是因为你会遇到以下问题之一

  1. 浮点数学不精确(必读Is floating point math broken?
  2. 现实是无限的

你可以检查每个浮点数(这需要很长时间,但理论上仍然可以计算),但你会

  1. 可能会想出没有z 这样exp(z) = y 的情况,因为这样的z 在浮点数集中不存在足够给你exp(z) = y
  2. 即使浮点数集中的每个 y 都有一个 z,这也不能证明 R+ 中的所有 y 和 R 中的所有 z 都有 exp(z) = y

所以总的来说,是的,你的伪代码在某种程度上代表了这个想法,但是在计算机上检查这个或者真的把它当作一个计算问题来考虑是不可行或不合逻辑的。

编辑: 以编程方式思考这个问题的最佳方式是这样的

R = [SET OF ALL REALS]
R+ = FILTER (> 0) R
(MAP (exp) R) == R+

注意 exp 表示e^n 其中e^x = SUM [ (x^k)/(k!) | k <- [SET OF ALL NATURALS]] 大约是2.718^x

【讨论】:

  • @CarlosGranados 你走在正确的轨道上。我刚刚进行的编辑实际上可能对您也有用(如果您完全进行函数式编程)
  • 实数是无限的这一事实本身并不是问题。如果命题为真,并且实数是可数(准确地说是递归可枚举),那么这个想法就会奏效:对于每个y 这样的z最终会被发现。实数是无限无限,因此不可枚举,这是实际的障碍。
  • @lisyarus 一个无限可数集不能在计算机上合法地迭代。蛮力强制可数无限集是 O(n),其中 n = 无穷大。 (即使是 aleph-0)
  • @EliSadoff Brute 强制一个可数集合,前提是我们要搜索的元素属于该集合,最终会停止(理论上),这在可计算性理论中很重要。当然,由于物理限制,这在实践中是不可行的。我只是想指出这个精确的区别。
  • @lisyarus “最终停止”——这不是真的;真实的是,对于每个元素,它都会在有限的时间后被处理。
【解决方案2】:

如果您认为可以枚举所有正实数,而且在有限时间内这样做,那么您的思想实验的伪代码可能看起来更像这样:

pr = [ all real positive numbers ]
r  = [ all real numbers ]

for y in pr:
    for z in r:
        e = exp(z)
        if e == y:
            goto outer

    print "false"
    stop

    outer:

print "true"

与您的伪代码的主要区别是:

  • (技术)将 pow(y, z) 更改为 exp(z)。这是z 上的指数函数,或者等效地,数字 ezth 次幂

  • 仅当外部循环运行完成时,该命题才被认为是正确的(并且算法会打印该结果)

  • 如果在外部循环的任何迭代中,内部循环确实运行到完成(表明该迭代的 y 不是任何实数的指数number) 那么这个命题被证明是错误的。在这种情况下,算法会打印该结果并停止。整个命题只需要一个这样的实数y

当然,描述这个命题的一种完全不同的数学方式是,它说自然对数是定义的,并且对于所有正实参数都计算为一个实数。这是因为自然对数是指数的倒数,所以如果你取e^z = y两边的对数,你会得到z = log(y)

【讨论】:

    【解决方案3】:

    该命题由一个程序证明,该程序将在给定任何 y ∈ R+ 的情况下找到 z ∈ R,所以:

    z = log(y);
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2015-03-16
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2020-03-19
      相关资源
      最近更新 更多