从N * N * N到N的双射函数

时间:2015-02-19 22:41:00

标签: python function math 3d

任何人都可以帮我找到一个N * N * N→N的双射数学函数,它取三个参数x,y和z并返回一个数字n?

我想知道函数f及其反函数f'以某种方式,如果我有n,我将能够通过应用f'(n)来确定x,y,z。

2 个答案:

答案 0 :(得分:3)

将f定义为更简单函数g

的组合

假设g是从N×N到N的双射,并且令g -1 是它的逆。然后我们可以用g来定义f如下。

f(x,y,z)= g(g(x,y),z)= n

f -1 (n)=(x,y,z)其中g -1 (n)=(w,z)且g - 1 (w)=(x,y)

将g定义为从N×N到N

的双射

我们现在有一个更简单的定义g的问题。

g(x,y)=(x + y)(x + y + 1)/ 2 + y = n

g -1 (n)=(x,y)其中m =⌊(2n) 1/2 ⌋,并且恰好以下两个条件之一成立。

  • x + y = m和y = n - m(m + 1)/ 2

  • x + y = m - 1且y = n - m(m - 1)/ 2

Python实现

def f(x, y, z):
    return g(g(x, y), z)

def f_inv(n):
    w, z = g_inv(n)
    x, y = g_inv(w)
    return (x, y, z)

def g(x, y):
    return (x + y) * (x + y + 1) / 2 + y

def g_inv(n):
    m = math.floor(math.sqrt(2 * n))
    while True:
        y = n - m * (m + 1) / 2
        if y >= 0:
            break
        m -= 1
    x = m - y
    return x, y

答案 1 :(得分:0)

F(x,y,z) = 2^x*3^y*5^z

实际上,您可以选择任何不同的素数集。逆就是简单地通过分解为相应的素因数。