从 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...
任何人都可以帮助我从 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...