Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2010, 15:34   #1
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
Смущение Реализация теста Миллера-Рабина

Появилась такая проблема, нигде не могу найти рабочей реализации вероятностного теста числа на простоту Миллера-Рабина. В сети имеется псевдокод на него, пробовал делать по нему но не выходит, думаю что есть какая-то ошибка в самом псевдокоде. Может кто сможет помочь в этом вопросе? Мне не обязательно выполнять операции с длинными числами, хотя бы те что входят в диапазон long... Желательно код на C++
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 24.04.2010, 15:38   #2
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

вот мой код который в принципе не работает...
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{Label3->Caption="";
 long m,r,s=0,t,x,a;
 m=StrToInt(Edit1->Text);
 r=StrToInt(Edit2->Text);
 while (!((m-1)%int(pow(2,s)))) s++;
 s--;
 t=(m-1)/pow(2,s);
 bool pr;
 randomize();
 for (int i=0; i<r; i++)
  {pr=true;
   a=random(m-3)+2;
   x=long(pow(a,t))%m;
   if ((x==1)||(x==m-1)) continue;
   for (int k=0; k<s; k++)
    {x=long(pow(a,pow(2,k)*t))%m;
     if (x==1) {Label3->Caption="Составное"; break;}
     if (x==m-1) {pr=false; break;}
    }
   if (pr) {Label3->Caption="Составное"; break;}
  }
 if (Label3->Caption!="Составное")
  Label3->Caption="Простое";
}
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось Sazary; 27.04.2010 в 19:56.
mrChester вне форума Ответить с цитированием
Старый 24.04.2010, 16:32   #3
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Проблема решилась не успев начаться ))))
В строке:
x=long(pow(a,pow(2,k)*t))%m;
происходил выход за границы типа long, максимальное простое число, которое удается проверить без выхода за границы типа 17...
А кто-нибудь может сделать то же самое но на языке maple?
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 27.04.2010, 11:56   #4
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Сообщение от mrChester Посмотреть сообщение
Проблема решилась не успев начаться ))))
В строке:
x=long(pow(a,pow(2,k)*t))%m;
происходил выход за границы типа long, максимальное простое число, которое удается проверить без выхода за границы типа 17...
А кто-нибудь может сделать то же самое но на языке maple?
Этот код удалось оптимизировать...

x=(x*x)%m; - результат тотже
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 27.04.2010, 12:03   #5
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Сообщение от mrChester Посмотреть сообщение
x=long(pow(a,t))%m;
в этой строке выполняется возведение в степень, опять таки получается большое число, вот фрагмент как от этого избавиться, но появляется большая проблема с временем выполнения программы числа порядка 10^10 проверяет около 3 минут... может кто поможет еще как-нибудь оптимизировать...
сразу скажу что в С++ такие числа проверить не сможете, я делал в maple...
моя цель: проверять числа порядка 10^300, ну или хотя бы 10^100

x=1;
while (t>0)
{x=(x*a)%m;
t--;
}
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм поиска текста Рабина на Delphi 7 выходит ошибка Des Общие вопросы Delphi 14 15.05.2012 11:14
Алгоритм Кнута-Морриса-Пратта или Рабина-Карпа (язык С++). Может у кого-нибудь есть готовый рабочий ? Беата Помощь студентам 7 27.03.2010 10:50
Создание теста VeraN Помощь студентам 0 23.11.2009 18:03
алгоритм рабина-карпа(поиск подстроки) kristy42 Помощь студентам 0 03.11.2009 18:41
Алгоритмы Рабина - Карпа Volchara Общие вопросы C/C++ 0 24.04.2009 16:40