反转程序的例程
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)
。选择哪个值? a
或 b
.
- 满射性:对于任何
y
,必须存在 x
,使得 f(x) = y
,如果 y
是 f
的余域的一个元素.为什么?考虑 f
的反转:f^-1(y) = x
。此 必须 为 f
的共同域中的任何 y
定义,否则我们对某些 y
. 有未定义的行为
一旦您的程序违反了这些规则中的任何一条,它将不可逆转。
编写将执行以下任务的例程: 任务:
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)
。选择哪个值?a
或b
. - 满射性:对于任何
y
,必须存在x
,使得f(x) = y
,如果y
是f
的余域的一个元素.为什么?考虑f
的反转:f^-1(y) = x
。此 必须 为f
的共同域中的任何y
定义,否则我们对某些y
. 有未定义的行为
一旦您的程序违反了这些规则中的任何一条,它将不可逆转。