Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Библиотека для двоичных чисел. 
V
    Опции темы
konshyn
Дата 11.5.2015, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Добрый день. Может кто знает, есть ли для Си (желательно, но можно и для C++) библиотека для работы с длинными двоичными числами, где поддерживаются стандартный операции сложения, деления, деления по модулю, умножения, сравнения?


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
tzirechnoy
Дата 11.5.2015, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



gmp.

Нет, сам не пробовал.

Но вполне работает, многие пользуются.
PM MAIL   Вверх
kemiisto
Дата 11.5.2015, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



tzirechnoy, ты вопрос внимательно прочитал? Ему с двоичными числами надо работать, а не с десятичными.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
baldina
Дата 12.5.2015, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



kemiisto, а какая разница? ;-) gmp, к слову, к системе счисления не привязан
PM MAIL   Вверх
konshyn
Дата 12.5.2015, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(baldina @  12.5.2015,  10:49 Найти цитируемый пост)
kemiisto, а какая разница? ;-) gmp, к слову, к системе счисления не привязан 

Я не смог найти функций, отвечающих за какую-то определенную CC.
Нашеол только функции конвертации числа в другую систему. Она записывает результат в строку.
Смотрел для Си.

Конечно, можно было бы каждое двоичное число вручную переводить в десятичную СС, получить нужный результат, а потом перевести обратно.
Но это кастыль кастылем, и время работы увеличивается очень сильно, т.к. числа порядка 2^4000-5000.

Хотел сначала сам написать двоичную арифметику, но подумал, что есть готовая библиотека, где реализовано качественное продакш решение.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
sQu1rr
Дата 12.5.2015, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(konshyn @  12.5.2015,  10:16 Найти цитируемый пост)
Я не смог найти функций, отвечающих за какую-то определенную CC.

Цитата

int mpz_set_str (mpz_t rop, const char *str, int base)
char * mpz_get_str (char *str, int base, const mpz_t op)


https://gmplib.org/manual/Converting-Integers.html
https://gmplib.org/manual/Assigning-Integers.html
PM MAIL Skype GTalk   Вверх
konshyn
Дата 12.5.2015, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(sQu1rr @  12.5.2015,  15:00 Найти цитируемый пост)
int mpz_set_str (mpz_t rop, const char *str, int base)
char * mpz_get_str (char *str, int base, const mpz_t op)


Цитата(konshyn @  12.5.2015,  13:16 Найти цитируемый пост)
Нашеол только функции конвертации числа в другую систему


Вопрос стоит в том, как умножить/разделить два числа, хранящихся в строке с помощью API библиотеки?


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
sQu1rr
Дата 12.5.2015, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(konshyn @  12.5.2015,  12:59 Найти цитируемый пост)
Вопрос стоит в том, как умножить/разделить два числа, хранящихся в строке с помощью API библиотеки? 

Ну так и сделать, перегнать их в gmp структура, перемножить gmp функциями, сделать обратно строки... А что вас смещает в таком подходе? Я не думаю что это на много медленнее чем перемножение строк вручную. А деление довольно сложно сделать в любом случае.
PM MAIL Skype GTalk   Вверх
konshyn
Дата 12.5.2015, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(sQu1rr @  12.5.2015,  16:18 Найти цитируемый пост)
 А что вас смещает в таком подходе? 

меня смущает конвертация чисел туда-сюда порядка 2^4000-2^5000 в количестве 1млн штук.

Хотя, если подумать, то наверное это не так много времени займет, как думается.
Попробую, потом вернусь к теме, если не устроит:)


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
sQu1rr
Дата 12.5.2015, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(konshyn @  12.5.2015,  13:30 Найти цитируемый пост)
меня смущает конвертация чисел туда-сюда порядка 2^4000-2^5000 в количестве 1млн штук.

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

Давайте подумаем, если взять умножение, то не переводить в бинарный вид, и числа, скажем по 4000 символов (0,1), то нужно посчитать в среднем 2000 4000-символьных строк сдвинуть и сложить. можно оптимизировать, но сразу заметно как это бьет по произовдительности. Поэтому правильное решение все же перевести в бинарную форму и скормить такому зверю как gmp.

Цитата(konshyn @  12.5.2015,  13:30 Найти цитируемый пост)
Хотя, если подумать, то наверное это не так много времени займет, как думается.

Нужно бы бенчмарк сделать. быстрое умножение строки на строку в интернете легко найти



Это сообщение отредактировал(а) sQu1rr - 12.5.2015, 16:56
PM MAIL Skype GTalk   Вверх
konshyn
Дата 12.5.2015, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(sQu1rr @  12.5.2015,  16:56 Найти цитируемый пост)
Давайте подумаем, если взять умножение, то не переводить в бинарный вид, и числа, скажем по 4000 символов (0,1),

Это если хранить 1 бит в одном байте.
А если хранить биты в битах? Например, в типе __int64?
Производительность резко возрастает, если смотреть в конкретном случае, а не в термине "О большое".


Цитата(sQu1rr @  12.5.2015,  16:56 Найти цитируемый пост)
 быстрое умножение строки на строку в интернете легко найти

Умножение столбиком и без интернета пишется ~5 минут.

Цитата(sQu1rr @  12.5.2015,  16:56 Найти цитируемый пост)
Нужно бы бенчмарк сделать.

Просто сравнивать самописное умножение столбиком двух строк, даже с оптимизацией хранения бит в бите (а не байте) немного глупо, так как умножение в gmp реализовано посредством метода Карацубы.

Я надеялся найти библиотеку наподобии gmp, но только для бинарных чисел.

P.S. Написав последнее предложение я понял, что всего лишь ищу gmp с оберткой для двух функций - конвертации и занесения результата в структуру:). Так как оптимизация по памяти - это то же n-разрядное число в машине, которые мы видим в десятичной СС, ну а оптимизация по времени - тут gmp монстр монстров.

sQu1rr, спасибо, Вы оказались правы.smile

Это сообщение отредактировал(а) konshyn - 12.5.2015, 17:13


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
sQu1rr
Дата 12.5.2015, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(konshyn @  12.5.2015,  14:08 Найти цитируемый пост)
P.S. Написав последнее предложение я понял, что всего лишь ищу gmp с оберткой для двух функций - конвертации и занесения результата в структуру

 smile 
PM MAIL Skype GTalk   Вверх
baldina
Дата 12.5.2015, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(konshyn @  12.5.2015,  17:08 Найти цитируемый пост)
А если хранить биты в битах?

наконец-то  smile 

Цитата(konshyn @  12.5.2015,  17:08 Найти цитируемый пост)
всего лишь ищу gmp с оберткой для двух функций - конвертации и занесения результата в структуру:)

 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1087 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.