Algorithm 配对函数-对于较大的实际输入,输出变为指数

Algorithm 配对函数-对于较大的实际输入,输出变为指数,algorithm,math,integer,mapping,deterministic,Algorithm,Math,Integer,Mapping,Deterministic,我使用的是一个康托配对函数,它将两个实数输出为唯一的实数 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 现在我的问题是,有没有一种方法可以调整pair函数,使输出即使对于较大的输入数也相对较小

我使用的是一个康托配对函数,它将两个实数输出为唯一的实数

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

现在我的问题是,有没有一种方法可以调整pair函数,使输出即使对于较大的输入数也相对较小。

对于任何输入,您的函数都满足abs(cantor_配对(a,b))=O(max(a^2,b^2))。因此,通过取cantor_配对(a,b)的第三根,极限将是
max(abs(a)^(2/3),abs(b)^(2/3))=O(max(abs(a),abs(b))
。由于第三个根是实数的双射根,所以只要有
康托配对
的保证,就可以保持唯一性。或者,您可以使用几乎任何其他奇数根。

由于浮点精度限制,康托配对不适用于浮点,因为:

  • 一些不同的对可能给出相同的结果
  • 检索a、b可能会给出与以前不同的值
对于整数(包括长算术),必须使用

return (a+b)*(a+b+1) // 2 + b
  • 函数不是“指数”,而是二次函数

  • 您所要求的是不可能的。您需要一个为n²对(a,b)返回唯一数字的函数,因此无论采用何种编码,都需要n²个不同的整数才能实现

  • 使用浮动进行此操作没有多大意义


  • 将Cantor配对函数与浮点数一起使用似乎是一个错误,大数字是不可避免的。您最好告诉我们您使用它的目的。单个数字不会变成任何东西,包括指数。您似乎正在使用Python(告诉或标记!):标准数字表示形式更改为“指数”对于足够大或足够小的数字。其二次型不是指数型…(a^2不是n^a),但仍然很大。:)如果结果是整数,则这不是问题。获得浮点数的唯一原因是1/2。从wiki和其他网站的canter\u paring定义来看,它是nxn->N(整数)中的一个函数,因此需要保持事物为整数。如果这是Python3。(从结果来看是这样的)改用//代替。所以:return((a+b)*(a+b+1))//2+b并且您不会对大小有任何问题,因为python将允许无限位int。