Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрое преобразование Фурье 
:(
    Опции темы
T0ohtik
Дата 28.4.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите разобраться с этим алгоритмом. В гугл просьба не слать, был не помог. Только формулы... Примеров нет. Задача такова, что есть очень большое число порядка 2 тыс разрядов. Надо перемножать на другое число. Для решения этой задачи я выбрал алгортм Быстрого преобразования Фурье. К примеру надо перемножить вектор А - 6 разрядов(обозначим m) и вектор B - 5 разрядов(обозначим n). Для начала надо посчитать коэфициенты С. Сколько будит их? (max(m,n))  ?
PM MAIL   Вверх
ksili
Дата 29.4.2008, 06:05 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Что за бред?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
maxim1000
Дата 29.4.2008, 10:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ksili @  29.4.2008,  06:05 Найти цитируемый пост)
Что за бред?

многие, казалось бы, далёкие области математики иногда соприкасаются в неожиданных местах ;)

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

Добавлено @ 10:37
Цитата(T0ohtik @  28.4.2008,  23:19 Найти цитируемый пост)
Для начала надо посчитать коэфициенты С. Сколько будит их? (max(m,n))  ?

тут нужно учесть, что БПФ рассчитано на работу с векторами, длина которых - степень двойки
(есть, правда, модификации, где вектор делится не на два, а на большее количество подпоследовательностей, но там, по-моему, всё менее оптимально и сложно)
так что сначала, думаю, нужно округлить оба вектора до степени двойки вверх
(для длинных чисел это делается вполне естественным образом - дополнение нулями)

Это сообщение отредактировал(а) maxim1000 - 29.4.2008, 10:37


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


Опытный
**


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

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



Размер C будет равен max(N,M), округленному вверх до степени двойки, и ещё умножить на 2.
Если, конечно, реализация алгоритма именно такова, что приводит размеры к степеням двойки (а другая реализация, как уже было сказано, менее популярна).
PM MAIL WWW ICQ   Вверх
ksili
Дата 30.4.2008, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



И что будет быстрее, чем просто в столбик?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Mayk
Дата 30.4.2008, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(ksili @  30.4.2008,  09:03 Найти цитируемый пост)
И что будет быстрее, чем просто в столбик? 

Да. На кывте говорится о такой оценке:
Цитата(http://www.rsdn.ru/forum/message/573145.flat.aspx#573145)

Ищи описание алгоритма Шёнхаге-Штрассена для умножения целых чисел.
Там используется БПФ.
Его сложность O( n*log(n)*log( log(n) ));



Это сообщение отредактировал(а) Mayk - 30.4.2008, 05:22


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
maxdiver
Дата 30.4.2008, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В Кормене описывается алгоритм умножения с использованием БПФ с асимптотикой N log N (авторы алгоритма там не приводятся, возможно, что алгоритм "народный" smile ).

Кстати, у меня на сайте есть (http://maximal.hocomua.ru/fft_multiply.htm) описание этого алгоритма, (собсно перепечатанное из Кормена smile ) и работающий код. Так что желающие могут потестировать и сравнить скорость. Скажу, что например умножение двух 100-тысячных чисел он выполняет примерно за секунду (чего ни столбиком, ни, я думаю, даже Карацубой не добиться).

Это сообщение отредактировал(а) maxdiver - 30.4.2008, 08:53
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 30.4.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ksili @  30.4.2008,  05:03 Найти цитируемый пост)
И что будет быстрее, чем просто в столбик?

для достаточно длинных чисел (точного или даже приблизительного порога не знаю - надо на практике смотреть)
БПФ всё-таки значительно сложнее свёртки в смысле структуры алгоритма и разнообразных вычислений
и для маленьких длин, скорее всего, будет неэффективно
но вот с ростом длины рост сложности у него меньше


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


Эксперт
****


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

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



Так там смысл в том, что каждый разряд числа считается за элемент вектора, и таким образом два длинных числа превращаются в два многомерных вектора, которые потом надо свернуть?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
maxim1000
Дата 30.4.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



да


кстати, нашёл один pdf-ник по этой теме:
http://edu.krasu.ru/file.php/6/articles/LONG.pdf



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


Шустрый
*


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

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



maxim1000, этот pdf был взят с сайта algolist. Собственно говоря, оттуда я и узнал об этом алгоритме, но т.к. в математике я слабовато, то решил создать тему, чтоб задавать вопросы. Хочу сам написать реализацию, хотя в том же pdf она уже и приведена.
Кстати о скорости выполнения она равна Log N и судя по графику, приведенному в том же pdf, алгоритм оптимально использовать при длине числа -  от 100 до 120 и от 180 разрядов. 
Ну а сейчас спатки, завтра начнем разбираться далееsmile


Это сообщение отредактировал(а) T0ohtik - 30.4.2008, 22:00
PM MAIL   Вверх
T0ohtik
Дата 2.5.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что-то я не пойму. В чем заключается этот алгоритм. Наши числа хранятся в массиве А и В - т.е. получается, они представлены как многочлен.  Далее мы находим коэффициенты свертки, с. Которые равны сумме произведений всех элементов, индексы которых в сумме равно i. И эти коэффициенты будут произведением числа А на В. Правильно? Или я в чем - то ошибся.
PM MAIL   Вверх
maxim1000
Дата 2.5.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



да, только там есть ещё один нюанс:
после свёртки некоторые коэффициенты могут оказаться больше максимальной цифры
например 5*100+12*10+3 для десятичной
так что нужно будет пробежаться и поперекидывать лишние части в старшие разряды:
(5+1)*100+2*10+3


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


Шустрый
*


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

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



Т.е. другими словами алгоритм умножения десятичных чиел заключается в следующем:
1. выбираем максимальную длину из 2х векторов А и В. Количество коэффициентов свертки С у нас будит равно длине максимального вектора.
2. Дополняем меньший из векторов 0 до размеров большего из векторов.
3. Производим свертку векторов. 
4. После свертки проверяем вектор и в случаи переполнения делаем переносы.

Это и все? Не ясен момент с округлением  векторов до степени двойки вверх. Зачем? Обязательно?
PM MAIL   Вверх
maxim1000
Дата 2.5.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(T0ohtik @  2.5.2008,  14:29 Найти цитируемый пост)
Это и все? Не ясен момент с округлением  векторов до степени двойки вверх. Зачем? Обязательно?

БПФ, как его обычно строят, состоит в том, чтобы:
1. разбить последовательность на две подпоследовательности одинаковой длины
2. посчитать спектры для них
3. посчитать спектр полной последовательности из двух спектров подпоследовательностей
одинаковость длин подпоследовательностей означает, что длина исходной последовательности должна быть чётной, на каждом уровне длины отличаются в два раза
т.к. на самом низком уровне у нас последовательности из одного элемента, то длина исходной должна быть степенью двойки

Добавлено @ 19:25
в принципе, если на каком-то шаге у нас получилась последовательность нечётной длины, то можно посчитать спектр обычным способом - суммой произведений
т.е. если у нас длина 2*2*2*2*3, может, и можно обойтись без дополнения до степени двойки
но вот если 2*2*12345, удар по производительности может быть большой
а реализовывать отличение первых случаев от вторых, ИМХО, не будет стоить выгод

Это сообщение отредактировал(а) maxim1000 - 2.5.2008, 19:25


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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