public BigIntMatrix GenerateRandomInvertibleMatrix(BigInteger p, double l0, bool isVectorMatrix) { BigIntMatrix result = new BigIntMatrix(rowsCount, colsCount); bool inversible = false; BigIntMatrix matInv = new BigIntMatrix(this.rowsCount, this.colsCount); do { if (isVectorMatrix) { result.GenerateRandomVector(p, l0); } else { result.GenerateRandomMatrix(p, l0); } try { matInv = result.GaussJordanModInverse(p); inversible = true; } catch (Exception ex) { inversible = false; } } while (!inversible); Mat = result.Mat; return(matInv); }
private void btnSetupRequest_Click(object sender, EventArgs e) { txtReturnTime.Text = "0"; txtResult.Text = "-"; btnSendRequest.Enabled = false; n = frmParent.n; this.i0 = (int)nud_i0.Value; int NI = 1; while ((Math.Ceiling(Math.Log(n * NI)) + 1) * NI < frmParent.ll) { NI++; } N = NI; l0 = (int)Math.Ceiling(Math.Log(n * N)) + 1; q = BigInteger.Pow(2, 2 * l0); p = MathClass.GenerateLargePrime(l0); nud_i0.Maximum = n; txtN.Text = N.ToString(); txt_n.Text = n.ToString(); txt_p.Text = p.ToString(); txt_q.Text = q.ToString(); txt_l0.Text = l0.ToString(); Stopwatch sw = new Stopwatch(); sw.Start(); MPrime = new BigIntMatrix[n]; A = new BigIntMatrix(N, N); B = new BigIntMatrix(N, N); Delta = new BigIntMatrix(N, N); invA = A.GenerateRandomInvertibleMatrix(p, l0, false); B.GenerateRandomMatrix(p, l0); M = A.Append(B, BigIntMatrix.AppendMode.Beside); invDelta = Delta.GenerateRandomInvertibleMatrix(p, l0, true); txtLog.AppendText(A.Print("A")); txtLog.AppendText(B.Print("B")); txtLog.AppendText(M.Print("M")); txtLog.AppendText(Delta.Print("Delta")); BigIntMatrix P, Ai, Bi, D; P = new BigIntMatrix(N, N); D = new BigIntMatrix(N, N); Ai = new BigIntMatrix(N, N); Bi = new BigIntMatrix(N, N); txtLog.AppendText("\r\n>>> N: " + N.ToString()); txtLog.AppendText("\r\n---------------------------- Matrix Operations Started --------------------------"); Stopwatch swMat = new Stopwatch(); swMat.Start(); for (long i = 0; i < n; i++) { // --- M Jegon --- //---P.GenerateRandomInvertibleMatrix(p, l0, false); P.GenerateRandomMatrix(p, l0); // --- Soft Noise Matrix D --- D.GenerateSoftNoiseMatrix(); // --- hard noise --- if (i == i0) { D.GenerateHardNoiseMatrix(q); } else { D.GenerateSoftNoiseMatrix(); } Ai = P * A; Bi = (P * B) + (D * Delta); MPrime[i] = Ai.Append(Bi, BigIntMatrix.AppendMode.Beside) % p; } swMat.Stop(); MatrixProcessTime = swMat.ElapsedMilliseconds; txtLog.AppendText("\r\n>>> Matrix Process Duration: " + MatrixProcessTime.ToString()); txtLog.AppendText("\r\n---------------------------- Matrix Operations Finished --------------------------"); // --- make permutation & depermiutation vector --- Random rnd = new Random(DateTime.Now.Millisecond); List <int> tmpList = new List <int>(); List <int> permutList = new List <int>(); dePermutList.Clear(); for (int i = 0; i < 2 * N; i++) { tmpList.Add(i); dePermutList.Add(0); } int j = 0; while (tmpList.Count > 0) { int i = rnd.Next(tmpList.Count); permutList.Add(tmpList[i]); dePermutList[tmpList[i]] = j++; tmpList.RemoveAt(i); } Ms = permute(MPrime, n, permutList, N); sw.Stop(); Protocol1Time = sw.ElapsedMilliseconds; btnSendRequest.Enabled = true; txtLog.AppendText("\r\n---------------------------- Request has been sent to the server --------------------------"); }