![]() |
|
|
![]()
|
|
| T0ohtik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
Помогите разобраться с этим алгоритмом. В гугл просьба не слать, был не помог. Только формулы... Примеров нет. Задача такова, что есть очень большое число порядка 2 тыс разрядов. Надо перемножать на другое число. Для решения этой задачи я выбрал алгортм Быстрого преобразования Фурье. К примеру надо перемножить вектор А - 6 разрядов(обозначим m) и вектор B - 5 разрядов(обозначим n). Для начала надо посчитать коэфициенты С. Сколько будит их? (max(m,n)) ?
|
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 2 Всего: 17 |
Что за бред?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
многие, казалось бы, далёкие области математики иногда соприкасаются в неожиданных местах ;) умножение длинных чисел, если мне не изменяет память, сводится к свёртке, а БПФ может помочь вычислить её быстрее Добавлено @ 10:37
тут нужно учесть, что БПФ рассчитано на работу с векторами, длина которых - степень двойки (есть, правда, модификации, где вектор делится не на два, а на большее количество подпоследовательностей, но там, по-моему, всё менее оптимально и сложно) так что сначала, думаю, нужно округлить оба вектора до степени двойки вверх (для длинных чисел это делается вполне естественным образом - дополнение нулями) Это сообщение отредактировал(а) maxim1000 - 29.4.2008, 10:37 -------------------- qqq |
|||
|
||||
| maxdiver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
Размер C будет равен max(N,M), округленному вверх до степени двойки, и ещё умножить на 2.
Если, конечно, реализация алгоритма именно такова, что приводит размеры к степеням двойки (а другая реализация, как уже было сказано, менее популярна). |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 2 Всего: 17 |
И что будет быстрее, чем просто в столбик?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 2 Всего: 134 |
Да. На кывте говорится о такой оценке:
Это сообщение отредактировал(а) Mayk - 30.4.2008, 05:22 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| maxdiver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
В Кормене описывается алгоритм умножения с использованием БПФ с асимптотикой N log N (авторы алгоритма там не приводятся, возможно, что алгоритм "народный"
Кстати, у меня на сайте есть (http://maximal.hocomua.ru/fft_multiply.htm) описание этого алгоритма, (собсно перепечатанное из Кормена Это сообщение отредактировал(а) maxdiver - 30.4.2008, 08:53 |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
для достаточно длинных чисел (точного или даже приблизительного порога не знаю - надо на практике смотреть) БПФ всё-таки значительно сложнее свёртки в смысле структуры алгоритма и разнообразных вычислений и для маленьких длин, скорее всего, будет неэффективно но вот с ростом длины рост сложности у него меньше -------------------- qqq |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 2 Всего: 17 |
Так там смысл в том, что каждый разряд числа считается за элемент вектора, и таким образом два длинных числа превращаются в два многомерных вектора, которые потом надо свернуть?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
-------------------- qqq |
|||
|
||||
| T0ohtik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
maxim1000, этот pdf был взят с сайта algolist. Собственно говоря, оттуда я и узнал об этом алгоритме, но т.к. в математике я слабовато, то решил создать тему, чтоб задавать вопросы. Хочу сам написать реализацию, хотя в том же pdf она уже и приведена.
Кстати о скорости выполнения она равна Log N и судя по графику, приведенному в том же pdf, алгоритм оптимально использовать при длине числа - от 100 до 120 и от 180 разрядов. Ну а сейчас спатки, завтра начнем разбираться далее Это сообщение отредактировал(а) T0ohtik - 30.4.2008, 22:00 |
|||
|
||||
| T0ohtik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
Что-то я не пойму. В чем заключается этот алгоритм. Наши числа хранятся в массиве А и В - т.е. получается, они представлены как многочлен. Далее мы находим коэффициенты свертки, с. Которые равны сумме произведений всех элементов, индексы которых в сумме равно i. И эти коэффициенты будут произведением числа А на В. Правильно? Или я в чем - то ошибся.
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
да, только там есть ещё один нюанс:
после свёртки некоторые коэффициенты могут оказаться больше максимальной цифры например 5*100+12*10+3 для десятичной так что нужно будет пробежаться и поперекидывать лишние части в старшие разряды: (5+1)*100+2*10+3 -------------------- qqq |
|||
|
||||
| T0ohtik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
Т.е. другими словами алгоритм умножения десятичных чиел заключается в следующем:
1. выбираем максимальную длину из 2х векторов А и В. Количество коэффициентов свертки С у нас будит равно длине максимального вектора. 2. Дополняем меньший из векторов 0 до размеров большего из векторов. 3. Производим свертку векторов. 4. После свертки проверяем вектор и в случаи переполнения делаем переносы. Это и все? Не ясен момент с округлением векторов до степени двойки вверх. Зачем? Обязательно? |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
БПФ, как его обычно строят, состоит в том, чтобы: 1. разбить последовательность на две подпоследовательности одинаковой длины 2. посчитать спектры для них 3. посчитать спектр полной последовательности из двух спектров подпоследовательностей одинаковость длин подпоследовательностей означает, что длина исходной последовательности должна быть чётной, на каждом уровне длины отличаются в два раза т.к. на самом низком уровне у нас последовательности из одного элемента, то длина исходной должна быть степенью двойки Добавлено @ 19:25 в принципе, если на каком-то шаге у нас получилась последовательность нечётной длины, то можно посчитать спектр обычным способом - суммой произведений т.е. если у нас длина 2*2*2*2*3, может, и можно обойтись без дополнения до степени двойки но вот если 2*2*12345, удар по производительности может быть большой а реализовывать отличение первых случаев от вторых, ИМХО, не будет стоить выгод Это сообщение отредактировал(а) maxim1000 - 2.5.2008, 19:25 -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |