我有一个简单的功能:
def f(x,y):
return y * 2 ** x
,其中x
可以是[0,14]
中的整数,y
可以是[0, 255]
中的整数。
我尝试编写一个python函数,在上面给定的时间间隔内查找(x, y)
对,f(x, y)
范围内[0, 200000]
的任何值。
我对蛮力以外的解决方案感兴趣,如果有的话。
下面的蛮力版本:
def inverse_f(value, delta):
results = []
for x in range(0, 10):
for y in range(0, 255):
candidate = 2 ** x * y
if value - delta <= candidate <= value + delta:
results.append((x, y, candidate))
return results
>>> inverse_f(10, 1)
>>> [(0, 9, 9), (0, 10, 10), (0, 11, 11), (1, 5, 10)]
>>> inverse_f(10, 0)
>>> [(0, 10, 10), (1, 5, 10)]
答案 0 :(得分:0)
我忽略了常数c,因为如果你知道它并得到一个结果,那就把c除掉。然后继续进行,好像c不存在并且f(x,y)= 2 ^ x * y
给定值可以有多种解决方案。例如,如果x = 7且y = 5,则得到与x = 6和y = 10相同的结果。因此,我们设定了一些选择独特逆的政策。
最简单的似乎是:只计算右端的零。这告诉你x。从右到左看,跟随零的一串位,直到最重要的设置位,告诉你y。
1011100000 given result
100000 x=5
* 10111 y=23
或者,政策可以是使y尽可能大。找到最重要的'1',从左边开始,然后在它的右边再加7个位。然后看看剩下多少比特来获得x
1011100000 given result
^ most sig non-zero bit is here
10111000 take eight bits for y=184
* 100 this times y is result; conclude x=2
我的大脑并没有想出一个超级光滑的方法来做到这一点;我所写的就是“好”的时尚位变换和保持计数在'for'循环中。如果您是在机器代码级别编写的,那么您的CPU可能会有位位置指令以快速完成此操作。