我想写一些函数如下
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
但反过来可以通过转换获得
可以使用存储成对唯一整数的巨大表来获得解决方案,但这不正确。这必须是一个功能。
答案 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