Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку в реализации теста простоты, Миллер-Рабин 
V
    Опции темы
Splendid
Дата 10.6.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Помогите найти ошибку, пожалуйста!
На нечетных числах просто зависает....
Код




Это сообщение отредактировал(а) Splendid - 11.6.2008, 08:51
PM MAIL   Вверх
rrrFer
Дата 10.6.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 1
Всего: 1



Splendid, 
функция involution_on_mod не понятно что возвращает
Код
involution_on_mod (int b,  int s, const m){

если я правильно понял - программа должна определять взаимную простоту 2х чисел?
Код

#include <iostream>
#include <stdlib.h>
using namespace std;
bool e(int a, int b){
    int n=a;
    if(a>b)  n=b+1;
    if(a<b)  n=a+1;
    if(a%2==0&&b%2==0)
        return 0;
    for(int i=3;i<n;i+=2)
        if(a%i==0&&b%i==0)
            return 0;
    return 1;
}
void main(){
    cout<<e(109,108)<<endl;
    system("pause");
}


Это сообщение отредактировал(а) rrrFer - 10.6.2008, 12:10
PM MAIL WWW ICQ   Вверх
Splendid
Дата 10.6.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



нет, программа должна проверять число на простоту

Добавлено через 47 секунд
но вычисление НОД там тоже присутствует, как часть алгоритма

Добавлено через 1 минуту и 46 секунд
вот сам алгоритм теста:

Вероятностный тест Миллера-Рабина

Пусть n — нечетное и n − 1 = 2st, t — нечетное. 
Если число n является простым, то при всех a > 1 выполняется сравнение 
an−1 ≡ 1 (mod n) 
Поэтому, рассматривая элементы {at, a2t, …, a2s−1t} можно заметить, что либо среди них найдется равный −1 (mod n), либо at ≡ 1 (mod n). 
На этом замечании основан следующий вероятностный тест простоты:
1.    выбираем случайное число a из интервала {1, 2, …, n−1} и проверяем с помощью алгоритма Евклида условие (a, n) = 1; 
2.    если оно не выполняется, то ответ «n — составное»; 
3.    вычисляем at (mod n); 
4.    если at ≡ ±1 (mod n), то переходим к п. 1; 
5.    вычисляем a2t, …, a2s−1t до тех пор, пока не появится −1; 
6.    если ни одно из этих чисел не равно −1, то ответ «n — составное»; 
7.    если мы достигли −1, то ответ неизвестен (и тест можно повторить еще раз).

Добавлено через 10 минут и 23 секунды
здесь и а - в степени и t в степени
PM MAIL   Вверх
rrrFer
Дата 10.6.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 1
Всего: 1



Splendid, 
Цитата(Splendid @  10.6.2008,  12:17 Найти цитируемый пост)
 программа должна проверять число на простоту

Код

#include <iostream>
#include <stdlib.h>
using namespace std;
bool e(int a){
    int i,n=a/2;
    for(i=2;i<n;i++)
        if(a%i==0)
            return 0;
    return 1;
}
void main(){
    cout<<e(5)<<endl;
    system("pause");
}

а насчет того алгоритма, котоый вы написали...два первых шага уже обеспечивают  вероятность неправильной работы программы в ряде случаев:
1.    выбираем случайное число a из интервала {1, 2, …, n−1} и проверяем с помощью алгоритма Евклида условие (a, n) = 1; 
2.    если оно не выполняется, то ответ «n — составное»; 

PM MAIL WWW ICQ   Вверх
Splendid
Дата 10.6.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



а в чем неправильность?
PM MAIL   Вверх
rrrFer
Дата 10.6.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 1
Всего: 1



Splendid, 
число случайное...
PM MAIL WWW ICQ   Вверх
Splendid
Дата 10.6.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



т.е. мне нужно как-то прикрутить сюда еще генератор случ.чисел?
PM MAIL   Вверх
bsa
Дата 10.6.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Splendid, зачем генератор? Просто функции rand() будет достаточно (только srand на забудь вызвать в начале программы, передав текущее время в качестве параметра).
PM   Вверх
Splendid
Дата 10.6.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



bsa, а можно пример, никогда этой функцией не пользовалась...
PM MAIL   Вверх
rrrFer
Дата 10.6.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 1
Всего: 1



Splendid, 
Код

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main(){
    time_t t;
    srand((unsigned) time(&t));
    int i=rand();
    printf("%d\n", i);
    system("pause");
}

если srand не вызывать, то работать будет, но числа будут одни и теже каждый раз...(т.е. генерируютсяи вроде-бы случайные, но при любом запуске программы одинаковые). Можно также использовать randomize() и random(), но не все компиляторы их поддерживают

Это сообщение отредактировал(а) rrrFer - 10.6.2008, 14:33
PM MAIL WWW ICQ   Вверх
Splendid
Дата 10.6.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



понятно, спасибо!
Но это дела не изменило, все равно работает не так, может Вы опытным взглядом еще какую-нить ошибку видите?
PM MAIL   Вверх
Splendid
Дата 11.6.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Спасибо! с ошибками разобралась, код за ненадобностью убрала
PM MAIL   Вверх
bronislav
Дата 11.6.2008, 10:39 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Splendid, ИМХО не стоило убирать код. Возможно кто-то тоже встретиться с этой проблемой.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.