Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрое деление длинных чисел 
:(
    Опции темы
yeputons
Дата 22.4.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Требуется алгоритм быстрого деления одного длинного числа на другое. Быстрее, чем за O(n^2) (деление в столбик). Числа целые, основание системы счисления - 10^4.
Исходник не обязателен, но если есть только он, то выкладывайте (желательно на C/C++/Pascal).
PM MAIL ICQ Skype   Вверх
Silent
Дата 22.4.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



деление можно заменить на умножение на обратное число, а быстрых умножений - хоть отбавляй
PM MAIL   Вверх
yeputons
Дата 22.4.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а как же бесконечность рациональных дробей? потребовалось мне разделить чего-нибудь на 7^100: считаю обратное - до фига нулей, что-то страшное и какой-то левый период. И как мне прикажете это умножать на, к примеру, 15*(7^101) ? 

а даже если с этим и разобраться, то как быстро делить единицу на число (т.е. получить предпериод и период)?

p.s.быстрым умножением у меня выступает Карацуба.

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


uploading...
****


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

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



http://informatics.mccme.ru/moodle/file.ph...-arifmetika.doc

хотя предполагаю что тут не самые оптимальные решения. Но может чем-то поможет.

Это сообщение отредактировал(а) azesmcar - 22.4.2009, 13:08
PM   Вверх
yeputons
Дата 22.4.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



к сожалению, там только алгоритм деления длинного на короткое. а алгоритм умножения реализован за квадрат.
:-(


Это сообщение отредактировал(а) yeputons - 22.4.2009, 13:24
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 22.4.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



yeputons

Посмотрите во второй книге Дональда Кнута - Целочисленные вычисления. Там должен быть алгоритм. Лучше этого вряд ли найдете или придумаете smile
PM   Вверх
maxim1000
Дата 22.4.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



можно попробовать покрутить в сторону Фурье - попробовать провести рассуждения, похожие на умножение длинных чисел... хотя не уверен, что получится...


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


Опытный
**


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

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



Кнут советует найти сначала число 1/b, потом умножить его на a. А нахождение обратного числа (как раз самое интересное) предлагается модифицированными итерациями Ньютона. В итоге, как утверждается, это обратное число может быть найдено за время O(N)+T(8N), где T(x) - это время, необходимое для перемножения двух чисел длины x.

Таким образом, если для умножения мы используем что-нибудь более умное, чем столбик (Шенхаге-Штрассена за N log N (описано в Кормене) или Карацубу за N^1.73), то и деление мы можем выполнить асимптотически за то же время.
PM MAIL WWW ICQ   Вверх
yeputons
Дата 22.4.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



гм. то есть все-таки писать плавающую точку?
PM MAIL ICQ Skype   Вверх
maxdiver
Дата 23.4.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По его методу - да. Но должен же быть какой-то более прямолинейный метод деления чисел нацело, без плавучки...

Это сообщение отредактировал(а) maxdiver - 23.4.2009, 23:32
PM MAIL WWW ICQ   Вверх
yeputons
Дата 23.4.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я вот тоже так думаю... хотя, если подумать, то и плавающая точка не так уж страшно - можно хранить не один массив цифер, а два...
хотя я думаю, что просто заюзаю OpenSSL (изначальная цель была написать то ли Elgamal, то ли RSA)
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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