反转程序的例程

A routine that reverses a program

编写将执行以下任务的例程: 任务:

1] 采用任何有效程序 in.prog,它采用输入 [n] 数组并输出输出 [k] 数组(n=k 或 n!=k)

2] 现在这个例程反转程序并输出 out.prog 另一个有效程序

3] out.prog 获取输出[k] 数组并输出输入[n] 数组(n=k 或 n!=k)

它刚刚命中 me.is 就可以为每个 in.prog 生成正确的 out.prog 吗? 对于简单的程序,如果我只是颠倒步骤或从下到上开始处理 相对于 in.prog 我应该得到一些输出 [k] 的输入 [n](有没有例外?)

如果我知道一个算法 A 为一些输入 [n] 产生输出 [k],是 总是可以设计另一种算法 A' 来做相反的事情吗? 我最感兴趣的是问题的数学细节。 有具体的名字吗?(方便搜索)

不,那不可能。举个小例子:假设程序对任何给定输入产生输出 {1}。反向程序现在必须将 {1} 转换为输入。

一点扩展:
这是相当数学化的,但我希望它是可以理解的。让我们将您的程序视为接受特定输入并产生特定输出的函数。现在我们必须确保几个因素才能使函数可逆:

  • 确定性:函数必须是确定性的才能可逆。例如。考虑一个具有真实 RNG 的程序。由于 RNG 的行为,我们无法还原程序。
  • 单射性:一个函数不能为两个不同的输入产生相同的输出才能可逆。很明显:考虑 f(a) = f(b) = 0,其中 a != b。现在我们想要 f^-1(0)。选择哪个值? ab.
  • 满射性:对于任何 y,必须存在 x,使得 f(x) = y,如果 yf 的余域的一个元素.为什么?考虑 f 的反转:f^-1(y) = x。此 必须 f 的共同域中的任何 y 定义,否则我们对某些 y.
  • 有未定义的行为

一旦您的程序违反了这些规则中的任何一条,它将不可逆转。