source: trunk/CrypPlugins/CubeAttack/Matrix.cs @ 2417

Last change on this file since 2417 was 840, checked in by oruba, 12 years ago
  • modified preprocessing phase
  • results can be saved in .cte-files
File size: 8.0 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Runtime.Serialization;
6using System.Runtime.Serialization.Formatters.Binary;
7
8namespace Cryptool.CubeAttack
9{
10    [Serializable()]
11    public class Matrix : ISerializable
12    {
13        public Matrix(SerializationInfo info, StreamingContext ctxt)
14        {
15            rows = (int)info.GetValue("rows", typeof(int));
16            cols = (int)info.GetValue("cols", typeof(int));
17            element = (int[,])info.GetValue("element", typeof(int[,]));
18        }
19       
20        public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
21        {
22            info.AddValue("rows", rows);
23            info.AddValue("cols", cols);
24            info.AddValue("element", element);
25        }
26
27
28        /// <summary>
29        /// Class attributes/members
30        /// </summary>
31        private int rows, cols;
32        private int[,] element;
33
34        /// <summary>
35        /// Contructor
36        /// </summary>
37        public Matrix(int rows, int cols)
38        {
39            this.rows = rows;
40            this.cols = cols;
41            element = new int[rows, cols];
42
43            for (int i = 0; i < rows; i++)
44                for (int j = 0; j < cols; j++)
45                    element[i, j] = 0;
46        }
47
48        /// <summary>
49        /// Properites
50        /// </summary>
51        public int Rows
52        {
53            get { return rows; }
54        }
55
56        public int Cols
57        {
58            get { return cols; }
59        }
60
61        /// <summary>
62        /// Indexer
63        /// </summary>
64        public int this[int row, int col]
65        {
66            get { return GetElement(row, col); }
67            set { SetElement(row, col, value); }
68        }
69
70        /// <summary>
71        /// Internal functions for getting/setting values
72        /// </summary>
73        public int GetElement(int row, int col)
74        {
75            if (row < 0 || row > rows - 1 || col < 0 || col > Cols - 1)
76                throw new MatrixVectorException("Invalid index specified");
77            return element[row, col];
78        }
79
80        public void SetElement(int row, int col, int value)
81        {
82            if (row < 0 || row > Rows - 1 || col < 0 || col > Cols - 1)
83                throw new MatrixVectorException("Invalid index specified");
84            element[row, col] = value;
85        }
86
87        /// <summary>
88        /// Returns the transpose of the current matrix
89        /// </summary>
90        public Matrix Transpose()
91        {
92            Matrix transposeMatrix = new Matrix(this.Cols, this.Rows);
93            for (int i = 0; i < transposeMatrix.Rows; i++)
94                for (int j = 0; j < transposeMatrix.Cols; j++)
95                    transposeMatrix[i, j] = this[j, i];
96            return transposeMatrix;
97        }
98
99        /// <summary>
100        /// Return the minor of a matrix element[Row,Col]
101        /// </summary>
102        public static Matrix Minor(Matrix matrix, int row, int col)
103        {
104            Matrix minor = new Matrix(matrix.Rows - 1, matrix.Cols - 1);
105            int m = 0, n = 0;
106            for (int i = 0; i < matrix.Rows; i++)
107            {
108                if (i == row)
109                    continue;
110                n = 0;
111                for (int j = 0; j < matrix.Cols; j++)
112                {
113                    if (j == col)
114                        continue;
115                    minor[m, n] = matrix[i, j];
116                    n++;
117                }
118                m++;
119            }
120            return minor;
121        }
122
123        /// <summary>
124        /// Returns the determinent of the current Matrix
125        /// It computes the determinent in the traditional way (i.e. using minors)
126        /// </summary>
127        public int Determinent()
128        {
129            return Determinent(this);
130        }
131
132        /// <summary>
133        /// Helper function for the above Determinent() method
134        /// it calls itself recursively and computes determinent using minors
135        /// </summary>
136        private int Determinent(Matrix matrix)
137        {
138            int det = 0;
139            if (matrix.Rows == 1)
140                return matrix[0, 0];
141            for (int j = 0; j < matrix.Cols; j++)
142                det += (matrix[0, j] * Determinent(Matrix.Minor(matrix, 0, j)) * (int)System.Math.Pow(-1, 0 + j));
143            return det;
144        }
145
146        /// <summary>
147        /// Returns the adjoint of the current matrix
148        /// </summary>
149        public Matrix Adjoint()
150        {
151            Matrix adjointMatrix = new Matrix(this.Rows, this.Cols);
152            for (int i = 0; i < this.Rows; i++)
153                for (int j = 0; j < this.Cols; j++)
154                    adjointMatrix[i, j] = (int)Math.Pow(-1, i + j) * (Minor(this, i, j).Determinent());
155            adjointMatrix = adjointMatrix.Transpose();
156            return adjointMatrix;
157        }
158
159        /// <summary>
160        /// Returns the inverse of a square matrix over GF(2) (by adjoint method)
161        /// </summary>
162        public Matrix Inverse()
163        {
164            if (this.Determinent() == 0)
165                throw new MatrixVectorException("Matrix is non-regular !");
166            Matrix m = (this.Adjoint() / this.Determinent());
167            for (int i = 0; i < this.Rows; i++)
168                for (int j = 0; j < this.Cols; j++)
169                    if (m[i, j] < 0)
170                        m[i, j] = -1 * m[i, j];
171            return m;
172        }
173
174        /// <summary>
175        /// Operator for the matrix object
176        /// includes binary operator /
177        /// </summary>
178        public static Matrix operator /(Matrix matrix, int iNo)
179        { return Matrix.Multiply(matrix, iNo); }
180
181        /// <summary>
182        /// Internal function for the above operator
183        /// </summary>
184        private static Matrix Multiply(Matrix matrix, int iNo)
185        {
186            Matrix result = new Matrix(matrix.Rows, matrix.Cols);
187            for (int i = 0; i < matrix.Rows; i++)
188                for (int j = 0; j < matrix.Cols; j++)
189                    result[i, j] = matrix[i, j] * iNo;
190            return result;
191        }
192
193        /// <summary>
194        /// The function adds one superpoly for the current matrix
195        /// </summary>
196        public Matrix AddRow(List<int> superpoly)
197        {
198            Matrix m = new Matrix(this.Rows + 1, this.Cols);
199            for (int i = 0; i < this.Rows; i++)
200                for (int j = 0; j < this.Cols; j++)
201                    m[i, j] = this[i, j];
202            for (int j = 0; j < this.Cols; j++)
203                m[m.Rows - 1, j] = superpoly[j];
204            return m;
205        }
206
207        /// <summary>
208        /// The function deletes the last row of the current matrix
209        /// </summary>
210        public Matrix DeleteLastRow()
211        {
212            Matrix m = new Matrix(this.Rows - 1, this.Cols);
213            for (int i = 0; i < this.Rows - 1; i++)
214                for (int j = 0; j < this.Cols; j++)
215                    m[i, j] = this[i, j];
216            return m;
217        }
218
219        /// <summary>
220        /// The function deletes the first columnm of the current matrix
221        /// </summary>
222        public Matrix DeleteFirstColumn()
223        {
224            Matrix m = new Matrix(this.Rows, this.Cols - 1);
225            for (int i = 0; i < m.Rows; i++)
226                for (int j = 1; j <= m.Cols; j++)
227                    m[i, j - 1] = this[i, j];
228            return m;
229        }
230    }
231
232    /// <summary>
233    /// Exception class for Matrix and Vector, derived from System.Exception
234    /// </summary>
235    public class MatrixVectorException : Exception
236    {
237        public MatrixVectorException()
238            : base()
239        { }
240
241        public MatrixVectorException(string Message)
242            : base(Message)
243        { }
244
245        public MatrixVectorException(string Message, Exception InnerException)
246            : base(Message, InnerException)
247        { }
248    } 
249}
Note: See TracBrowser for help on using the repository browser.