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

A bijective function from N*N*N to N

任何人都可以帮助我从 N * N * N → N 中找到一个双射数学函数,该函数采用三个参数 x、y 和 z 以及 returns 一个数字 n?

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

将 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
F(x,y,z) = 2^x*3^y*5^z

事实上,您可以选择任意一组不同的素数。而逆就是简单地分解成相应的质因数。

你的函数不是满射的,设 p 是质数,我们在 N 中找不到任何 x,y,z 使得 p=2^x3^y5^z...