函数置换整数的算法

时间:2010-10-29 22:53:14

标签: algorithm integer unique permutation

我想写一些函数如下

  

y = f(x)和另一个函数,
  x = g(y)充当可逆的,其中
  y = f(g(y))并且其中x和y是置换整数。

对于0到10整数范围内的非常简单的示例,它将如下所示:

0->1  
1->2  
2->3  
...  
9->10  
10->0 

但这是最简单的方法,通过添加1并通过减去1进行反转。

我希望有一个更加软化的算法,可以执行以下操作,

234927773->4299  
34->33928830  
850033->23234243423  

但反过来可以通过转换获得

可以使用存储成对唯一整数的巨大表来获得解决方案,但这不正确。这必须是一个功能。

3 个答案:

答案 0 :(得分:1)

你可以只是XOR。

y = x XOR p
x = y XOR p

虽然不是我的专业领域,但我认为密码学应该为您的问题提供一些有价值的答案。

答案 1 :(得分:1)

如果排列的域是2的幂,则可以使用任何分组密码:'f'是使用特定密钥加密,'g'是使用相同密钥进行解密。如果您的域名不是2的幂,您仍然可以使用分组密码:请参阅this article

答案 2 :(得分:0)

您可以使用多项式插值方法以单向插值函数,然后执行反向插值以查找反函数。

以下是MATLAB中的一些示例代码:

function [a] = Coef(x, y)
    n = length(x);

    a = y;
    for j = 2:n
        for i = n:-1:j
            a(i) = (a(i) - a(i-1)) / (x(i) - x(i-j+1));
        end
    end
end

function [val] = Eval(x, a, t)
    n = length(x);

    val = a(n);
    for i = n-1:-1:1
       val = a(i) + val*(t-x(i)); 
    end
end

它构建一个Divided Difference表,并根据Newtons Interpolation评估函数。

然后,如果你的点集是x和y(作为相同长度的向量,其中x(i)与y(i)匹配,则值为n的前向插值函数将为Eval(x, Coef(x, y), n)并且反向插值函数为Eval(y, Coef(y, x), n)

根据您的语言,可能会有更简洁的方法来执行此操作,但这会因数学而变得肮脏。

以下是我在“数值方法”课程中使用的教科书的摘录:Google Book Link