public bool CheckReverse(int a)
{
int n = (int)zt;
int p = 2;
while(p*p<n)
{
if (a%p == n%p && 0 == a%p)
{
return false;
}
p++;
}
//when a equals with 1 , it's also reversiable
return true;
}
//得到元素a对n的模逆
public int GetReverse(int a)
{
int n = (int)zt;
int q, p, t;
int x = 0, y = 1, z;
q = n;
p = a;
z = (int)q / p;
while (1 != p && 1 != q)
{
t = p;
p = q % p;
q = t;
t = y;
y = x - y * z;
x = t;
z = (int)q / p;
}
y = y % n;
if (y < 0)
{
y += n;
}
//when a equals with 1 , it return 1.
return y;
}
//使用纯整数初等变换法计算M的希尔逆矩阵.
public bool Calc_M_1()
{
int[,] A = new int[nRank, nRank * 2];
int[] T = new int[nRank*2];
int i,j,k;
//construct the [M|E] matrix A
for (i = 0; i < nRank;++i)
{
for (j = 0; j < nRank * 2;++j)
{
if (j<nRank)
{
A[i, j] = nMatrix[i, j];
}
else
{
if (nRank == j-i)
{
A[i, j] = 1;
}
else
{
A[i, j] = 0;
}
}
}
}
//begin to metamorphose A
int a_1 = 0;
for (j = 0; j < nRank;++j)
{
//step1: get one reversiable element
for (i = j; i < nRank /*+ 1*/; ++i)
{
if (CheckReverse(A[i,j]))
{
a_1 = GetReverse(A[i, j]);
for (k = 0; k < nRank * 2;++k)
{
A[i, k] *= a_1;
A[i, k] %= (int)zt;
T[k] = A[i, k];
A[i, k] = A[j, k];
A[j, k] = T[k];
}
goto step2;
}
if (nRank - 1 == i) //last element of the column, still no one is reversiable
{
return false;
}
}
step2: //create the n-1 zeros of the column
for (i = 0; i < nRank ; ++i)
{
if (i != j)
{
int t = A[i, j]; //first element of Row i .
for (k = 0; k < nRank * 2; k++)
{
A[i, k] -= t * A[j, k];
A[i, k] %= (int)zt;
if (A[i, k]<0)
{
A[i, k] += (int)zt;
}
}
}
}
}
//construct M_1
for (i = 0; i < nRank;++i)
{
for (j = 0; j < nRank;++j)
{
nDeMatrix[i,j] = A[i,j+nRank];
}
}
return true;
}