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); }