Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283

Потестируйте скорость работы класса больших чисел

19.08.2015, 17:47. Показов 5914. Ответов 100
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребятки, сделал себе небольшой классик для больших чисел.
Типа того:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
static const long long BASE = 1000000000;
static const int BASE_DIGITS = 9;
 
enum sign { positive = 1, negative = -1 };
 
struct BigInt {
 
    std::vector<int> a;
    int sign;
 
    // constructors
    BigInt() : sign(positive) { } // default constructor
}
Ну и хотелось бы сравнить, насколько он медленно работает.
C++
1
2
3
4
5
6
7
8
>TestBigInt.exe -factorial 100000
--- factorial test ---
Calculating 100000!
 big integer :  2824 ... 0
 number of decimal digits = 456574
 number of segments       = 50731
 
time : 10.961 sec.
Это на Intel Quad Q9550 2,8 GHz
Если у кого есть результаты, приведите их пожалуйста.

*мне нравятся большие числа и женщины, но с числами интереснее.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.08.2015, 17:47
Ответы с готовыми решениями:

Скорость работы id и класса
Что быстрее работает id или класс? Бывают такие моменты, что думаешь, а что лучше использовать. Да понятно если стиль повторяется много...

Обертка класса, наследование - скорость работы
1. Есть класс MyServer(использует класс TcpListener), как только MyServer ловит какое то соединение, он возвращает ссылку на экземпляр...

Конструктор класса больших чисел
Добрый вечер! Решаю следующую задачу: нужно создать класс Huge, который будет использовать массив из 50 элементов для хранения целых...

100
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.08.2015, 18:03
Python
1
2
import math
math.factorial(100000);
Bash
1
real    0m3.942s
2 GHz Intel Core i7
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
19.08.2015, 18:44
У меня основные тормоза при вычислении остатка поразрядного умножения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// длинное умножается на целое
BigI* mul(int x) {
    long64 l,l0;
    int i;
 
    // умножаем i-й разряд на n и складываем с i-м разрядом переноса
    l0=0;
    for(i=0;i<n;++i)
    {
        l=(long64)x*m[i]+l0;
    m[i]=(big32)(l%base); // здесь тормоза
    l0=l/base;
    }
    if (l0>0)
        m[n++]=l0;
    return this;
    }
На haswell 4590 100000! считает почти минуту

Добавлено через 6 минут
А Maple выдает ответ мгновенно...
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
19.08.2015, 19:51  [ТС]
Цитата Сообщение от zer0mail Посмотреть сообщение
// длинное умножается на целое
zer0mail, в Вашем коде чего-то совсем не разобраться.
Переменные n и m вообще непонятно откуда взялись.

ct0r, результат Питона очень приличный.

Добавлено через 9 минут
@ct0r
Если не трудно, не могли бы Вы показать за сколько Питон вычисляет (2 ^ 859433) - 1 ?

У меня так( при наивном умножением):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>TestBigInt.exe -mul M33
--- multiplication test ---
Generating the Mersenn prime M33 = (2 ^ 859433) - 1
 
 Ok.
 big integer :  12 ... 500142591
 number of decimal digits = 258716
 number of segments       = 28747
 
 time : 3.151 sec.
 
Multiplying M33 * M33
 big integer :  167 ... 332193281
 number of decimal digits = 517431
 number of segments       = 57493
 
 time : 7.725 sec.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
19.08.2015, 19:57
m-массив, хранящий длинное число (9 или 4 десятичных разряда), n-размер заполненной части массива.
Интересно бы посмотреть на код умножения вектора на число.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.08.2015, 20:14
Цитата Сообщение от SerVal Посмотреть сообщение
Если не трудно, не могли бы Вы показать за сколько Питон вычисляет (2 ^ 859433) - 1 ?
real 0m0.028s - (2 ^ 859433) - 1
real 0m0.117s - ((2 ^ 859433) - 1) ^2
1
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
19.08.2015, 20:16
Maple вычисляет (2 ^ 859433) - 1 мгновенно: 1294981256042076496665334852555620733841 6201991741656937019066267567814724084952 96919893191078354681[...258516 digits...]1729168775671683165419536906002518061544 6621108760768952138487432526245965721589 02414267243500142591
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.08.2015, 20:53
Haskell
1
main = print . length . show . product $ [1..100000]
Code
1
2
Успешно  time: 3.74 memory: 7832 signal:0
456574
https://ideone.com/nytrOi
2
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
19.08.2015, 21:00  [ТС]
Цитата Сообщение от zer0mail Посмотреть сообщение
Интересно бы посмотреть на код умножения вектора на число.
Если в смысле умножения большого числа(вектор) на большое, то вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    // всё Ок. Но медленно.  :(
    // naive multiplication. 
    BigInt operator * (const BigInt& x) const {
 
        BigInt res; 
        res.a.resize(a.size()*x.a.size() + 1); // вот тут память отъедает немеряно.
 
        for (long long i = 0; i < a.size(); ++i) {
            long long carry = 0;
            for (long long j = 0; j < x.a.size(); ++j) {
                long long v = (long long)a[i] * x.a[j] + res.a[i + j] + carry;
                carry = v / BASE;
                res.a[i + j] = v % BASE;
            }
            if (carry) res.a[i + x.a.size()] += carry;
        }
        res.trim();
        return res;
    }
Вот тут товарищ аккуратно всё сделал, с пояснениями на русском. Длинная арифметика: http://pastebin.com/MxQdP5s9
- можно зацапывать в хэдер и сразу писать свою main(int argc, char *argv[])
* умножения Карацубой и деления Ньютоном-Рафсоном там нетути.
только наивное умножение и деление.
****
zer0mail, ct0r - спасибо.
Да... Питон и Мапл впечатляют.. жаль, что из них в С++ ничего не зацапаешь.

Попробую у себя чё-нить, ускорить.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
19.08.2015, 21:46
SerVal, у Вас есть exe-ник, считающий 100000!. Хочу на своем компе запустить. Не нравится мне, что простое умножение длинного числа (хранится в массиве) на целое выполняется в 6 раз медленней.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
19.08.2015, 22:12
Цитата Сообщение от SerVal Посмотреть сообщение
мне нравятся большие числа и женщины, но с числами интереснее.
Что касается исходной посылки, то я с вами совершенно солидарен. Но числами я занимаюсь, когда женщины не обращают на меня внимания. Увы! с годами это происходит все чаще!
Честно говоря, я в ваших кодах и кодах участников этого топика разбираться не стал. Смутило BASE_DIGIT=9.
Вот когда я оставался без женской ласки и утешался большими числами, то работал с числами по основанию 32768. Это одновременно уважение как к числам, с которыми работаешь, так и к компьютеру, на котором эти числа обрабатываешь.

Не по теме:

Если я чего не понял в предыдущих обсуждениях - прошу прощения, смотрел я их по диагонали. Ибо нонче сижу на пенечке, ножками дрыгаю.



Добавлено через 10 минут
SerVal, лично вам я желаю успеха во всем, что вам нравится. Но может быть, оба ваши пристрастия объединяет бесконечность?
1
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
19.08.2015, 22:19  [ТС]
SerVal, у Вас есть exe-ник, считающий 100000!. Хочу на своем компе запустить. Не нравится мне, что простое умножение длинного числа (хранится в массиве) на целое выполняется в 6 раз медленней.
Экзешник есть, но непонятно, как его сюда передать.
Похоже, прикрутить вложенный файл к сообщению на этом форуме низя.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>TestBigInt.exe
Usage:
TestBigInt.exe -factorial
TestBigInt.exe -factorial 100000
 
TestBigInt.exe -mul
TestBigInt.exe -mul M23
 
TestBigInt.exe -power
TestBigInt.exe -power M23
 
TestBigInt.exe -sqrt
TestBigInt.exe -sqrt M23
 
TestBigInt.exe -miller_rabin
TestBigInt.exe -miller_rabin M23
 
TestBigInt.exe -lucas_lehmer
TestBigInt.exe -lucas_lehmer M23
 
TestBigInt.exe -fermat
TestBigInt.exe -fermat M23
 
TestBigInt.exe -string
TestBigInt.exe -string M23
 
TestBigInt.exe -candidate 2 12345 -1
 
 where M1 ... M48 are Mersenn number short names.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
19.08.2015, 22:21
Смотрю окно ассемблера в VS2010 и копирую из него кусок кода в C++ файл.
Не компилирует.
Assembler
1
2
3
4
5
6
7
8
9
10
11
        __asm {
    mov         eax,dword ptr [l]  
    cdq  
    mov         ecx,2710h  
    idiv        eax,ecx  // здесь error C2414: недопустимое число операторов
    mov         dword ptr [l0],eax  
    mov         eax,dword ptr [this]  
    mov         ecx,dword ptr [eax+4]  
    mov         eax,dword ptr [i]  
    mov         dword ptr [ecx+eax*4],edx  
    }
Откуда ошибка, ведь я скопировал то, что было в ассемблере?
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
19.08.2015, 22:27  [ТС]
Цитата Сообщение от zer0mail Посмотреть сообщение
Откуда ошибка, ведь я скопировал то, что было в ассемблере?
Дык, VS ужо не поддерживает ассемблерные вставки.

*у меня VS2013.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
19.08.2015, 22:34
Оказывается, надо было так:
Assembler
1
idiv        ecx
Добавлено через 2 минуты
Цитата Сообщение от SerVal Посмотреть сообщение
Похоже, прикрутить вложенный файл к сообщению на этом форуме низя
Жмешь кнопки "расширенный режим, управление вложениями". Только, наверное, лучше заархивировать.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
19.08.2015, 22:36  [ТС]
Цитата Сообщение от zer0mail Посмотреть сообщение
Жмешь кнопки "расширенный режим, управление вложениями". Только, наверное, лучше заархивировать.
Сейчас попробую и отпишусь.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
19.08.2015, 22:40  [ТС]
Прикрутил заархивированный экзешник.
Вложения
Тип файла: rar TestBigInt_exe.rar (31.8 Кб, 4 просмотров)
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
20.08.2015, 00:04
6.5 сек. Непонятно, где у меня тормоза получаются.

Добавлено через 1 час 15 минут
Скачал http://pastebin.com/MxQdP5s9. 20000! считает раз в 30 медленней моего. А мой был в 6 раз медленней, чем у ТС (теперь в 2 раза).
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
20.08.2015, 00:31  [ТС]
Цитата Сообщение от zer0mail Посмотреть сообщение
20000! считает раз в 30 медленней моего. А мой был в 6 раз медленней, чем у ТС (теперь в 2 раза).
Ну, я написал, что там всё аккуратно и правильно. И может быть взято за какую-то основу.
Наивное там не только умножение и деление:

C++
1
2
3
4
5
// префиксный инкремент
const big_integer big_integer::operator++() 
{
    return (*this += 1);
}
- это ж детский сад, штаны на лямке.

C++
1
2
3
4
5
6
7
8
const BigInt operator++() 
{
    if (a[0] < BASE_MINUS_1)
       {   a[0]++; 
             return;
        }
      *this += 1
}
0
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
20.08.2015, 02:27
основание правильно, что взяли большое. Если хочется самому писать велосипеды ради интереса, а не взять готовое отлаженное решение, то могу посоветовать прикрутить умножение через БПФ(Быстрое преобразование Фурье). Потом, если на векторах пишется, то выделяйте память сразу, чтобы не перевыделял, медленно это. Мелкие оптимизации по коду возможны. Ассемблерные вставочки можно. Что-то больше ничего так сразу на ум и не приходит
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2015, 02:27
Помогаю со студенческими работами здесь

Создание класса для работы с массивами чисел
Сделать класс для работы с массивами чисел. У класса должно быть 5 метода. 1. Получение первого элемента массива. 2....

Создать класс для работы с одномерным массивом целых чисел. Разработать следующие элементы класса:
Создать класс для работы с одномерным массивом целых чисел. Разработать следующие элементы класса: Свойства: • возвращающее размерность...

Разработать класс "Массив больших чисел", который состоит из объектов класса "Большие целые числа". Найти сумму элементов массива.
Разработать класс &quot;Массив больших чисел&quot;, который состоит из объектов класса &quot;Большие целые числа&quot;. Найти сумму элементов...

ArrayList, скорость копирования больших структур, копирование по ссылке
Добрый день, Возникла следующая ситуация, в программе есть ArrauList на базе сложной и громосткой структуры данных. И есть ф-и, которые...

Реализация класса "Вектор" для работы с массивом чисел
Помогите решить задачу пожалуйста) Объявите класс &quot;Вектор&quot;, полем которого является массив чисел, а методами: очистка вектора; добавление...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru