Advertisement
GreenMap

Untitled

Oct 24th, 2024
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.46 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ConsoleApp1
  8. {
  9.     internal class BaseSimpleNumbersCalculator
  10.     {
  11.         public static int[] GetSimpleNumbers(int n)
  12.         {
  13.             int[] numbers = Enumerable.Range(2, (int)Math.Sqrt(n)-1).ToArray();
  14.  
  15.             Array.ForEach(numbers.Select((value, i) => (value, i)).ToArray(), p => {
  16.                 if (p.value != 0)
  17.                 {
  18.                     Array.ForEach(numbers.Skip(p.i + 1).Select((value, i) => (value, i)).ToArray(), x =>
  19.                     {
  20.                         if (x.value % p.value == 0)
  21.                         {
  22.                             numbers[x.i + p.i + 1] = 0;
  23.                         }
  24.                     });
  25.                 }
  26.             }) ;
  27.  
  28.             return numbers.Where(value => value != 0).ToArray();
  29.         }
  30.     }
  31. }
  32.  
  33. using System;
  34. using System.Collections.Generic;
  35. using System.Diagnostics;
  36. using System.Linq;
  37. using System.Text;
  38. using System.Threading.Tasks;
  39.  
  40. namespace ConsoleApp1
  41. {
  42.     internal class SimpleNumbersCalculatorBaseParallel
  43.     {
  44.         static Stopwatch sw = new Stopwatch();
  45.         public static float Calculate(int n, int m)
  46.         {
  47.             int[] baseNumbers = BaseSimpleNumbersCalculator.GetSimpleNumbers(n);
  48.             int[] numbers = Enumerable.Range((int)Math.Sqrt(n), n - (int)Math.Sqrt(n)).ToArray();
  49.  
  50.             int numbersCount = baseNumbers.Length;
  51.  
  52.             List<Task> tasks = new List<Task>();
  53.  
  54.             sw.Reset();
  55.  
  56.             sw.Start();
  57.  
  58.             for (int i = 0; i < m; i++)
  59.             {
  60.                 int start = i * (numbersCount / m);
  61.                 int end = (i + 1) * (numbersCount / m);
  62.                 if (i == m - 1)
  63.                 {
  64.                     end += numbersCount % m;
  65.                 }
  66.                 tasks.Add(ProcessAsync(start, end, baseNumbers, numbers));
  67.             }
  68.  
  69.             Task.WhenAll(tasks).Wait();
  70.  
  71.             sw.Stop();
  72.  
  73.             return (float)sw.Elapsed.TotalMilliseconds;
  74.         }
  75.         static async Task ProcessAsync(int start, int end, int[] baseNumbers, int[] numbers)
  76.         {
  77.             await Task.Run(() =>
  78.             {
  79.                 Array.ForEach(baseNumbers.Select((value, i) => (value, i)).Where(x => x.i >= start && x.i < end).ToArray(), p => {
  80.                     Array.ForEach(numbers.Select((value, i) => (value, i)).ToArray(),
  81.                         x => { if (x.value != 0 && x.value % p.value == 0) numbers[x.i] = 0; });
  82.                 });
  83.  
  84.             });
  85.         }
  86.     }
  87. }
  88.  
  89. using System;
  90. using System.Collections.Generic;
  91. using System.Diagnostics;
  92. using System.Linq;
  93. using System.Text;
  94. using System.Threading.Tasks;
  95.  
  96. namespace ConsoleApp1
  97. {
  98.     internal class SimpleNumbersCalculatorDataParallel
  99.     {
  100.         static Stopwatch sw = new Stopwatch();
  101.         public static float Calculate(int n, int m)
  102.         {
  103.             int[] baseNumbers = BaseSimpleNumbersCalculator.GetSimpleNumbers(n);
  104.             int[] numbers = Enumerable.Range((int)Math.Sqrt(n), n - (int)Math.Sqrt(n)).ToArray();
  105.  
  106.             int numbersCount = numbers.Length;
  107.  
  108.             List<Task> tasks = new List<Task>();
  109.  
  110.             sw.Reset();
  111.  
  112.             sw.Start();
  113.  
  114.             for (int i = 0; i < m; i++)
  115.             {
  116.                 int start = i * (numbersCount / m);
  117.                 int end = (i + 1) * (numbersCount / m);
  118.                 if (i == m - 1)
  119.                 {
  120.                     end += numbersCount % m;
  121.                 }
  122.                 tasks.Add(ProcessAsync(start, end, baseNumbers, numbers));
  123.             }
  124.  
  125.             Task.WhenAll(tasks).Wait();
  126.  
  127.             sw.Stop();
  128.  
  129.             return (float)sw.Elapsed.TotalMilliseconds;
  130.         }
  131.         static async Task ProcessAsync(int start, int end, int[] baseNumbers, int[] numbers)
  132.         {
  133.             await Task.Run(() =>
  134.             {
  135.                 Array.ForEach(baseNumbers, p => {
  136.                     Array.ForEach(numbers.Select((value, i) => (value, i)).Where(x => x.i >= start && x.i < end).ToArray(),
  137.                         x => { if (x.value != 0 && x.value % p == 0) numbers[x.i] = 0; });
  138.                 });
  139.                
  140.             });
  141.         }
  142.     }
  143. }
  144.  
  145. using System;
  146. using System.Collections.Generic;
  147. using System.Diagnostics;
  148. using System.Linq;
  149. using System.Text;
  150. using System.Threading.Tasks;
  151.  
  152. namespace ConsoleApp1
  153. {
  154.     internal class SimpleNumbersCalculatorPluckParallel
  155.     {
  156.         static Stopwatch sw = new Stopwatch();
  157.  
  158.         static int currentIndex;
  159.         public static float Calculate(int n, int m)
  160.         {
  161.             int[] baseNumbers = BaseSimpleNumbersCalculator.GetSimpleNumbers(n);
  162.             int[] numbers = Enumerable.Range((int)Math.Sqrt(n), n - (int)Math.Sqrt(n)).ToArray();
  163.  
  164.             int numbersCount = numbers.Length;
  165.  
  166.             List<Task> tasks = new List<Task>();
  167.  
  168.             currentIndex = 0;
  169.  
  170.             sw.Reset();
  171.  
  172.             sw.Start();
  173.  
  174.             for (int i = 0; i < m; i++)
  175.             {
  176.                 tasks.Add(ProcessAsync(baseNumbers, numbers));
  177.             }
  178.  
  179.             Task.WhenAll(tasks).Wait();
  180.  
  181.             sw.Stop();
  182.  
  183.             return (float)sw.Elapsed.TotalMilliseconds;
  184.         }
  185.         static async Task ProcessAsync(int[] baseNumbers, int[] numbers)
  186.         {
  187.             await Task.Run(() =>
  188.             {
  189.                 int b;
  190.  
  191.                 while (true)
  192.                 {
  193.                     lock (baseNumbers)
  194.                     {
  195.                         if (currentIndex < baseNumbers.Length)
  196.                         {
  197.                             b = baseNumbers[currentIndex];
  198.                             currentIndex++;
  199.                         }
  200.                         else
  201.                         {
  202.                             return;
  203.                         }
  204.  
  205.                     }
  206.  
  207.                     Array.ForEach(numbers.Select((value, i) => (value, i)).ToArray(), x => { if (x.value != 0 && x.value % b == 0) numbers[x.i] = 0; });
  208.                 }
  209.             });
  210.         }
  211.     }
  212. }
  213.  
  214. using System;
  215. using System.Collections.Generic;
  216. using System.Diagnostics;
  217. using System.Linq;
  218. using System.Text;
  219. using System.Threading.Tasks;
  220.  
  221. namespace ConsoleApp1
  222. {
  223.     internal class SimpleNumbersCalculatorPoolParallel
  224.     {
  225.         static Stopwatch sw = new Stopwatch();
  226.         public static float Calculate(int n)
  227.         {
  228.             int[] baseNumbers = BaseSimpleNumbersCalculator.GetSimpleNumbers(n);
  229.             int[] numbers = Enumerable.Range((int)Math.Sqrt(n), n - (int)Math.Sqrt(n)).ToArray();
  230.  
  231.             ManualResetEvent[] events = new ManualResetEvent[baseNumbers.Length];
  232.  
  233.             sw.Reset();
  234.  
  235.             sw.Start();
  236.  
  237.             for(int i = 0; i < baseNumbers.Length; i++)
  238.             {
  239.                 events[i] = new ManualResetEvent(false);
  240.                 ThreadPool.QueueUserWorkItem(Run, (baseNumbers[i], numbers, events[i]));
  241.             }
  242.  
  243.             WaitHandle.WaitAll(events);
  244.  
  245.             sw.Stop();
  246.  
  247.             return (float)sw.Elapsed.TotalMilliseconds;
  248.         }
  249.         static void Run(object o)
  250.         {
  251.             var parametrs = ((int, int[], ManualResetEvent))o;
  252.  
  253.             int b = parametrs.Item1;
  254.             int[] numbers = parametrs.Item2;
  255.             ManualResetEvent ev = parametrs.Item3;
  256.  
  257.             Array.ForEach(numbers.Select((value, i) => (value, i)).ToArray(),x => { if (x.value != 0 && x.value % b == 0) numbers[x.i] = 0; });
  258.        
  259.             ev.Set();
  260.         }
  261.     }
  262. }
  263.  
  264. using System;
  265. using System.Collections.Generic;
  266. using System.Diagnostics;
  267. using System.Linq;
  268. using System.Text;
  269. using System.Threading.Tasks;
  270.  
  271. namespace ConsoleApp1
  272. {
  273.     internal static class SimpleNumbersСalculatorSeq
  274.     {
  275.         static Stopwatch sw = new Stopwatch();
  276.         public static float Calculate(int n)
  277.         {
  278.             int[] baseNumbers = BaseSimpleNumbersCalculator.GetSimpleNumbers(n);
  279.             int[] numbers = Enumerable.Range((int)Math.Sqrt(n), n - (int)Math.Sqrt(n)).ToArray();
  280.  
  281.             sw.Reset();
  282.  
  283.             sw.Start();
  284.  
  285.             Array.ForEach(baseNumbers, p => {
  286.                 Array.ForEach(numbers.Select((value, i) => (value, i)).ToArray(), x => { if (x.value != 0 && x.value % p == 0) numbers[x.i] = 0; });
  287.             });
  288.  
  289.             sw.Stop();
  290.  
  291.             return (float)sw.Elapsed.TotalMilliseconds;
  292.         }
  293.     }
  294. }
  295.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement