public BMatrice(BMatrice mat)
 {
     Valori  = new long[mat.Colonne, mat.Righe];
     Colonne = mat.Colonne;
     Righe   = mat.Righe;
     for (long r = 0; r < Righe; r++)
     {
         for (long c = 0; c < Colonne; c++)
         {
             this[c, r] = mat[c, r];
         }
     }
 }
        public long[] SoluzioneRandom()
        {
            long[] risultato = new long[Colonne];
            for (long i = 0; i < risultato.Length; i++)
            {
                risultato[i] = -1;
            }

            #region rimuovi_righe_vuote

            List <long> righeVuote = new List <long>();
            for (long r = 0; r < Righe; r++)
            {
                bool vuota = true;
                for (long c = 0; c < Colonne; c++)
                {
                    vuota &= this[c, r] == 0;
                }

                if (vuota)
                {
                    righeVuote.Add(r);
                }
            }

            BMatrice    mat        = new BMatrice(Colonne, Righe - righeVuote.Count);
            List <long> righePiene = Enumerable.Range(0, (int)Righe).ToList().ConvertAll(x => (long)x);
            righePiene.RemoveAll(r => righeVuote.Contains(r));
            #endregion

            List <List <long> > righe = new List <List <long> >();
            for (long r = 0; r < mat.Righe; r++)
            {
                righe.Add(new List <long>());
                for (long c = 0; c < mat.Colonne; c++)
                {
                    mat[c, r] = this[c, righePiene[(int)r]];
                    righe[(int)r].Add(mat[c, r]);
                }
            }

            for (long r = mat.Righe - 1; r >= 0; r--)
            {
                List <long> indiciBloccati = new List <long>();
                List <long> indiciCon1     = new List <long>();

                for (long i = 0; i < mat.Colonne; i++)
                {
                    if (righe[(int)r][(int)i] == 1 && risultato[i] != -1)
                    {
                        indiciBloccati.Add(i);
                    }

                    if (righe[(int)r][(int)i] == 1)
                    {
                        indiciCon1.Add(i);
                    }
                }

                List <long> indiciUtilizzabili = indiciCon1.Except(indiciBloccati).ToList();
                long        s = 0;
                foreach (long bloccato in indiciBloccati)
                {
                    s = (s + risultato[bloccato]) % 2;
                }
                List <long> valori = Tools.RandomListaConSommaMod2(indiciUtilizzabili.Count, s).ConvertAll(x => (long)x);
                long        k      = 0;
                foreach (long index in indiciUtilizzabili)
                {
                    risultato[index] = valori[(int)k];
                    k++;
                }
            }

            return(risultato);
        }