Приведите и обоснуйте критерии выбора между традиционным умножением "в столбик", алгоритмом Карацубы и умножением с использованием преобразования Фурье при умножении двух целых чисел длиной по 10 цифр; в каких случаях один метод предпочтительнее другого и почему
Краткий ответ: для двух целых чисел по 10 десятичных цифр однозначно лучшим будет традиционный «в столбик» анапрактике—простомашинноеумножениев64‑битсловеа на практике — просто машинное умножение в 64‑бит словеанапрактике—простомашинноеумножениев64‑битслове. Алгоритмы Карацубы и FFT имеют смысл только при значительно большей длине чисел из‑за больших накладных расходов.
Обоснование — критерии выбора
Асимптотика vs константы
Школьный алгоритм: On2n^2n2 операций умножения «цифра×цифра». Очень маленькие накладные расходы.Карацуба: Onlog23n^{log2 3}nlog23 ≈ On1.585n^{1.585}n1.585. Лучше асимптотически, но требует рекурсивных вызовов, дополнительных сложений и выделения/копирования блоков — существенные константы.FFT‑умножение бинарный/дискретныйсвёрточныйподход,Scho¨nhage–Strassenит.п.бинарный/дискретный свёрточный подход, Schönhage–Strassen и т.п.бинарный/дискретныйсвёрточныйподход,Scho¨nhage–Strassenит.п.: ≈ Onlognn log nnlogn. Очень малые асимптотические показатели при больших n, но очень большие константы FFT,преобразованиясплавающей,постановкаостаточнойНТТит.п.FFT, преобразования с плавающей, постановка остаточной НТТ и т. п.FFT,преобразованиясплавающей,постановкаостаточнойНТТит.п., требования к памяти и аккуратности округления.
Практическая «граница эффективности»
Для очень маленьких n парыдесятковцифрименьшепары десятков цифр и меньшепарыдесятковцифрименьше выигрывает школьный метод илипрямоодномашинноеумножение,есличислаумещаютсявсловоили прямо одно машинное умножение, если числа умещаются в словоилипрямоодномашинноеумножение,есличислаумещаютсявслово.Карацуба обычно начинает выигрывать при средних длинах — порядок десятков–сотен машинных «лимбов» вдесятичныхцифрахэтоможетбытьдесятки–сотницифрв десятичных цифрах это может быть десятки–сотни цифрвдесятичныхцифрахэтоможетбытьдесятки–сотницифр; точный порог зависит от базы/лимба и реализации компилятор,язык,оптимизациякомпилятор, язык, оптимизациякомпилятор,язык,оптимизация. Практически: порог может быть порядка нескольких десятков — нескольких сотен десятичных цифр.FFT/Schonhage–Strassen илиNTT‑реализацииили NTT‑реализацииилиNTT‑реализации начинают выигрывать только при очень больших размерах — тысячах–миллионах бит вдесятичныхцифрах—тысячи–десяткитысячцифрибольшев десятичных цифрах — тысячи–десятки тысяч цифр и большевдесятичныхцифрах—тысячи–десяткитысячцифрибольше. В высокооптимизированных библиотеках порог для FFT обычно лежит в районе десятков тысяч — сотен тысяч цифр.
Накладные расходы реализации и точность
Карацуба требует больше кода, рекурсии и памяти; но не имеет проблем с округлением.FFT‑умножение на основе плавающей требует аккуратного контроля погрешностей или перехода на NTT численноеколебание,необходимостьвыборамодуля/корней,выравниваниепостепенямдвойкиит.д.численное колебание, необходимость выбора модуля/корней, выравнивание по степеням двойки и т.д.численноеколебание,необходимостьвыборамодуля/корней,выравниваниепостепенямдвойкиит.д.. Это усложняет реализацию.Аппаратная поддержка: современный CPU имеет очень быстрый 64‑бит умножитель; если оба числа умещаются в один машинный регистр — достаточно одного машинного умножения.
Применение к указанной задаче по10десятичныхцифрпо 10 десятичных цифрпо10десятичныхцифр
10 десятичных цифр ≈ числа < 10^10 < 2^34, то есть помещаются в 64‑бит целое. Реальный лучший способ — одно машинное умножение вязыке/библиотеке—простоa∗bв языке/библиотеке — просто a*bвязыке/библиотеке—простоa∗b. Нет никакого смысла раскладывать на половины или вызывать FFT.Даже если считать «цифрой» именно десятичную цифру и сравнивать количества элементарных операций: школьный способ требует 10×10 = 100 операций «цифра×цифра», Карацуба при делении пополам потребует 3 умножения 5×5 3×25=753×25 = 753×25=75 плюс значительные дополнительные сложения и движение данных — на таком маленьком n эти накладные расходы перевесят выигрыш, а на машинном уровне всё ещё эффективнее 1‑операция умножения 64‑бит.
Практические советы
Для длин ≤ несколько десятков–сотен цифр используйте оптимизированный школьный алгоритм или гибрид Toom‑Cook/КарацубаначинаетприменятьсявнутрибольшихбиблиотектольковышепорогаToom‑Cook/Карацуба начинает применяться внутри больших библиотек только выше порогаToom‑Cook/Карацубаначинаетприменятьсявнутрибольшихбиблиотектольковышепорога.Для длины ≳ сотен–тысяч цифр смотрите на Карацубу/Toom‑Cook/гибриды реализациябиблиотекиопределяетточныйпорогреализация библиотеки определяет точный порогреализациябиблиотекиопределяетточныйпорог.Для экстремально больших чисел тысячи–десяткитысячцифриболеетысячи–десятки тысяч цифр и болеетысячи–десяткитысячцифриболее используйте FFT/NTT‑методы Schonhage–StrassenилиболееновыеSchonhage–Strassen или более новыеSchonhage–Strassenилиболееновые.
Вывод: для двух 10‑значных чисел — стандартное умножение встолбикили,напрактике,машинноеумножениев столбик или, на практике, машинное умножениевстолбикили,напрактике,машинноеумножение — самое быстрое и простое решение. Карацуба и FFT — излишни из‑за накладных расходов и реализации.
Краткий ответ: для двух целых чисел по 10 десятичных цифр однозначно лучшим будет традиционный «в столбик» анапрактике—простомашинноеумножениев64‑битсловеа на практике — просто машинное умножение в 64‑бит словеанапрактике—простомашинноеумножениев64‑битслове. Алгоритмы Карацубы и FFT имеют смысл только при значительно большей длине чисел из‑за больших накладных расходов.
Обоснование — критерии выбора
Асимптотика vs константы
Школьный алгоритм: On2n^2n2 операций умножения «цифра×цифра». Очень маленькие накладные расходы.Карацуба: Onlog23n^{log2 3}nlog23 ≈ On1.585n^{1.585}n1.585. Лучше асимптотически, но требует рекурсивных вызовов, дополнительных сложений и выделения/копирования блоков — существенные константы.FFT‑умножение бинарный/дискретныйсвёрточныйподход,Scho¨nhage–Strassenит.п.бинарный/дискретный свёрточный подход, Schönhage–Strassen и т.п.бинарный/дискретныйсвёрточныйподход,Scho¨nhage–Strassenит.п.: ≈ Onlognn log nnlogn. Очень малые асимптотические показатели при больших n, но очень большие константы FFT,преобразованиясплавающей,постановкаостаточнойНТТит.п.FFT, преобразования с плавающей, постановка остаточной НТТ и т. п.FFT,преобразованиясплавающей,постановкаостаточнойНТТит.п., требования к памяти и аккуратности округления.Практическая «граница эффективности»
Для очень маленьких n парыдесятковцифрименьшепары десятков цифр и меньшепарыдесятковцифрименьше выигрывает школьный метод илипрямоодномашинноеумножение,есличислаумещаютсявсловоили прямо одно машинное умножение, если числа умещаются в словоилипрямоодномашинноеумножение,есличислаумещаютсявслово.Карацуба обычно начинает выигрывать при средних длинах — порядок десятков–сотен машинных «лимбов» вдесятичныхцифрахэтоможетбытьдесятки–сотницифрв десятичных цифрах это может быть десятки–сотни цифрвдесятичныхцифрахэтоможетбытьдесятки–сотницифр; точный порог зависит от базы/лимба и реализации компилятор,язык,оптимизациякомпилятор, язык, оптимизациякомпилятор,язык,оптимизация. Практически: порог может быть порядка нескольких десятков — нескольких сотен десятичных цифр.FFT/Schonhage–Strassen илиNTT‑реализацииили NTT‑реализацииилиNTT‑реализации начинают выигрывать только при очень больших размерах — тысячах–миллионах бит вдесятичныхцифрах—тысячи–десяткитысячцифрибольшев десятичных цифрах — тысячи–десятки тысяч цифр и большевдесятичныхцифрах—тысячи–десяткитысячцифрибольше. В высокооптимизированных библиотеках порог для FFT обычно лежит в районе десятков тысяч — сотен тысяч цифр.Накладные расходы реализации и точность
Карацуба требует больше кода, рекурсии и памяти; но не имеет проблем с округлением.FFT‑умножение на основе плавающей требует аккуратного контроля погрешностей или перехода на NTT численноеколебание,необходимостьвыборамодуля/корней,выравниваниепостепенямдвойкиит.д.численное колебание, необходимость выбора модуля/корней, выравнивание по степеням двойки и т.д.численноеколебание,необходимостьвыборамодуля/корней,выравниваниепостепенямдвойкиит.д.. Это усложняет реализацию.Аппаратная поддержка: современный CPU имеет очень быстрый 64‑бит умножитель; если оба числа умещаются в один машинный регистр — достаточно одного машинного умножения.Применение к указанной задаче по10десятичныхцифрпо 10 десятичных цифрпо10десятичныхцифр
10 десятичных цифр ≈ числа < 10^10 < 2^34, то есть помещаются в 64‑бит целое. Реальный лучший способ — одно машинное умножение вязыке/библиотеке—простоa∗bв языке/библиотеке — просто a*bвязыке/библиотеке—простоa∗b. Нет никакого смысла раскладывать на половины или вызывать FFT.Даже если считать «цифрой» именно десятичную цифру и сравнивать количества элементарных операций: школьный способ требует 10×10 = 100 операций «цифра×цифра», Карацуба при делении пополам потребует 3 умножения 5×5 3×25=753×25 = 753×25=75 плюс значительные дополнительные сложения и движение данных — на таком маленьком n эти накладные расходы перевесят выигрыш, а на машинном уровне всё ещё эффективнее 1‑операция умножения 64‑бит.Практические советы
Для длин ≤ несколько десятков–сотен цифр используйте оптимизированный школьный алгоритм или гибрид Toom‑Cook/КарацубаначинаетприменятьсявнутрибольшихбиблиотектольковышепорогаToom‑Cook/Карацуба начинает применяться внутри больших библиотек только выше порогаToom‑Cook/Карацубаначинаетприменятьсявнутрибольшихбиблиотектольковышепорога.Для длины ≳ сотен–тысяч цифр смотрите на Карацубу/Toom‑Cook/гибриды реализациябиблиотекиопределяетточныйпорогреализация библиотеки определяет точный порогреализациябиблиотекиопределяетточныйпорог.Для экстремально больших чисел тысячи–десяткитысячцифриболеетысячи–десятки тысяч цифр и болеетысячи–десяткитысячцифриболее используйте FFT/NTT‑методы Schonhage–StrassenилиболееновыеSchonhage–Strassen или более новыеSchonhage–Strassenилиболееновые.Вывод: для двух 10‑значных чисел — стандартное умножение встолбикили,напрактике,машинноеумножениев столбик или, на практике, машинное умножениевстолбикили,напрактике,машинноеумножение — самое быстрое и простое решение. Карацуба и FFT — излишни из‑за накладных расходов и реализации.