![]() |
|
|
![]()
|
|
| yeputons |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 1.4.2009 Где: Санкт-Петербург Репутация: нет Всего: 5 |
Требуется алгоритм быстрого деления одного длинного числа на другое. Быстрее, чем за O(n^2) (деление в столбик). Числа целые, основание системы счисления - 10^4.
Исходник не обязателен, но если есть только он, то выкладывайте (желательно на C/C++/Pascal). |
|||
|
||||
| Silent |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 1 Всего: 9 |
деление можно заменить на умножение на обратное число, а быстрых умножений - хоть отбавляй
|
|||
|
||||
| yeputons |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 1.4.2009 Где: Санкт-Петербург Репутация: нет Всего: 5 |
а как же бесконечность рациональных дробей? потребовалось мне разделить чего-нибудь на 7^100: считаю обратное - до фига нулей, что-то страшное и какой-то левый период. И как мне прикажете это умножать на, к примеру, 15*(7^101) ?
а даже если с этим и разобраться, то как быстро делить единицу на число (т.е. получить предпериод и период)? p.s.быстрым умножением у меня выступает Карацуба. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
http://informatics.mccme.ru/moodle/file.ph...-arifmetika.doc
хотя предполагаю что тут не самые оптимальные решения. Но может чем-то поможет. Это сообщение отредактировал(а) azesmcar - 22.4.2009, 13:08 |
|||
|
||||
| yeputons |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 1.4.2009 Где: Санкт-Петербург Репутация: нет Всего: 5 |
к сожалению, там только алгоритм деления длинного на короткое. а алгоритм умножения реализован за квадрат.
:-( Это сообщение отредактировал(а) yeputons - 22.4.2009, 13:24 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
yeputons
Посмотрите во второй книге Дональда Кнута - Целочисленные вычисления. Там должен быть алгоритм. Лучше этого вряд ли найдете или придумаете |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
можно попробовать покрутить в сторону Фурье - попробовать провести рассуждения, похожие на умножение длинных чисел... хотя не уверен, что получится...
-------------------- qqq |
|||
|
||||
| maxdiver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
Кнут советует найти сначала число 1/b, потом умножить его на a. А нахождение обратного числа (как раз самое интересное) предлагается модифицированными итерациями Ньютона. В итоге, как утверждается, это обратное число может быть найдено за время O(N)+T(8N), где T(x) - это время, необходимое для перемножения двух чисел длины x.
Таким образом, если для умножения мы используем что-нибудь более умное, чем столбик (Шенхаге-Штрассена за N log N (описано в Кормене) или Карацубу за N^1.73), то и деление мы можем выполнить асимптотически за то же время. |
|||
|
||||
| yeputons |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 1.4.2009 Где: Санкт-Петербург Репутация: нет Всего: 5 |
гм. то есть все-таки писать плавающую точку?
|
|||
|
||||
| maxdiver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
По его методу - да. Но должен же быть какой-то более прямолинейный метод деления чисел нацело, без плавучки...
Это сообщение отредактировал(а) maxdiver - 23.4.2009, 23:32 |
|||
|
||||
| yeputons |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 1.4.2009 Где: Санкт-Петербург Репутация: нет Всего: 5 |
я вот тоже так думаю... хотя, если подумать, то и плавающая точка не так уж страшно - можно хранить не один массив цифер, а два...
хотя я думаю, что просто заюзаю OpenSSL (изначальная цель была написать то ли Elgamal, то ли RSA) |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |