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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2013, 22:26   #1
miramentis
 
Регистрация: 06.04.2013
Сообщений: 6
По умолчанию произведение чисел порядка 10^9 по модулю

Столкнулся с задачей вычисления произведения двух разных чисел a,b по модулю n(не обязательно простому):
10^9 < a,b <= n.
Собственно, простой вариант:
Код:
c=(a*b)%n;
(еще раз замечу, что всегда a,b <= n)
не подходит, ибо, при a,b > 4.294967296*10^9, произведение a*b >2^64.
Подскажите, пожалуйста, как реализовать подобную операцию.
Естественно, чем быстрее она будет выполняться, тем лучше.
Заранее спасибо всем откликнувшимся!

P.S. не уверен, что правильно выбрал раздел(раздела с общими вопросами по программированию, не привязанными к конкретному языку, увы, не нашел), так что скажите, пожалуйста, если тему стоит перенести в другой раздел.

Последний раз редактировалось miramentis; 12.07.2013 в 23:32. Причина: добавление P.S.
miramentis вне форума Ответить с цитированием
Старый 13.07.2013, 06:38   #2
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от miramentis Посмотреть сообщение
Столкнулся с задачей вычисления произведения двух разных чисел a,b по модулю n(не обязательно простому):
10^9 < a,b <= n.
Собственно, простой вариант:
Код:
c=(a*b)%n;
(еще раз замечу, что всегда a,b <= n)
не подходит, ибо, при a,b > 4.294967296*10^9, произведение a*b >2^64.
Может я чего-то не понял, но посути проблема лишь в том что результат умножения a и b выходит слишком большой и выходит за пределы вашего числового типа? В противном случае я не вижу проблем почему при а*b= 2^64 нельзя сделать операцию вычисления остатка.
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/

Последний раз редактировалось -glykaman-; 13.07.2013 в 06:40.
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 08:27   #3
UaKot
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 36
По умолчанию

Цитата:
Сообщение от miramentis Посмотреть сообщение
Столкнулся с задачей вычисления произведения двух разных чисел a,b по модулю n(не обязательно простому):
10^9 < a,b <= n.
Собственно, простой вариант:
Код:
c=(a*b)%n;
(еще раз замечу, что всегда a,b <= n)
не подходит, ибо, при a,b > 4.294967296*10^9, произведение a*b >2^64.
Подскажите, пожалуйста, как реализовать подобную операцию.
Естественно, чем быстрее она будет выполняться, тем лучше.
Заранее спасибо всем откликнувшимся!

P.S. не уверен, что правильно выбрал раздел(раздела с общими вопросами по программированию, не привязанными к конкретному языку, увы, не нашел), так что скажите, пожалуйста, если тему стоит перенести в другой раздел.
Если не ошибаюсь, то ((a mod n)*(b mod n)) mod n = (a*b) mod n. Так не должно быть переполнения... ну еще же есть навалом алгоритмов длинной арифметики
UaKot вне форума Ответить с цитированием
Старый 13.07.2013, 11:16   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от UaKot Посмотреть сообщение
Если не ошибаюсь, то ((a mod n)*(b mod n)) mod n = (a*b) mod n. Так не должно быть переполнения...
Тут a,b <= n, так что a mod n = a, b mod n = b.
Somebody вне форума Ответить с цитированием
Старый 13.07.2013, 14:06   #5
miramentis
 
Регистрация: 06.04.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от -glykaman- Посмотреть сообщение
Может я чего-то не понял, но посути проблема лишь в том что результат умножения a и b выходит слишком большой и выходит за пределы вашего числового типа?
именно это я и имел ввиду, говоря, что
Цитата:
не подходит, ибо, при a,b > 4.294967296*10^9, произведение a*b >2^64.

Последний раз редактировалось miramentis; 13.07.2013 в 14:08.
miramentis вне форума Ответить с цитированием
Старый 13.07.2013, 14:07   #6
miramentis
 
Регистрация: 06.04.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от UaKot Посмотреть сообщение
ну еще же есть навалом алгоритмов длинной арифметики
не могли бы вы оставить тут один из них.
сам, к сожалению, не нашел, иначе не писал бы здесь
miramentis вне форума Ответить с цитированием
Старый 13.07.2013, 15:02   #7
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от miramentis Посмотреть сообщение
не могли бы вы оставить тут один из них.
сам, к сожалению, не нашел, иначе не писал бы здесь
Скажите что за язык и система разработки - может хватит просто стандартных типов большего объема? long double например.

Если все-таки длинная арифметика - универсальный способ создать массив из нескольких int'ов и прописать к нему несколько функций вывода на экран и арифметических операций. Я не уверен но может есть способ попроще, как-то длинной арифметикой заниматься не приходилось.
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 15:48   #8
UaKot
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 36
По умолчанию

Цитата:
Сообщение от miramentis Посмотреть сообщение
не могли бы вы оставить тут один из них.
сам, к сожалению, не нашел, иначе не писал бы здесь
Готовые алгоритмы на С++:
http://cppalgo.blogspot.ru/2010/05/blog-post.html

Здесь тоже есть решение и можно протестировать, но здесь заранее гарантируется, что делитель вмещается в целочисленный тип..

Можно вообще на джаве) Там встроенный тип длинных чисел есть

Последний раз редактировалось UaKot; 13.07.2013 в 16:13.
UaKot вне форума Ответить с цитированием
Старый 13.07.2013, 16:33   #9
miramentis
 
Регистрация: 06.04.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от UaKot Посмотреть сообщение
Готовые алгоритмы на С++:
http://cppalgo.blogspot.ru/2010/05/blog-post.html

Здесь тоже есть решение и можно протестировать, но здесь заранее гарантируется, что делитель вмещается в целочисленный тип..
спасибо за ссылки, почитаю на досуге.
miramentis вне форума Ответить с цитированием
Старый 13.07.2013, 16:36   #10
miramentis
 
Регистрация: 06.04.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от -glykaman- Посмотреть сообщение
Скажите что за язык и система разработки - может хватит просто стандартных типов большего объема? long double например.
Цитата:
Сообщение от UaKot Посмотреть сообщение
Можно вообще на джаве) Там встроенный тип длинных чисел есть
необходим был именно алгоритм. я специально не стал размещать вопрос в разделе по конкретному языку.
miramentis вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти минимальное по модулю из N введенных чисел. Использовать цикл REPEAT 19Leon93 Помощь студентам 1 14.11.2012 22:43
Дан массив из N целых чисел. Получить из него массив чисел по модулю меньших 10 и отсортировать его(язык си++) mitja-zakelidis Помощь студентам 2 15.03.2012 03:10
Вводится 10 чисел. Найти среднее арифметическое положительных чисел и произведение отрицательных. Руся93 Помощь студентам 14 02.10.2011 13:12
Найти среди чисел пару чисел с минимальной по модулю разностью stas135642 Общие вопросы C/C++ 2 31.10.2010 12:40
Вычислить произведение P кубов трех чисел a, b и c, если их сумма меньше нуля, произведение P модулей NoUserName Помощь студентам 3 01.03.2009 18:10