Как умножить целые числа в C++?

мне было интересно, какой метод использовался для умножения чисел на C++. Это традиционное школьное умножение? Fürer это? Тоома-Кука?

мне было интересно, потому что мне нужно будет умножать очень большие числа и нужна высокая степень эффективности. Поэтому в учебник умножение O(n^2) может быть слишком неэффективным, и мне нужно будет прибегнуть к другому методу мультипликационный.

Итак, какое умножение использует C++?

8 ответов


вы, кажется, упускаете несколько важных вещей здесь:

  1. есть разница между уроженца арифметические и bignum арифметика.
  2. вы, кажется, заинтересованы в bignum арифметика.
  3. C++ не поддерживает bignum арифметика. Примитивные типы данных обычно уроженца арифметика для процессора.

чтобы получить арифметику bignum (произвольной точности), вам нужно реализовать ее самостоятельно или использовать библиотеку. (например,GMP) в отличие от Java и C# (среди прочих), C++ не имеет библиотеки для произвольной арифметики точности.

все эти причудливые алгоритмы:

  • Карацуба: O(n^1.585)
  • Тоома-Кука: < O(n^1.465)
  • FFT-based:~ O(n log(n))

несколько применимо только к арифметике bignum, которые реализованы в библиотеках bignum. То, что процессор использует для своих собственных арифметических операций, несколько не имеет значения, поскольку обычно постоянное время.


в любом случае я не рекомендую вам пытаться реализовать библиотеку bignum. Я делал это раньше, и это довольно требовательно (особенно математика). Так что тебе лучше воспользоваться библиотекой.


Что вы подразумеваете под "очень больших чисел"?

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

самые большие числа, которые могут быть представлены различными типами данных, могут варьироваться между различными реализациями, но некоторые типичные значения 2147483647 для int, 9223372036854775807 для долго, и 1.79769 e+308 для двойной.


в C++ целочисленное умножение обрабатывается чипом. На стандартном языке нет эквивалента BigNum Perl, хотя я уверен, что такие библиотеки существуют.


все зависит от используемой библиотеки и компилятора.


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


Если вы работаете с большими числами, стандартное целочисленное умножение в c++ больше не будет работать, и вы должны использовать библиотеку, обеспечивающую произвольное прецизионное умножение, например GMP http://gmplib.org/

кроме того, вы не должны беспокоиться о производительности до написания приложения (=преждевременная оптимизация). Эти умножения будут быстрыми, и, скорее всего, многие другие компоненты в вашем программном обеспечении вызовут гораздо большее замедление.


plain c++ использует инструкции CPU mult (или умножение школьной книги с использованием битовых сдвигов и дополнений, если ваш процессор не имеет такой инструкции. )

Если вам нужно быстрое умножение для больших чисел, я бы предложил посмотреть на gmp (http://gmplib.org) и использовать интерфейс c++ из gmpxx.h


насколько большими будут эти числа? Даже такие языки, как python, могут сделать 1e100*1e100 с произвольной точности целых чисел более 3 миллионов раз в секунду на стандартном процессоре. Это умножение до 100 значимых мест, занимающих менее одной миллионной секунды. Чтобы поместить это в контекст, есть только около 10^80 атомов в наблюдаемой Вселенной.

Сначала напишите, чего вы хотите достичь, и при необходимости оптимизируйте позже.