// простого числа и выполняется до тех пор, пока не произойдет

  // одно из следующих двух событий:

  // (а) найдено очередное простое число

  // (b) от внешнего (по отношению к данному) потока поступила команда

  // прекратить выполнение

  //------------------------------------------------------------------

 public void findNextHighestPrime {

  //Если поступила команда прекратить выполнение, то поиск

  //даже не должен начинаться

  if (getProcessingState == ProcessingState.requestAbort) {

   goto finished_looking;

  }

  //Состояние должно отвечать, что поиск продолжается

  setProcessingState(ProcessingState.lookingForPrime);

  m_startTickCount = System.Environment.TickCount;

  long currentItem;

  //Проверить, является ли число нечетным

  if ((m_startPoint & 1) == 1) {

   //Число является нечетным, начать поиск со следующего нечетного числа

   currentItem = m_startPoint + 2;

  } else {

   //Число является четным, начать поиск со следующего нечетного числа

   currentItem = m_startPoint + 1;

  }

  //Приступить к поиску простого числа

  while(getProcessingState == ProcessingState.lookingForPrime) {

   //B случае нахождения простого числа возвратить его

   if (isItemPrime(currentItem) == true) {

    m_NextHighestPrime = currentItem; //Обновить состояние

    setProcessingState(ProcessingState.foundPrime);

   }

   currentItem = currentItem + 2;

  }

finished_looking:

  //Выход. К этому моменту либо от другого потока поступила

  //команда прекратить поиск, либо было найдено и записано

  //следующее наибольшее простое число

  //Зафиксировать время

  m_endTickCount = System.Environment.TickCount;

  //Если поступил запрос прекратить выполнение,

  //сообщить, что выполнение процесса прекращено

  if (getProcessingState == ProcessingState.requestAbort) {

   setProcessingState(ProcessingState.aborted);

  }

 }

 //Конец функции

 //Вспомогательная функция, которая проверяет, является

 //ли число простым

 private bool isItemPrime(long potentialPrime) {

  //Если число — четное, значит, оно не является простым

  if ((potentialPrime & 1) == 0) {

   return false;

  }

  //Продолжать поиск до тех пор, пока не будет превышено

  //значение квадратного корня из числа

  long end_point_of_search;

  end_point_of_search = (long) System.Math.Sqrt(potentialPrime) + 1;

  long current_test_item = 3;

  while (current_test_item <= end_point_of_search ) {

  //----------------------------------------------------------

  // Проверить, не поступила ли команда прекратить выполнение!

  //----------------------------------------------------------

  if (getProcessingState != ProcessingState.lookingForPrime) {

   return false;

  }

  //Если число делится без остатка,

  //значит, оно не является простым

Перейти на страницу:

Похожие книги