2010-10-29 73 views
-1

欲写一些功能如下算法重排列整数

Y = F(x)和另一个功能,
X =克(Y)充当可逆的,其中
ÿ功能= f(g(y)),其中x和y是置换整数。

对于整数的0至10范围内非常简单的例子,将看起来像这样:

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

但是这是最简单的方法通过将1和通过减去1

倒车

我希望有一个更sofisticated算法,可以做到以下几点,

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

,但可以得到相反的b y转换

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

+0

您正在寻找* any *排列?没有更多的要求?这种形式很难回答,因为有无数的解决问题的办法(例如颠倒数字)。 – 2010-10-29 23:27:58

+0

你对算法的设计更感兴趣吗?或者你会如何在代码中实现它?如果代码存在,可以为你做这件事。 – Wesley 2010-10-30 00:17:05

回答

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 

它建立一个分差表格和评估基于牛顿插值功能。那么如果你的点集合是x和y(作为相同长度的向量,其中x(i)与y(i)相匹配,则在值n处的前向插值函数将是Eval(x, Coef(x, y), n)并且反向插值函数将Eval(y, Coef(y, x), n)

不同的语言,有可能是更清洁的方式来做到这一点,不过这样会下来,脏与数学。

下面是书中的文字这是在使用的摘录我数值方法类:Google Book Link

1

你可以只是XO R.

y = x XOR p 
x = y XOR p 

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

1

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