Здравствуйте, temik, Вы писали:
T>как сделать сабж на С? слишком много знаков получается,а куда такое большое число писать? ни в один тип не влезешь, а надо
Здравствуйте, temik, Вы писали:
T>как сделать сабж на С? слишком много знаков получается,а куда такое большое число писать? ни в один тип не влезешь, а надо
Про умножение столбиком слышал?
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, temik, Вы писали:
WH>>Про умножение столбиком слышал? T>Слышал, только как его реализовать на асме?
Обязательно на асме? Замучаешься.
А идея простая. Число хранится как массив чисел 0 <= a[n] < 10^m. Все число А = sum(a[i]*10^(m*i).
Т.е. это просто запись числа впозиционной системе счисления по основанию 10^m. В принципе основание можно выбрать и другое, но с этим удобно осуществлять вывод.
Алгоритмы для арифмитических действий кроме деления — тривиальные, справится школьник ( проверено! ). Деление тоже тривиально, но школьник может и затормозить.
Читать Кнута, есть на lib.ru. Так же нечто есть на algolist, но я не смотрел.
Здравствуйте, Рома Мик, Вы писали:
WH>>>Про умножение столбиком слышал? T>>Слышал, только как его реализовать на асме?
Надо думать, поскольку в соседнем топике temik — а речь идет об RSA, то имеется в виду возведение в степень по некоему модулю.
Простейший алгоритм модульного возведения в степень:
на входе
g — число
e — степень
m — модуль
на выходе
g ^ e mod m
1. A = 1, S = g
2. while( e != 0 )
2.1 if e нечетное A = ( A * S ) % m
2.2 e = e / 2
2.3 if( e != 0 ) S = S * S % m
3. return A
при этом разрядность результатов промежуточных умножений не вылезает за m^2 — 2.
так что если m <= 2^16 то все операции прекрасно можно производить в 32-х битных регистрах.
Здравствуйте, temik, Вы писали:
T>как сделать сабж на С? слишком много знаков получается,а куда такое большое число писать? ни в один тип не влезешь, а надо
Попробуй через строку, или несколько строк записать результат
Здравствуйте, Рома Мик, Вы писали:
РМ>Здравствуйте, temik, Вы писали:
WH>>>Про умножение столбиком слышал? T>>Слышал, только как его реализовать на асме? РМ>Алгоритмы для арифмитических действий кроме деления — тривиальные, справится школьник ( проверено! ). Деление тоже тривиально, но школьник может и затормозить.
Ой, надо же в степень возводить.
Ну, собственно, надо считать экспоненту, логарифм... Кой-какие алгоритмы есть на algorithm.narod.ru. Конкретно экспонента algorithm.narod.ru/el/sicoex.html.
Еще целочисленное возведение в степень ( можно и по модулю ): на каждом шаге домножаем наше число само на себя, так что получаем вначале a^2, потом a^4, потом a^8 и т.д. и иногда домножаем наш результат на текущее число. Например если надо a^10, то получим a^10 = a^2 * a^8. Т.е. надо подобрать сумму разных степеней двойки, чтобы получилась нужная степень. Нетрудно догадаться, что домнажать надо когда установлен соответствующий бит двоичного представления искомой степени. В моем примере 10 = 1010b, а степени такие a^1, a^2, a^4, a^8.
Здравствуйте, desperado_gmbh, Вы писали:
DK>>так что если m <= 2^16 то все операции прекрасно можно производить в 32-х битных регистрах.
_>m <= 2^16 для RSA интереса не представляют
Все вопросы к преподу. Это он так temik-у делать велел
Здравствуйте, temik, Вы писали:
T>как сделать сабж на С? слишком много знаков получается,а куда такое большое число писать? ни в один тип не влезешь, а надо
Рекомендую посетить GNU MP. Там есть библиотека работы с числами (большими). Можно или использовать саму библиотеку или посмотреть как там реализованы все необходимые тебе вещи.
Здравствуйте, WeCom, Вы писали:
WC>Рекомендую посетить GNU MP. Там есть библиотека работы с числами (большими). Можно или использовать саму библиотеку или посмотреть как там реализованы все необходимые тебе вещи.
Так ему ведь не нужно больших чисел! У него модуль<=999! Это все делается без длинной арифметики