Как умножить целые числа в C++?
мне было интересно, какой метод использовался для умножения чисел на C++. Это традиционное школьное умножение? Fürer это? Тоома-Кука?
мне было интересно, потому что мне нужно будет умножать очень большие числа и нужна высокая степень эффективности. Поэтому в учебник умножение O(n^2)
может быть слишком неэффективным, и мне нужно будет прибегнуть к другому методу мультипликационный.
Итак, какое умножение использует C++?
8 ответов
вы, кажется, упускаете несколько важных вещей здесь:
- есть разница между уроженца арифметические и bignum арифметика.
- вы, кажется, заинтересованы в bignum арифметика.
- 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 атомов в наблюдаемой Вселенной.
Сначала напишите, чего вы хотите достичь, и при необходимости оптимизируйте позже.