2010-10-29 79 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