∀ y ∈ R+, ∃ z ∈ R, e^z = y 用伪代码怎么写?

How would you write ∀ y ∈ R+, ∃ z ∈ R, e^z = y in pseudocode?

我正在阅读证明,目前正在阅读 Eric Lehman 和 Tom Leighton 撰写的计算机科学数学,他们在示例命题中说明了 "as z ranges over the real numbers, e^z takes on every positive, real value at least once"。我无法完全理解这个命题。

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

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

这是他们的提议吗?

∀ 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,这也不能证明 exp(z) = y 对于 R+ 中的所有 y 和 R 中的 z。

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

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

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

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

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

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 上的指数函数,或者等价地,数字 e 上升到 zth 功率

  • 仅当外循环运行完成时命题才为真(算法打印结果)

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

当然,描述该命题的一种完全不同的数学方法是,它表示自然对数已定义,并且对所有正实参求值为实数。这是因为自然对数是指数的倒数,所以如果你对 e^z = y 两边取对数,你会得到 z = log(y).

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

z = log(y);