问题描述
我正在使用Cantor配对功能,该功能需要两个实数输出唯一的实数。
def cantor_paring(a,b):
return (1/2)*(a+b)*(a+b+1) + b
当输入对数较小时,这对我来说很好。
cantor_paring(3,5)
41.0
但是,当输入对数很大时,输出将变得非常大。
cantor_paring(195149767,9877)
1.9043643420693068e+16
现在的问题是,有没有办法调整对函数,以便即使输入较大的数字,输出也相对较小。
解决方法
由于浮点数精度的限制,Cantor配对不适用于浮点数,原因是:
- 一些不同的对可能会得出相同的结果
- 检索a,b可能会赋予与以前不同的值
对于整数(包括长算术),您必须使用
return (a+b)*(a+b+1) // 2 + b
,
对于任何输入,您的函数都满足abs(cantor_pairing(a,b)) = O(max(a^2,b^2))
。因此,通过取cantor_pairing(a,b)
的第三个根,限制将为max(abs(a)^(2/3),abs(b)^(2/3)) = O(max(abs(a),abs(b))
。由于第三个根对实数是双射的,因此将保留cantor_pairing
保证的唯一性。另外,您可以使用几乎任何其他奇数根。
-
该函数不是“指数”函数,而是二次函数。
-
您的询问是不可能的。您需要一个函数来返回n²对(a,b)的唯一数字,因此无论编码如何,都需要n²个不同的整数来实现。
-
使用浮点数这样做没有多大意义。