Advertisement
TimmyChannel

Дыч2

May 26th, 2022
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.67 KB | None | 0 0
  1. using System;
  2. using System.Text;
  3.  
  4. namespace Курсовая_АСД
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             var Matrix1 = GenerateBlock(6);
  11.             var Matrix2 = GenerateBlock(6);
  12.             Console.WriteLine(Matrix1.ToString());
  13.             Console.WriteLine();
  14.             Console.WriteLine(Matrix2.ToString());
  15.             Console.WriteLine();
  16.             Console.WriteLine(ShtrassenMyltiply(Matrix1, Matrix2).ToString());
  17.             Console.ReadLine();
  18.         }
  19.  
  20.         static long Power(int x, int n)
  21.         {
  22.             if (n == 0)
  23.                 return 1;
  24.  
  25.             if ((n & 1) == 0)
  26.             {
  27.                 var p = Power(x, n >> 1);
  28.                 return p * p;
  29.             }
  30.             else
  31.             {
  32.                 return x * Power(x, n - 1);
  33.             }
  34.         }
  35.  
  36.         static Block GenerateBlock(int Degree)
  37.         {
  38.             var size = (int)Power(2, Degree);
  39.  
  40.             Random random = new Random(DateTime.Now.Millisecond);
  41.  
  42.             var matrix = new Block(size, size);
  43.  
  44.             for (int i = 0; i < size; i++)
  45.             {
  46.                 for (int j = 0; j < size; j++)
  47.                 {
  48.                     matrix[i, j] = random.Next(10);
  49.                 }
  50.             }
  51.             return matrix;
  52.         }
  53.  
  54.         static Block ShtrassenMyltiply(Block FirstMatrix, Block SecondMatrix)
  55.         {
  56.             int DefaultSize = FirstMatrix.Length;
  57.             var matrix1 = OnBlocks(FirstMatrix);
  58.             var matrix2 = OnBlocks(SecondMatrix);
  59.             if (DefaultSize > 32)
  60.             {
  61.                 int NewSize = FirstMatrix.Length >> 1;
  62.                 var x1 = ShtrassenMyltiply(matrix1[0, 0] + matrix1[1, 1], matrix2[0, 0] + matrix2[1, 1]);
  63.                 var x2 = ShtrassenMyltiply(matrix1[1, 0] + matrix1[1, 1], matrix2[0, 0]);
  64.                 var x3 = ShtrassenMyltiply(matrix1[0, 0], matrix2[0, 1] - matrix2[1, 1]);
  65.                 var x4 = ShtrassenMyltiply(matrix1[1, 1], matrix2[1, 0] - matrix2[0, 0]);
  66.                 var x5 = ShtrassenMyltiply(matrix1[0, 0] + matrix1[0, 1], matrix2[1, 1]);
  67.                 var x6 = ShtrassenMyltiply(matrix1[1, 0] - matrix1[0, 0], matrix2[0, 0] + matrix2[0, 1]);
  68.                 var x7 = ShtrassenMyltiply(matrix1[0, 1] - matrix1[1, 1], matrix2[1, 0] + matrix2[1, 1]);
  69.  
  70.                 var X1 = (x1 + x4) + (x7 - x5);
  71.                 var X2 = x3 + x5;
  72.                 var X3 = x2 + x4;
  73.                 var X4 = (x3 + x6) + (x1 - x2);
  74.  
  75.                 var ResultMatrix = new Block(DefaultSize, DefaultSize);
  76.  
  77.                 for (int i = 0; i < NewSize; i++)
  78.                 {
  79.                     for (int j = 0; j < NewSize; j++)
  80.                     {
  81.                         ResultMatrix[i, j] = X1[i, j];
  82.                         ResultMatrix[i, j + NewSize] = X2[i, j];
  83.                         ResultMatrix[i + NewSize, j] = X3[i, j];
  84.                         ResultMatrix[i + NewSize, j + NewSize] = X4[i, j];
  85.                     }
  86.                 }
  87.                 return ResultMatrix;
  88.             }
  89.             else
  90.             {
  91.                 var Result = TraditionalMyltiply(FirstMatrix, SecondMatrix);
  92.                 return Result;
  93.             }
  94.         }
  95.  
  96.  
  97.         static Block TraditionalMyltiply(Block FirstMatrix, Block SecondMatrix)
  98.         {
  99.             var size = FirstMatrix.Length;
  100.             var result = new Block(size, size);
  101.             for (int i = 0; i < size; i++)
  102.                 for (int j = 0; j < size; j++)
  103.                 {
  104.                     result[i, j] = 0;
  105.                     for (int k = 0; k < size; k++)
  106.                         result[i, j] = result[i, j] + FirstMatrix[i, k] * SecondMatrix[k, j];
  107.                 }
  108.             return result;
  109.         }
  110.         static Block[,] OnBlocks(Block Matrix)
  111.         {
  112.             //Верхний левый угол
  113.             int NewSize = Matrix.Length >> 1;
  114.             int DefaultSize = Matrix.Length;
  115.             var ResultMatrix = new Block[2, 2];
  116.             var s1 = new Block(NewSize, NewSize);
  117.             var s2 = new Block(NewSize, NewSize);
  118.             var s3 = new Block(NewSize, NewSize);
  119.             var s4 = new Block(NewSize, NewSize);
  120.             for (int i = 0; i < NewSize; i++)
  121.             {
  122.                 for (int j = 0; j < NewSize; j++)
  123.                 {
  124.                     s1[i, j] = Matrix[i, j];
  125.                 }
  126.             }
  127.             //Верхний правый угол
  128.             for (int i = 0; i < NewSize; i++)
  129.             {
  130.                 for (int j = NewSize; j < DefaultSize; j++)
  131.                 {
  132.                     s2[i, j - NewSize] = Matrix[i, j];
  133.                 }
  134.             }
  135.             //Нижний левый угол
  136.             for (int i = NewSize; i < DefaultSize; i++)
  137.             {
  138.                 for (int j = 0; j < NewSize; j++)
  139.                 {
  140.                     s3[i - NewSize, j] = Matrix[i, j];
  141.                 }
  142.             }
  143.             //Нижнинй правый угол  
  144.             for (int i = NewSize; i < DefaultSize; i++)
  145.             {
  146.                 for (int j = NewSize; j < DefaultSize; j++)
  147.                 {
  148.                     s4[i - NewSize, j - NewSize] = Matrix[i, j];
  149.                 }
  150.             }
  151.             ResultMatrix[0, 0] = s1;
  152.             ResultMatrix[0, 1] = s2;
  153.             ResultMatrix[1, 0] = s3;
  154.             ResultMatrix[1, 1] = s4;
  155.             return ResultMatrix;
  156.         }
  157.     }
  158.     class Block
  159.     {
  160.         public int Length { get; private set; }
  161.         private int[,] matrix;
  162.         public Block(int x, int y)
  163.         {
  164.             matrix = new int[x, y];
  165.             Length = x;
  166.         }
  167.  
  168.         public int this[int x, int y]
  169.         {
  170.             get { return matrix[x, y]; }
  171.             set { matrix[x, y] = value; }
  172.         }
  173.         public bool ArrayToBlock(int[,] arr)
  174.         {
  175.             if (arr.GetLength(0) != arr.GetLength(1)) return false;
  176.             matrix = new int[arr.GetLength(0), arr.GetLength(1)];
  177.             for (int i = 0; i < arr.GetLength(0); i++)
  178.             {
  179.                 for (int j = 0; j < arr.GetLength(1); j++)
  180.                 {
  181.                     this[i, j] = arr[i, j];
  182.                 }
  183.             }
  184.             return true;
  185.         }
  186.         public override string ToString()
  187.         {
  188.             StringBuilder ret = new StringBuilder();
  189.             if (matrix == null) return ret.ToString();
  190.  
  191.             for (int i = 0; i < Length; i++)
  192.             {
  193.                 for (int t = 0; t < Length; t++)
  194.                 {
  195.                     ret.Append(matrix[i, t]);
  196.                     ret.Append("\t");
  197.                 }
  198.                 ret.Append("\n");
  199.             }
  200.             return ret.ToString();
  201.         }
  202.         public static Block operator +(Block matrix1, Block matrix2)
  203.         {
  204.             var ResultMatrix = new Block(matrix1.Length, matrix1.Length);
  205.             for (int i = 0; i < matrix1.Length; i++)
  206.             {
  207.                 for (int j = 0; j < matrix1.Length; j++)
  208.                 {
  209.                     ResultMatrix[i, j] = matrix1[i, j] + matrix2[i, j];
  210.                 }
  211.             }
  212.             return ResultMatrix;
  213.         }
  214.         public static Block operator -(Block matrix1, Block matrix2)
  215.         {
  216.             var ResultMatrix = new Block(matrix1.Length, matrix1.Length);
  217.             for (int i = 0; i < matrix1.Length; i++)
  218.             {
  219.                 for (int j = 0; j < matrix1.Length; j++)
  220.                 {
  221.                     ResultMatrix[i, j] = matrix1[i, j] - matrix2[i, j];
  222.                 }
  223.             }
  224.             return ResultMatrix;
  225.         }
  226.     }
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement