- Аппаратное умножение с применением ассемблерной команды MUL
(в дополнительном пакете), выполняется в 10 раз быстрее.
ПРИМЕЧАНИЕ: Ассемблерный дополнительный пакет не включен
в свободно распространяемую версию класса.
- Две реализации метода Карацубы, оптимизированные соответственно
для свободно распространяемого С кода и дополнительного
ассемблерного пакета.
ПРИМЕЧАНИЕ: Метод Карацубы относительно сложен в реализации
и тестировании. Он введен в версию 1.2а класса
как часть программы бета-тестирования. Если Вам
нужны надежные вычислению, то его лучше отключить,
для чего надо удалить из файла Cbignumf.inl макро
_CBIGNUM_KARATSUBA_MUL.
- Быстрое копирование в отладочном режиме, если применяется
дополнительный пакет.
- ИСПРАВЛЕНО: Внутренняя функция cBigNumberCopyShr() не работает
для ненормализованного 0.
- ИСПРАВЛЕНО: Увеличен размер буфера для внутренних функций
cBigNumberPow(), cBigNumberPowMod().
- ИСПРАВЛЕНО: Размер буфера в спецификации к внутренним функциям
cBigNumberMAddMulShl(), cBigNumberMSubMulShl(),
cBigNumberMAddMulShlKar(), cBigNumberMSubMulShlKar()
(ошибка не затрагивает код).
- ИСПРАВЛЕНО: Опция -size программы Arifexp.exe и метод dump()
работают неправильно под Visual C++ .NET.
- ИСПРАВЛЕНО: Arifexp.exe не проверяет остаток во время обратного
теста умножения.
- Дополнения в Arifexp.exe:
- Выводится среднее время под опцией -rep.
- Более эффективный тест умножения под опцией -check.
- Опция -time.
- Проверена совместимость с Microsoft Visual C++ Express 2008.
30.04.2007 ВЫШЛА ТЕСТОВАЯ ВЕРСИЯ 1.2a BETA INTERNAL
- Быстрое умножение больших чисел по методу Карацубы, увеличивающее
производительность при размере обоих операндов от 6,000 битов.
- В связи с реализаций метода Карацубы, рекомендованный верхний предел
для применения методов addmultab() and submultab() составляет теперь
6,000 бит.
- Ограниченная экспериментальная поддержка многопоточных приложений
с макро _CBIGNUM_MT, см. раздел 4.2.4.
- Новые операции cBigDivMod() и cBigSqrtRm().
- Новые машинно-зависимые методы set() и setr().
- ИСПРАВЛЕНО: Переполнение стека при сдвиге с отрицательным показателем
LONG_MIN.
- ИСПРАВЛЕНО: Операции возведения в степень и степень по модулю
переписывают cBigNumber::lastdivmod(), если показатель
степень меньше 0.
- Для ввода-вывода по умолчанию используется стандартная библиотека
iostream, если задействованы трансляторы Microsoft Visual C++ .NET,
GNU g++ 3.x, 4.x и выше
- Обеспечена компиляция в GNU g++ 4.1, кроме ассемблерных инструкций.
- 32-битный ассемблер для Visual C++ и Borland C++ Builder
(дополнительный пакет).
29.11.2006 ВЫШЛА ВЕРСИЯ 1.2 BETA PUBLIC (совместимая с Visual C++ 2005)
- Функции для проверки на простоту теперь имеют дополнительный
выходной параметр для последнего протестированного делителя или
основания SPRP. Если число доказано, как составное там будет делитель
или не прошедшая проверку основание SPRP.
- ИЗМЕНЕНИЕ: Переименована пара функций из internal версии:
FastExactSPRP() в FastSPRP(), PostExactSPRP() в PostSPRP().
- Опции для выбора алгоритма в Miller.exe.
- Расширенное тестирование Miller.exe на 1,000,000,000+ примерах.
- ИСПРАВЛЕНО: Программа сваливается после компиляции в режиме Release
под трансляторами Microsoft Visual C++ .NET, 2003 и 2005
с опцией /Ob2 (auto inline).
05.09.2006 ВЫШЛА ВЕРСИЯ 1.2 BETA INTERNAL
- Обеспечена совместимость с Visual C++ Express 2005 и другими
трансляторами, не поддерживающими старую библиотеку iostream.h.
- Подключение библиотеки iostream теперь необходимо только для
операторов ввода-вывода в соответствующие потоки. В частности,
функции преобразования числа в строку и строки в число теперь
могут применяться без подключения библиотеки iostream.
- Увеличена скорость умножения (50%) для чисел из 3 и более слов.
- Оптимизированы операции накопления += и -=. В дополнение к более
эффективному коду C, на них также распространяется ассемблерная
оптимизация.
- Более гибкие методы проверки на простоту с оптимизированным
алгоритмом. SPRP() и факторизация работают примерно в 2 раза
быстрее для модулей > 7919.
- ИЗМЕНЕНИЕ: Функция HasFactor() переименована в TestFactor().
Чтобы вернуть имя, определите макро _CBIGNUM_HASFACTOR.
- ИЗМЕНЕНИЕ: Ненулевые коды возврата функций SPRP() и IsPrime().
- ИЗМЕНЕНИЕ: Для использования операторов потокового ввода-вывода
надо подключить новый файл Cbignums.h. Файл Cbignums.h
теперь не подключает библиотеку iostream.
- ИЗМЕНЕНИЕ: Вывод отрицательных чисел с модификаторами hex и oct
теперь выполняется со знаком. Если требуется вывод без
знака, то используйте функцию cBigUnsign() или проводите
трансляцию с макро _CBIGNUM_UNSIGN_OCT_HEX.
- ИЗМЕНЕНИЕ: Методы и функции класса осуществляют вывод на консоль
через специальные потоки cTTY, см. раздел 3.2.
По умолчанию вывод отключен.
- ИЗМЕНЕНИЕ: Статические методы lastdivmod() и lastrootrm() подлежат
исключению в версии класса 2.0. Используйте вместо
них методы setdivmod() и setsqrtrm().
- ИЗМЕНЕНИЕ: Метод erange() выводит короткий дамп числа вместо полного.
- ИЗМЕНЕНИЕ: Метод bits() теперь возвращает значение long вместо int,
при переполнении вызывает erange().
- Новые методы setbits(), exbits(), setexbits(), words(), exwords().
- Новые конструкторы и методы cBigAbs(), abs(), setabs(),
cBigUnsign(), unsign(), setunsign().
- Генератор случайных чисел: конструктор cBigRandom(), метод setrandom(),
long-функции в Random3.h и Random3.cpp.
- Новые методы submul(), submultab().
- Методы setdivtab(), setmodtab(), setdivmodtab() теперь не требуют,
чтобы делимое было нормализованным.
- Оптимизировано умножение длинных чисел (более 480 слов) на
короткие числа (1 или 2 слова).
- Небольшая оптимизация деления для очень длинных чисел.
- Разрешено возведение в степень чисел размером более INT_MAX бит.
- ИСПРАВЛЕНО: Реализация метода dump() зависит от разрядности процессора.
- ИСПРАВЛЕНО: Ошибки при работе с ненормализованными нулями.
- ИСПРАВЛЕНО: Маловероятные ошибки при диагностике нехватки ресурсов
для выполнения левых сдвигов и возведения в степень.
- Новая версия Arifexp.exe:
Ключи -div0, -size, -v, -rep n, -rand 0, -rand all.
Добавлены операции ++a, --a, a-b*c, удалены операции a+b\c, a*b%c.
Суффикс R для подстановки случайного числа с заданным числом бит.
Ключ -check теперь проверяет результат всех операций,
кроме степени с показателем, отличным от 2,4,8.
- Дополнительные тесты в Arifrand.bat.
- Тест генератора случайных чисел Arifr.bat.
26.11.2005 ВЫШЛО ОБНОВЛЕНИЕ ВЕРСИИ 1.1a BETA PUBLIC
- Файлы Random.h and Random.c переименованы в Random3.h и Random3.c.
- ИСПРАВЛЕНО: Неправильная таблица факторизации в Prime.cpp (Nicolas).
- ИСПРАВЛЕНО: Метод b_SPRP() возвращает "возможно, простое" на четных числах (Nicolas).
12.11.2005 ВЫШЛО ОБНОВЛЕНИЕ ВЕРСИИ 1.1a BETA PUBLIC
- Ассемблерный код теперь распространяется в дополнительном пакете.
- Тестовые программы собраны под компилятором Visual C++ 6.0 с ассемблерной оптимизацией.
- Тесты производительности для различных процессоров в разделе 4.2.
- Новые оценки производительности в разделе 4.2.2.
- ИСПРАВЛЕНО: Метод setneg() не обращает знак числа LONG_MIN.
- ИСПРАВЛЕНО: Ошибка распределения памяти в шаблоне Exarray.h.
31.10.2005 ВЫШЛО ОБНОВЛЕНИЕ ДОКУМЕНТАЦИИ ДЛЯ ВЕРСИИ 1.1a BETA PUBLIC
- Подробнее описаны особенности выполнения операций над беззнаковыми числами и числами с плавающей точкой.
- Документирован метод expand() для распределения памяти.
- Более подробное описание метода code().
28.09.2005 ВЫШЛО ОБНОВЛЕНИЕ ВЕРСИИ 1.1a BETA PUBLIC
- ИСПРАВЛЕНО: Возведение в степень по модулю выдает 1, если старшее слово модуля равно 0 (Александр).
- Примеры команд для компиляции под Linux в разделе 3.
12.09.2005 ВЫШЛА ВЕРСИЯ 1.1a BETA PUBLIC
- ИСПРАВЛЕНО: Знак результата возведения в степень по модулю теперь не зависит от знака модуля.
ВНИМАНИЕ: Проверьте, что ваши программы на зависят от этой ошибки в спецификации!
- ИСПРАВЛЕНО: Операция возведения в степень по модулю теперь корректно работает для отрицательной базы.
- ИСПРАВЛЕНО: Ошибка распределения памяти при возведении в степень по отрицательному модулю со старшим словом 0x80000000.
- ИСПРАВЛЕНО: Ошибка распределения памяти при возведении в степень по модулю 0, если разрешено деление на 0.
- ИСПРАВЛЕНО: Ошибка распределения памяти в отладочном режиме при умножении двух длинных (больше 480 слов) отрицательных чисел со старшими словами 0x80000000.
- ИСПРАВЛЕНО: Ошибка assert в отладочном режиме setdivtab(), setmodtab(), setdivmodtab() при делении отрицательного числа на 0.
- ИСПРАВЛЕНО: Операции сдвига переписывают cBigNumber::lastdivmod если количество бит задано неограниченным числом.
- ИСПРАВЛЕНО: Ошибка переполнения разрядной сетки при извлечении квадратного корня из чисел размером более INT_MAX бит.
- ИСПРАВЛЕНО: Описание аргумента n в методе addmultab (a,b,n).
- Исправления в разделе 1.2 и дополнения в разделе 4.2.3 документации.
- Пополнен список ошибок в Приложении 2, включая проблему с реентерабельностью.
Написать ответ