2013-06-04 5 views
1

Я ищу для написания алгоритма, который требуется для разделения двух необоснованно больших чисел (обе тысячи цифр).раздел над ограничениями типа данных

Есть ли библиотека, которая уже существует в python или C++ (или сборке), которая делает это? Возможно ли это?

Там arn't никаких временных ограничений или что-нибудь

+0

Первое, что приходит в голову, это numpy. Поскольку он используется для научных задач, я предполагаю, что он имеет средства для обработки огромных чисел. – pypat

+1

Просьба уточнить ваши потребности. Я задал вопрос о способе обработки чисел «тысячи цифр долго», но в комментариях, которые вы говорите, вы действительно хотите обрабатывать числа с несколькими гигабайтами. Это две совершенно разные потребности. Число «тысячи цифр» длится несколько килобайт. – svk

ответ

3

Python уже поддерживает большие целые числа, так что хватает только функциональность рациональных чисел. Это обеспечивается фракциями модуля:

from fractions import Fraction 
>>> print float(Fraction(2**54343)/Fraction(2**54347 + 1)) 
0.0625 
>>> print Fraction(2**54343)/Fraction(2**54347 + 1) 
# ... very long exact answer expressed as a fraction ... 
+0

Есть ли вещи выше bigint? – Darcys22

+0

@ Darcys22 Python по умолчанию использует большие целые числа (но не рациональные). 2 ** 54343 - это возведение в степень, которое приводит к 16359-значному числу. Другой номер аналогичного размера. Вы можете просто ввести «2 ** 54343» в командной строке Python и отобразить номер. – svk

+0

Я думаю больше. С 2 ** 23432532652 Я получаю ошибку памяти, поэтому я думаю, что это не проблема языка, а ограничение, навязываемое размерами страниц или чем-то – Darcys22

2

В C++ можно использовать Boost.Multiprecision библиотеки:

Multiprecision Библиотека предоставляет целое, рациональный и типы с плавающей точкой в ​​C++, которые имеют больший радиус действия и точность, чем обычные встроенные типы с ++

Пример:

#include <iostream> 
#include <string> 
#include <utility> 

#include <boost/multiprecision/mpfr.hpp> 

int main() 
{ 
    std::string s(100, '0'); 
    s.at(0) = '1'; 
    boost::multiprecision::mpfr_float_1000 f1(std::move(s)); 
    boost::multiprecision::mpfr_float_1000 f2 = f1/42; 
    std::cout << f2.str() << std::endl; 

    return 0; 
} 
+0

Как именно работает этот код? Прорабатывается ли он через строку, а не хранит ее как тип данных? – Darcys22

+1

@ Darcys22, 'Boost.Multiprecision' - это всего лишь оболочка для некоторых популярных библиотек многоточечной обработки. В приведенном ниже примере используется библиотека 'mpfr'. Я не знаю, как номера хранятся в этой библиотеке, извините. – soon

+2

@ Darcys22: Если под «строкой» вы подразумеваете печатную строку десятичных цифр, тогда нет.Он представляет большие числа в виде массива (или строки, если хотите) меньших комков (возможно, 32 или 64 бит, чтобы соответствовать типам данных, с которыми процессор может работать напрямую), и выполняет арифметику, используя алгоритмы, такие как «длинное разделение». –

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