Python逆指数函数有两个变量

时间:2018-06-18 16:16:43

标签: python math

我有一个简单的功能:

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)]

1 个答案:

答案 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可能会有位位置指令以快速完成此操作。