static int calculateWeightDifference(NeuralCryptography X, NeuralCryptography Y)
        {
            int difference = 0;

            for (int i = 0; i < X.K * X.N - 1; i++)
            {
                difference = difference + Math.Abs(X.w[i] - Y.w[i]);
            }
            return(difference);
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            dgv_A.Rows.Clear();
            dgv_B.Rows.Clear();

            int K = (int)nud_K.Value,
                N = (int)nud_N.Value,
                L = (int)nud_L.Value;

            object[] dataA = new object[K * N];
            object[] dataB = new object[K * N];

            for (int i = 0; i < N; i++)
            {
                dgv_A.Columns.Add("", "");
                dgv_B.Columns.Add("", "");
            }

            NeuralCryptography A    = new NeuralCryptography(K, L, N);
            NeuralCryptography B    = new NeuralCryptography(K, L, N);
            InputVector        inpV = new InputVector();

            A.IntAll();
            B.IntAll();

            A.RandomWeight(false);
            B.RandomWeight(true);

            int difference = calculateWeightDifference(A, B);

            string result = "Failed";
            int    steps  = 0;


            while (difference != 0)
            {
                inpV.inputVector(K * N);
                A.CountOutput(inpV.input);
                B.CountOutput(inpV.input);

                if (A.output == B.output)
                {
                    A.UpdateWeights(inpV.input);
                    B.UpdateWeights(inpV.input);
                    difference = calculateWeightDifference(A, B);


                    dgv_A.Rows.Clear();
                    dgv_B.Rows.Clear();

                    for (int i = 0; i < K; i++)
                    {
                        for (int j = 0; j < N; j++)
                        {
                            {
                                dataA[j] = A.w[i * N + j];
                                dataB[j] = B.w[i * N + j];
                            }
                        }

                        dgv_A.Rows.Add(dataA);
                        dgv_B.Rows.Add(dataB);
                    }

                    //this.Refresh();


                    if (difference == 0)
                    {
                        result = "Success";
                        break;
                    }
                }

                steps++;
            }

            int key_size   = _string.Length / (A.L * 2 + 1);
            int key_length = A.K * A.N / key_size;

            for (int i = 1; i < key_length; i++)
            {
                int k = 1;
                for (int j = (i - 1) * key_size; j < i * key_size - 1; j++)
                {
                    k            = k + A.w[j] + A.L;
                    txt_Key.Text = txt_Key.Text + _string[k];
                }
            }

            txt_Status.Text = "Status:" + result + "\r\n Number of iterations:" + steps;
        }