2017-02-13 15 views
1

Когда C умножает два целых числа n-bits, использует ли он обычный алгоритм умножения O(n^2) или использует вариацию алгоритма умножения Карацаба O(n^log_2(3))?Использует ли C внутренний алгоритм Карацубы для умножения двух целых чисел?

+9

Стандарт C сам по себе не диктует такие детали реализации. Каждый компилятор выбирает соответствующие инструкции для каждой целевой архитектуры, поэтому он будет зависеть от этого набора команд. – StoryTeller

+0

C - нет. Компилятор - возможно, нет. Базовая архитектура HW - может быть. –

+2

C не имеет n-битовых целых чисел. – melpomene

ответ

2

№. Накладные расходы на «хранение книги» алгоритма Карацубы слишком высоки и слишком сложны. Это будет гораздо больше кремния, чем множитель, даже если это будет достижение безубыточной рекурсивной глубины на уровне машинного слова. Аппаратный крипто-ускоритель или FPGA может сделать его стоящим достаточно большим n. Даже тогда безубыточность может быть слишком высокой, чтобы быть полезной для криптографических потребностей. Нет бесплатного обеда.

На другом конце спектра, мы можем посмотреть на gmp-mparam.h файлы в GMP library, которые определяют пороговые значения, при которых асимптотически быстрые алгоритмы фактически начинают окупаться. «Карацуба» - это случай 2x2 более общего алгоритма Тоом-Кук. Даже на таких монстрах, как Broadwell и Skylake CPU, порог составляет около 28 слов, или 1792 бит. Это связано с накладными расходами (рекурсивно), добавляющими 3 результата назад вместе с переносом переноса. Эти пороговые значения будут продолжать увеличиваться по мере увеличения пропускной способности инструкций.

 Смежные вопросы

  • Нет связанных вопросов^_^