反转Arnold的Cat地图 - 负数组索引

时间:2015-09-26 16:40:51

标签: image encryption shuffle pixels

我正在尝试使用以下公式为N * N图像实现Arnold's Cat map

            for (int i = 0; i < N; i++) {  
                for (int j = 0; j < N; j++) {  
                  desMatrix[(i + j) % N][(i + 2 * j) % N] = srcMatrix[i][j];  
                }  
            }

要反转我所做的过程:

            for (int i = 0; i < N; i++) {  
                for (int j = 0; j < N; j++) {  
                  srcMatrix[(j-i) % N][(2*i-j) % N] = destMatrix[i][j];  
                }  
            }

实施是否正确?

在我看来,对于j和i的某些值,我可能从(j-i)和(2 * i-j)得到负指数;我应该如何处理这些情况,因为矩阵指数只是正数?

1 个答案:

答案 0 :(得分:0)

通常,当模数(%)操作需要处理负索引时,您可以根据需要简单地添加模数参数。由于

x % N  == ( x + a*N ) % N

对于所有自然a,并且在这种情况下你有i和j约束在[0,N],那么你可以写(N + i - j)并确保即使我是0和j是N-1(或者甚至是N),结果总是非负的。出于同样的原因,(2 * N + i - 2 * j)或等效(i + 2 *(N-j))总是非负的。

但在这种情况下,这不是必需的。要反转地图,您将重复前进步骤撤消分配。由于矩阵具有一元行列式并且是面积保持的,因此您可以确保最终获得所有积分(即覆盖M(i + 1)将产生M(i)的覆盖)。 / p>

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        newMatrix[i][j] = desMatrix[(i + j) % N][(i + 2 * j) % N];
    }
}

此时newMatrix和srcMatrix应该完全相同。

(实际上,您已经将反向转换作为前向转换了。我设置的转换为你的转换是一种常用的形式。正向转型)。