Работа БОЛЬШИМИ числами.

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

Есть ли ограничения в разрядности числа для mod и trunc
var 1)k:int64 2)k:real48;
m,e:integer;
m:=17;
e:=20;
1)k:=trunc(intpower(m,e));//не работает вышибает(до m:=7 работает).
2)k:=power(m,e)//работает и с большими числами,но как вычислить mod n ,с вещественым числом если не получается выделить целую часть или преравнять к целому.
Хотя если я не ошибаюсь int64>real48;Все дело в trunc?
Мне надо чтобы работало следующие.
m=1-35
e=1-35
(т.е m^e = от 1 до 4,26165551145561E30 )
k:=m^e mod n;
Короче как получить остаток от деления?
Какие типы и функция надо взять подскажите?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):работает и с большими числами,но как вычислить mod n ,с вещественым числом если не получается выделить целую часть или преравнять к целому.
Напомню, что X mod A = X - int(X/A)*A; Int - стандартная функция взятия целого числа.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

По прежнему рекомендую библиотеку libeay32.dll для работы с большими числами.
Конечно работы побольше, но зато точность и размер чисен - неограничены.
С уважением, Lost Angel...
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

LAngel писал(а):По прежнему рекомендую библиотеку libeay32.dll для работы с большими числами.
Конечно работы побольше, но зато точность и размер чисен - неограничены.
Мне надо самому разобраться,такое вот задание по теории чисел.
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

somewhere писал(а):Напомню, что X mod A = X - int(X/A)*A; Int - стандартная функция взятия целого числа.
Огромное человеческое спасибо.
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

Так теперь другая проблема.Сколько погрешность в вычислениях при таком методе?
У меня маленькие числа сходятся а большие нет,хотя должны.

function pow(a,k,n:extended):extended;
var b:extended;
begin
b:=1;
while k<>0 do begin
if trunc(k) mod 2=0 then begin
k :=trunc(k) div 2;
a:=(a*a)-int(a*a/n)*n;
end
else begin
k:=k-1;
b:= (b*a)-int((b*a)/n)*n ;

end;
end;
pow:=b;
end;

Пример как получается pow(2,293427085667,712955907329)=121086078976
pow(121086078976,1261737803,712955907329)=31024545792 а должно быть 2
Пример pow(2,7,33)=29;
pow(29,3,33)=2
Большие числа сгенерированы по этому же принципу(алгоритм шифрования RSA)
Так что должны сходится.
Работает также с pow(33,497607727,2701020011)=2693596517;
pow(2693596517,1967851663,2701020011)=33;
oif
Сообщения: 42
Зарегистрирован: 09 ноя 2006, 21:03

Так что не у кого не каких соображений?
Уже несколько дней бьюсь,так и не разобрался.
Если кто может помогите.
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

Я ВОТ ЧИТАЛ КНИГУ Окулова, он предлагает поступать так:
1. во ввходном файле имеется число превосходящее Int64
2. читаем его как строку
3. единицы заносим в а[1], десятки - a[2], и т.д. и т.п. в a[0]- кол-во разрядов(число эл-ов массива);
4. и дальше разбрасывать все, так ведь проще, сам пытался - все пашет...
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Ответить