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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> int miller-rabin( long long ); реализация на Си 
:(
    Опции темы
Pete
Дата 18.10.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужна реализация теста простоты Миллера-Рабина для чисел типа long long.

Код

int miller-rabin( long long );
int witness( long long, long long );



--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
JackYF
Дата 18.10.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Посмотри на Algolist


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Pete
Дата 18.10.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Там Паскаль.. Мне нужен именно на Си. Проблема в вычислении
Код

d = (d*d)%n

(См. Кормен)


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
JackYF
Дата 18.10.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



В чем проблема? Какого типа переменная d?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Pete
Дата 18.10.2006, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

long long d;

//...
d = (d*d)%n;

Мне нужно это правильно вычислять, причем быстро (это часть процедуры witness(), которая вызывается из метода miller-rabin() несколько раз. Сам метод miller-rabin() вызывается для каждого числа, простоту которого надо проверить).

Вопрос заключается вот в чем. Как, не реализуя длинной арифметики, вычислить (d*d)%n, если d имеет тип long long?
Нашел на koders.com вот это. Только этот код довольно напряжно понимать... Мне нужен частный случай.


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
maxim1000
Дата 18.10.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



насколько большие n?
если меньше sqrt(max), то проблем не возникнет: sqr(d)%n=sqr(d%n)%n
хотя, подозреваю, n>sqrt(max)
можно попробовать разложить d в сумму старшей половины бит и младшей, а там использовать квадрат суммы


--------------------
qqq
PM WWW   Вверх
Rockie
Дата 19.10.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



imho все вычисляется.. возможно, проблема в неверном спецификаторе при выводе? imho стоит юзать %ld:
Код
#include<stdio.h>

int main(){
 long long d = 15;
 int n = 30;
 d = (d*d)%n;

 printf("%ld",d);
 return 0;
}

p.s.: если не имеется ввиду переполнение типа, как похоже ввиду и имеется   smile 

Это сообщение отредактировал(а) Rockie - 19.10.2006, 18:00


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Pete
Дата 19.10.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Rockie @  19.10.2006,  18:53 Найти цитируемый пост)
стоит юзать %ld

Для long long -- %lld.

Цитата(maxim1000 @  19.10.2006,  00:56 Найти цитируемый пост)
насколько большие n?

настолько большие, что произведение d*d будет вычислено неверно. Скажем, порядка 2^60.


Цитата(maxim1000 @  19.10.2006,  00:56 Найти цитируемый пост)
можно попробовать разложить d в сумму старшей половины бит и младшей, а там использовать квадрат суммы

То есть d = a*2^32 + b, где a и b -- int?


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
maxim1000
Дата 19.10.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Pete @  19.10.2006,  20:32 Найти цитируемый пост)
То есть d = a*2^32 + b, где a и b -- int?

да
тогда получится:
a*a*2^64+b*b*2^64+2*a*b*2^32
в первых двух слагаемых нужно заменить 2^64 на (2^64)%n и a*a и b*bуже вмещается в 64 бита
во втором можно разделить a*b на старший int и младший
до конца не просматривал, но, кажется, проблем тамбыть не должно...


--------------------
qqq
PM WWW   Вверх
Pete
Дата 19.10.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ладно, попробую. Однако сомневаюсь, что это достаточно быстрый способ...


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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