任何人都可以帮我找到一个N * N * N→N的双射数学函数,它取三个参数x,y和z并返回一个数字n?
我想知道函数f及其逆f',如果我有n,我将能够通过应用f'(n)来确定x,y,z。
假设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的问题。
g(x,y)=(x + y)(x + y + 1)/ 2 + y = n
g-1(n)=(x,y)其中m =⌊(2n)1 /2⌋并且恰好以下两个条件之一成立。
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
实际上,您可以选择任何不同的素数集。而逆则只是通过分解为相应的素因子。