Страница 1 из 1
Работа БОЛЬШИМИ числами.
Добавлено: 16 дек 2006, 13:57
oif
Есть ли ограничения в разрядности числа для 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;
Короче как получить остаток от деления?
Какие типы и функция надо взять подскажите?
Re: Работа БОЛЬШИМИ числами.
Добавлено: 18 дек 2006, 09:22
somewhere
" писал(а):работает и с большими числами,но как вычислить mod n ,с вещественым числом если не получается выделить целую часть или преравнять к целому.
Напомню, что X mod A = X - int(X/A)*A; Int - стандартная функция взятия целого числа.
Re: Работа БОЛЬШИМИ числами.
Добавлено: 18 дек 2006, 12:48
LAngel
По прежнему рекомендую библиотеку libeay32.dll для работы с большими числами.
Конечно работы побольше, но зато точность и размер чисен - неограничены.
Re: Работа БОЛЬШИМИ числами.
Добавлено: 18 дек 2006, 18:01
oif
LAngel писал(а):По прежнему рекомендую библиотеку libeay32.dll для работы с большими числами.
Конечно работы побольше, но зато точность и размер чисен - неограничены.
Мне надо самому разобраться,такое вот задание по теории чисел.
Re: Работа БОЛЬШИМИ числами.
Добавлено: 18 дек 2006, 18:14
oif
somewhere писал(а):Напомню, что X mod A = X - int(X/A)*A; Int - стандартная функция взятия целого числа.
Огромное человеческое спасибо.
Re: Работа БОЛЬШИМИ числами.
Добавлено: 18 дек 2006, 19:18
oif
Так теперь другая проблема.Сколько погрешность в вычислениях при таком методе?
У меня маленькие числа сходятся а большие нет,хотя должны.
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;
Re: Работа БОЛЬШИМИ числами.
Добавлено: 21 дек 2006, 20:45
oif
Так что не у кого не каких соображений?
Уже несколько дней бьюсь,так и не разобрался.
Если кто может помогите.
Re: Работа БОЛЬШИМИ числами.
Добавлено: 22 дек 2006, 05:38
Oleg_Rus
Я ВОТ ЧИТАЛ КНИГУ Окулова, он предлагает поступать так:
1. во ввходном файле имеется число превосходящее Int64
2. читаем его как строку
3. единицы заносим в а[1], десятки - a[2], и т.д. и т.п. в a[0]- кол-во разрядов(число эл-ов массива);
4. и дальше разбрасывать все, так ведь проще, сам пытался - все пашет...